v0.54.0
Changed
- The app no longer needs a Postgres superuser — and there is no superadmin. Fresh docker-compose installs create a least-privilege
app_provisionerrole (migrations + guild provisioning only) at first database init — in superuser context, where Postgres 15/16's privilege model requires role bootstrap to live — and pointDATABASE_URLat it from the start. Existing deployments runbackend/scripts/create-provisioner.sqlonce and switchDATABASE_URL; staying on a superuser keeps working but logs a boot warning. The internal superadmin flag is gone: the system database role follows PostgreSQL's standard trusted-batch model (bounded by explicit per-table grants — new tables give it nothing by default), background jobs and maintenance sweeps route into each guild under that guild's own scoped role, and the request-path role holds only the minimal shared-table access the sign-in and account-security flows use. The whole posture (role attributes, per-table access, row security) is verified by automated tests on every CI run.FIRST_SUPERUSER_*settings are renamedFIRST_OWNER_*(old names still accepted). - Per-request database context is now transaction-scoped. The assumed role and tenancy variables die with each transaction and are re-applied automatically at the start of the next one, eliminating the stale-context-on-pooled-connection bug class and making transaction-mode connection poolers (PgBouncer ≥ 1.21) safe in front of the app — backend CI now runs the whole suite through one to keep it that way. Authorization snapshots held past a freshness bound now fail closed instead of executing on revoked access.
- Database migration history squashed to a v0.53.5 baseline. Fresh installs build the shared schema from a single baseline plus a
guild_templateschema, and never create the legacy public copies of guild content (tasks, projects, documents, …) — guild data lives only in per-guild schemas; existing deployments keep their frozen legacy copies untouched. Platform endpoints (/users/me, login/registration, platform admin) no longer read guild content —initiative_rolesis populated only by guild-scoped endpoints. Guild-schema migrations are now autogenerated against a live template (scripts/gen_guild_migration.py) instead of hand-written, removing a class of drift. - Faster boots on large installs: guild schemas already built by the current version are skipped by the startup sweep (set
FORCE_GUILD_BACKFILL=truefor a one-off full sweep). - Upgrade note: deployments running a version older than v0.53.2 must upgrade to any v0.53.x release and boot it once before upgrading to this version. The app refuses to start (with instructions) if the database is older.
Removed
- Support for in-place upgrades from versions older than v0.30.0 (the
upgrade-to-baseline.sqlhelper is gone; it remains available in older release tags). Upgrades from v0.30.0+ still step through a v0.53.x release as before. - The one-time schema-per-guild startup data conversion (every deployment that can cross the v0.53.x floor has already converted).
Downloads
Android App
No new app build this release — installed apps update automatically over the air on next launch.
Docker Image
docker pull morelitea/initiative:0.54.0Or use latest tag. View on Docker Hub.