Repository navigation
Not breaking. Two new capabilities and shorter docs.
Update steps
uvx copier update --truston a clean tree.- Run
uvx prek run --stage pre-push --all-filesand commit what it rewrites.backend/openapi.jsonis no longer merged by an update; the OpenAPI hook rewrites it. - With Postgres, the next deploy applies
template_0003(therate_limit_scopestable) throughalembic upgrade heads. Nothing to do by hand.
What's new
- Rate limits shared across replicas: with Postgres, request budgets live in an
UNLOGGEDtable, so two API processes admit one budget, not two. If Postgres does not answer, each process limits on its own until it does. A check adds about 0.9 ms at p50. Without Postgres nothing changes. (#16) - Object storage: optional
include_object_storage(Postgres only, off by default). Uploads go straight to an S3-compatible bucket through presigned URLs and are checked before they are kept. With accounts, files belong to the signed-in account; without accounts there are no file routes, only CLI commands. A local bucket server runs in compose for development only. (#17) - Option routers are registered in
app/option_routers.py, so turning an option on later does not conflict with an app's own routers inmain.py. (#17) - Docs: shorter READMEs, a "What it's for" section, and the first-push steps moved to one paragraph in
AGENTS.md. (#15)
Known gaps
- Still one
apiservice in the deploy: the limiter removes the blocker for a second replica butdeploy.shhas no replica count. - Object storage was not run against a hosted bucket.
- An app with object storage and no accounts that turns accounts on later needs its own revision for the owner column.