Changelog
v0.5.3
Released 9 May 2026.
Schedules start firing. The agent is pinned to a database.
Agent
Added
- AddedHeartbeat dispatch: pending jobs are parsed from the heartbeat response and run through the worker pool. No long-poll, no side channel.
- Added
run_probecommand handler for live database-connectivity checks; the dispatcher maps it through the same lifecycle as backup and restore. - Added
--log-levelflag with debug-level wire tracing for heartbeat and/config. - AddedSOPS-managed key material for builds; the published binary registry is now sourced from a static-musl bash matrix.
Changed
- Changed
/configwire shape:expected_postgres_version→postgres_major(nullable). The probe-result contract carries the detected major back.
Control plane
Added
- AddedSchedule firing wired end-to-end.
Schedulerows synchronise into the django-q2 scheduler on signal, a boot check refuses to start if the two have drifted, a scheduler heartbeat gates/readyzfor the first three minutes, and a missed-fire detector flips staleQUEUEDruns so the next cron tick can pick them up. - AddedCron →
Jobdispatch and pending-jobs in the heartbeat response. - AddedAgent ↔ database pinning. Each database is pinned to a single agent in its organisation. The dispatcher refuses to send work to any other agent, and
/confignarrows to the agent's pinned databases only. - AddedOn-demand “Run backup now” from the database detail page, async, with a flash, hidden until the pinned agent has been heard from.
- AddedFirst-run welcome pages on databases, agents, backups, and storage when an organisation has no rows yet, with the next CTA inside the empty-state hero.
- AddedRedesigned backups list and detail: window / outcome / database facets, cross-field search, fixed-layout responsive rows, and a presigned download link for the encrypted object.
- AddedNewsreader / Inter / JetBrains Mono self-hosted across the console, theme-aware wordmark and favicon on every page, and the canonical overview dashboard built from real organisation data.
Fixed
- FixedUser-defined schedules that never fired because of a stale
next_runand a leftover second cluster. Q2 is collapsed to one cluster, and Schedule changes drive the row directly. - FixedEmpty-list pages no longer issue duplicate queries; an
EXISTS-first short-circuit short-circuits the empty case.