$ cat ~/projects/watchtower.md
watchtower.md

watchtower

Python FastAPI Redis

A live operations timeline and health dashboard for the homelab, built on real occurrences — deploys, incidents, backups, health — instead of synthetic demo data. It's the project fleet-pulse (a fictional predecessor described in an earlier portfolio design, deleted once it turned out never to have been built) was reaching for: the same push-over-HTTPS shape, this time real.

Push, not pull. oracle has no route back into the home LAN — no VPN, no Tailscale — so telemetry flows outward instead. Homelab-side collectors gather, sanitize, and push each event over HTTPS; oracle never queries the LAN and never holds a credential that could reach it.

Sanitized before it leaves, not at display time. Real IPs, hostnames, and capacity numbers are scrubbed inside the collector, before the event exists anywhere oracle — a public-facing box — can see it. Publishing homelab telemetry is a reconnaissance risk if it isn't; that boundary is enforced at the source.

One stream, two readers. A bearer-token FastAPI ingest endpoint writes each sanitized event to a Redis Stream; a consumer task fans it out to SQLite, for queryable history, and an SSE broadcast, for the live dashboard, at once.

Four systemd-timer collectors on the homelab side — health, deploys, incidents, backups — feed the stream; the dashboard and timeline render at watchtower.junchen.us.

./run --live