# Development Setup ## MVP Runtime Path The current MVP runtime path is the legacy Django host/player UI with `USE_SPA_UI=false`. ## Docker Compose The fastest MVP path is the legacy UI with MySQL and Redis behind Django: ```bash docker compose up --build ``` App URLs: - `http://localhost:8000/admin/login/` - `http://localhost:8000/lobby/ui/host` - `http://localhost:8000/lobby/ui/player` Compose uses `infra/env/.env.dev.example` and overrides `DB_HOST`/`CHANNEL_REDIS_HOST` inside containers so the same file also works for host-side commands. If port `8000` is already in use, run with `APP_PORT=18000 docker compose up --build` and use `http://localhost:18000/...` instead. The app container now waits for the database and Redis endpoints before running migrations, so transient Docker DNS startup races do not kill the local stack. ## Bootstrap Create deterministic demo credentials and sample questions with: ```bash docker compose exec app python manage.py bootstrap_mvp ``` Default output: - host username: `demo-host` - host password: `demo-pass` - category slug: `general` - questions: `3` You can override the host/category names with `--username`, `--password`, `--category-slug`, and `--category-name`. For a quick seeded regression flow, run: ```bash docker compose exec app python manage.py smoke_staging --artifact /tmp/wpp-smoke.json ``` That creates `smoke-host` / `smoke-pass`, ensures one active smoke question exists, and exercises one full round. Use `bootstrap_mvp` for the reusable local try-out account. ## Local MVP Smoke For a one-command local MVP proof, run: ```bash ./scripts/run_local_mvp_smoke.sh ``` That starts the compose stack, waits for `/healthz`, runs `bootstrap_mvp`, executes `smoke_staging`, and writes a JSON artifact under `artifacts/local/`. If port `8000` is busy on your machine, use `APP_PORT=18000 ./scripts/run_local_mvp_smoke.sh`. By default the stack stays up after the smoke so you can continue in the browser. Use `KEEP_STACK_RUNNING=0` if you want the script to shut the stack down on exit. ## Release Gate Run the full local MVP release gate with: ```bash ./scripts/verify_mvp_release.sh ``` That runs repo lint, shared i18n drift checks, Django checks/tests, both frontend test/build pipelines, and a `docker compose config` sanity pass. ## Optional SPA Shell To serve the Angular shell as the UI path instead of the legacy templates: ```bash USE_SPA_UI=true docker compose --profile spa up --build ``` Use these entry points: - `http://localhost:4200/` for the SPA landing page with host login, host session creation, and player join - `http://localhost:4200/host?session=ABC123` for the host shell after a session exists - `http://localhost:4200/player?session=ABC123` for the player shell after join - `http://localhost:8000/lobby/ui/host` and `http://localhost:8000/lobby/ui/player` if you want Django to render the SPA shell with `USE_SPA_UI=true` The raw SPA container serves the compiled Angular app at `/` and also proxies `/accounts/*`, `/lobby/*`, and other Django endpoints back to `http://localhost:8000`. `WPP_SPA_ASSET_BASE` still points at `http://localhost:4200/browser` because Django-rendered SPA pages load their static bundles from the compiled Angular `browser/` directory.