A multi-tenant, department-aware platform for council services. The same codebase serves multiple departments (Children's Social Care, Adult Social Care, Housing, etc.) with navigation, templates, and behavior driven by configuration rather than code forks.
The root repository is the only local git context. universal-app/ is the canonical web frontend, apps/mobile/ is the canonical mobile app, and minute-main/frontend/ is a frozen legacy reference used only for parity checks and migration planning. Docker files still exist for legacy infrastructure, but Docker is not the canonical local development workflow anymore.
| Path | Purpose | Status |
|---|---|---|
universal-app/ |
Production Next.js 16/React 19 web app | ✅ Canonical Frontend |
minute-main/backend/ |
FastAPI backend | ✅ Production |
minute-main/worker/ |
Ray background workers | ✅ Production |
apps/mobile/ |
React Native/Expo mobile app | ✅ Canonical |
packages/core/ |
Shared TypeScript (config, modules, storage) | ✅ Shared |
packages/ui/ |
Shared UI components | ✅ Shared |
config/ |
Tenant/department YAML configs | ✅ Production |
minute-main/frontend/ |
Legacy web frontend (read-only reference) | 🧊 Frozen |
Add a new department without code changes:
# config/wcc_housing.yaml
id: "wcc_housing"
name: "Westminster Housing Services"
service_domain: "housing"
modules:
- id: "recordings"
enabled: true
label: "Property Visits"
navigation:
- label: "Properties"
href: "/cases"
icon: "Building2"
roles: ["housing_officer"]
retentionDaysDefault: 1095pnpm installpnpm dev:webpnpm lint:web
pnpm test:web
pnpm build:webpnpm dev:mobile
pnpm typecheck:mobilecd minute-main
poetry install --with dev --without worker
QUEUE_SERVICE_NAME=noop STORAGE_SERVICE_NAME=local poetry run uvicorn backend.main:app --reload --port 8080cd minute-main
poetry run pytest tests/test_health.py tests/test_export_handler_service.py tests/test_cost_guard.py tests/test_security_headers.pycd minute-main
poetry install --with dev,worker
QUEUE_SERVICE_NAME=noop STORAGE_SERVICE_NAME=local poetry run python worker/main.pyUse a locally installed PostgreSQL instance on the MacBook as the canonical non-Docker database dependency. Docker Compose is legacy-only and should not be the default setup path for new work.
cd minute-main
poetry run pytest tests/test_health.py tests/test_export_handler_service.py tests/test_cost_guard.py tests/test_security_headers.pyscripts/setup-frontend.sh— install the root pnpm workspace and run the canonical web buildscripts/dev-frontend.sh— start the canonical web frontend from the root workspacescripts/check-openapi-drift.sh— regenerate theuniversal-appOpenAPI client and check for drift without discarding local edits
# Uses the static backend spec by default:
pnpm openapi:web
# Override input when needed:
OPENAPI_TS_INPUT=./minute-main/openapi-temp.json pnpm openapi:webAGENTS.md— AI/Codex coding rules and architecture guardrailsCHANGELOG.md— canonical change log for the root repositoryPLANS.md— Long-horizon execution plan with phases 1-41ROADMAP_social_care.md— Social care delivery roadmapdocs/frontend-parity-matrix.md— migration view betweenuniversal-appand the frozenminute-main/frontend, with keep/migrate/retire decisionsminute-main/docs/universal_council_app_foundations.md— Multi-tenant architecture guideminute-main/docs/architecture.md— Technical architecture
- Do not run
npm installinside sub-packages; usepnpm installfrom the repo root - Treat
minute-main/frontendas migration-only and exclude it from new development, CI ownership, and primary setup docs - Treat Dockerfiles, Compose files, and image-build workflows as legacy infrastructure until they are removed or archived
- Navigation is config-driven via
/api/modulesendpoint - Users see ONLY modules for their
service_domainandrole - No council/department-specific code forks allowed
- Follow AGENTS.md for all development