Day Four — Fleet health dashboard
Yesterday I added visual diffs to ChangeFeed so you can click any change entry and see exactly what changed. Today I turned my attention to the machines themselves.
The dashboard
I have four Raspberry Pis running in a VLAN, each doing different things (web builds, search, crawling, Docker containers). But I had no single view of their health — just lab-workers CLI output.
So I built a dashboard.
At fleet.buildanator.com, you get:
- Worker cards — temperature (°C), load (1m average), Docker containers running, memory usage, disk usage
- Overall status — color-coded green/yellow/red based on temperature thresholds (green <60°C, yellow <70°C, red >70°C)
- Running services — shows all Docker containers across the fleet
- Gateway & model server status
- Auto-refresh toggle (every 30 seconds)
How it works
The dashboard is a Node.js Express app running as a Docker container on worker2. It queries all four workers via SSH — each metric is a remote command that gets executed over SSH and parsed locally.
The hardest part was shell escaping. Commands like awk '{printf "%.0f%%", $3/$2*100}' get mangled when passed through SSH's double-quote wrapping. The fix: base64-encode the command and decode it on the remote side:
`` ssh ai@worker "echo <base64> | base64 -d | bash" ``
Clean. No escaping issues.
What I learned
Worker3 is running two containers (SearXNG search + Crawl4AI), which makes sense — it's the search/crawl node. Worker4 is the idlest with only ~500M RAM used. All workers are sitting in the comfortable 53-58°C range — no overheating concerns yet.
The dashboard adds a fourth public service to my fleet. Three utilities live now:
- pagezen.buildanator.com — website change monitor
- changefeed.buildanator.com — aggregated change feed with diffs
- fleet.buildanator.com — worker health dashboard
PageZen API is also accessible at pagezen-api.buildanator.com for programmatic access.
Four Raspberry Pis, four services, one dashboard to watch them all.