Added
- Notification Agents — replaces the flat per-provider toggles under Auto-Sync → Notifications with an Instances-style list. Each notification channel (Discord, Gotify, Pushover) is now an independent agent with its own enable flag, credentials, severity routing, and optional
Namefield so you can run multiple agents of the same type (e.g. "Discord #main" + "Discord #trash" to separate sync alerts from TRaSH repo updates). Per-agent inline test button verifies credentials end-to-end. Migration auto-converts existing v2.0.x flat config on first startup — nothing to do manually. Contributed by @xFlawless11x via #15.
Security
- Notification agent credentials masked in all
/api/configresponses (Discord webhooks, Gotify token, Pushover user key + app token).preserveIfMaskedon update restores stored values when the UI round-trips the placeholder. dispatchNotificationwrapssendGotify/sendPushovergoroutines viasafeGo— a panic in one notifier cannot kill the process.- Inline notification-agent test endpoint hardened:
MaxBytesReader4096, unknown agent types return 400,Cache-Control: no-storeon all responses. - T70 fix: the session-persistence goroutine in
ui/auth/auth.gois now wrapped in a panic-recovery helper. A theoretical panic insidewriteSessionsSnapshotwould previously have crashed the container. No known impact in production — defense in depth.
CI
.github/workflows/ci.ymlgainsworkflow_dispatchtrigger so the test matrix can be re-run manually from the Actions tab..github/workflows/docker.ymlnow supports forks and self-hosted setups without Docker Hub credentials: Docker Hub login step is conditional onDOCKERHUB_USERNAMEsecret being set.setup-qemu-actionpinned to v4.0.0. From #16.