§1The problem
There was a lot of automation (scheduled jobs, apps, alerts and emails, a rented AI server) and no single view of whether it was working. “Ran without errors” doesn't mean it delivered.
§2What I built
- ChecksEvery 5 minutes (or with the “Check now” button), in four groups: scheduled jobs, alerts and emails, automations and system (cloud GPU, private network, disk) and apps.
- HistoryCurrent state and history of status changes, stored in a file.
- ExtensibleEach check is a file that returns a list of results with a fixed id, easy to add to.
§3The hard parts
4 entries- 01
Measuring delivery, not execution
Reads, read-only, the trail each app keeps of what it sent.
- 02
Testing each app for real
Finds where each app actually listens and tests it over HTTP, to catch an app that is “online” but not answering.
- 03
Cost alert
Warns when a rented AI machine is running.
- 04
A known, documented limit
One app marks a send as done even when the push service refuses it, so the dashboard only says “delivery not confirmed”.
§4Result
Running on my home server, available on my private network. Next steps: smart-home integration and alerts outside the dashboard (phone, email).
§5Stack
- Next.js 16
- React 19
- TypeScript
- Tailwind 4
- systemd (timers)
- pm2
- Tailscale
- RunPod API
- Read-only SQLite (node:sqlite)