Closes #2.
What's new
A new Alerts tab in the dashboard turns on push notifications for things the
collector already detects — no env vars, no compose edits, no restart.
- Discord — paste a webhook URL; alerts arrive as a coloured embed
(red = critical, orange = warning). - ntfy.sh — set a topic (and optionally a self-hosted ntfy server); alerts
arrive with severity-based priority and tags. - Either channel can be used; both are optional. A Send test alert button
verifies the wiring end-to-end.
Events that fire (all already computed today)
- 🔴 Container unhealthy / exited non-zero / dead
- 🔴 systemd unit failed
- 🟠 GPU VRAM pressure (free <
PRESSURE_FREE_MB) - 🔴 GPU OOM events (from the existing
eventstable /oom_scan) - 🟠/🔴 Disk crossing a configurable threshold (default 90 %, 95 % = critical)
Notifications are edge-triggered: one ping per state change, recovery
clears the key so the next failure re-fires exactly once. No flapping spam.
How it's stored
Settings live in the existing SQLite DB (new settings table), so they
persist across restarts and image rebuilds via the same ./data bind mount.
The Discord webhook is treated as a secret — the API only round-trips a
*_set: true/false flag, never the value.
Acceptance (from #2)
- With a Discord webhook set, a container going unhealthy or a GPU OOM posts
once, not repeatedly. ✅ - No config → no calls, no errors (plug-and-play preserved). ✅
🤖 Generated with Claude Code