# Intent Track the why behind features, across implementations. See [docs/concept.md](docs/concept.md) and [docs/plan.md](docs/plan.md). ## Local development With uv: ```sh uv sync uv run python manage.py migrate uv run python manage.py runserver ``` Or with Docker: ```sh docker compose up --build ``` Then open http://localhost:8000. Data lives in `data/` (uv) or the `data` volume (Docker). Checks: ```sh uv run ruff check . && uv run ruff format --check . && uv run pytest ``` ## Production Fly.io, one machine with a volume at `/data`. `bin/start` restores the database from B2 if the volume is empty, runs migrations, and starts gunicorn under Litestream. Secrets (`fly secrets set`): | Name | Purpose | |---|---| | `DJANGO_SECRET_KEY` | Django secret key | | `LITESTREAM_BUCKET`, `LITESTREAM_ENDPOINT`, `LITESTREAM_ACCESS_KEY_ID`, `LITESTREAM_SECRET_ACCESS_KEY` | B2 backup bucket | | `BUCKET_NAME`, `AWS_*` | Tigris uploads; set by `fly storage create` | | `SENTRY_DSN` | Optional error reporting | Restore drill: create a fresh volume, deploy, and confirm `bin/start` logs a restore before migrating.