Home lab dashboard
Example entry. A single page that shows the health of every VM and container on a Proxmox host.
Example entry: replace or delete src/content/projects/example-homelab-dashboard.md. This one is deliberately long, to test scrolling, headings, lists, quotes and code.
Why I built it
My Proxmox host runs a dozen virtual machines and containers, and checking on them meant clicking through three different web interfaces. I wanted one page I could leave open on a spare monitor that answers a single question: is everything fine?
The best dashboard is the one you never have to read closely.
What it does
- Lists every VM and container with its CPU, memory and uptime
- Turns a row amber when a service stops responding, and red after five minutes
- Pushes updates over a WebSocket instead of polling, so the page stays light
- Works on a phone, for checking from the couch
Architecture
A small Node service talks to the Proxmox API and fans updates out to connected browsers. The front end is a single static page with no framework.
// Poll Proxmox once, broadcast to everyone.
setInterval(async () => {
const nodes = await proxmox.get('/cluster/resources');
for (const client of clients) client.send(JSON.stringify(nodes));
}, 5_000);
Trade-offs
- Polling Proxmox every five seconds is simple and cheap at this scale. A larger cluster would want the event API instead.
- No database. The dashboard only shows the present; Grafana keeps the history.
- Read-only on purpose. Starting and stopping machines stays in Proxmox, where there’s an audit log.
What I learned
Most of the work was in deciding what not to show. The first version had twenty columns, and the final one has four.
What’s next
- Alerts to my phone when something stays red
- A compact mode for a 7-inch display
Thanks for reading this far. That’s the end of the long example.