Miguel's portfolio

Projects · Software · 2026

Home lab dashboard

Example entry. A single page that shows the health of every VM and container on a Proxmox host.

SourceLive demoWrite-upTypeScriptProxmox APIDockerGrafanaWebSocketsSelf-hosting

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

  1. Polling Proxmox every five seconds is simple and cheap at this scale. A larger cluster would want the event API instead.
  2. No database. The dashboard only shows the present; Grafana keeps the history.
  3. 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.