v1.76.0 (2026-09-27)
Release Highlights
Before upgrading: back up
scrutiny.db. The first start runs a one-time migration that deletes duplicate settings rows, keeping the most recent value of each key. SQLite stays the default; PostgreSQL is opt-in.
- Add optional PostgreSQL backend (#899) - Fixes #880, Fixes #888, Fixes #889
- Full setup guide: docs/POSTGRESQL.md.
- New web.database.type: postgres with web.database.dsn. It works through pgbouncer in transaction mode, since no prepared statements are used.
- New scrutiny db import-sqlite --from moves an existing SQLite install to PostgreSQL.
- With several replicas, one replica holds a lease and runs the monitors, the report scheduler, and notification delivery. Other replicas record their notifications in an outbox table that the leader drains. A report run is claimed before it is sent, so it goes out once.
- Quiet-hours notifications are now stored in the database, so they survive a restart.
- The health check reports the configured database (sqlite or postgres).
- Fix (#888): the heartbeat setting of a new notification URL is now saved as entered. Before, a new URL saved with heartbeat off was stored with heartbeat on. After upgrading, check the heartbeat toggle on each notification URL.
- Fix (#889): the settings table now keeps one row per key and enforces it with a unique index. The migration removes existing duplicates.