A single dark-theme SPA that treats a multi-server homelab as a set of observable, controllable state machines. It pulls live telemetry from Dell PowerEdge servers via iDRAC Redfish, EcoFlow UPS units via MQTT, TrueNAS storage pools and datasets, and Proxmox clusters, then surfaces all of it in one place without requiring a separate console for each vendor.
The project started because managing hardware across four different vendor interfaces meant context-switching constantly and missing state changes that no single tool exposed. The dashboard does not just display data; it dispatches actions. Power operations, service restarts, and storage commands route through the same control plane that reads telemetry, so the state you see and the actions you take share a single source of truth.
At 649 commits, it is the most actively developed original project in the portfolio and the one that has absorbed the most operational incidents. The cluster it monitors has been through a Corosync self-fence event (all three nodes reset simultaneously), a TimescaleDB extension incident that took down twelve databases at once, and several rolling Patroni cluster restarts. Each incident tightened the telemetry and alerting surface.
Architecture
The backend splits into three worker processes: a collector, an executor, and an API server. The collector runs Redfish SSE listeners for each iDRAC endpoint, an MQTT subscriber for UPS state changes, and scheduled pollers for TrueNAS and Proxmox APIs. All incoming telemetry normalizes to a shared schema before it touches the database, so the API layer never has to know which hardware vendor produced a given reading.
The executor process handles action dispatch in isolation from the read path. When an operator triggers a power operation or storage command through the SPA, the request lands in the executor queue rather than blocking an API worker. A slow or hung command on a single host cannot stall dashboard reads for every other host. Actions write their status back into the same schema the collector uses, so the SPA reflects both live state and in-flight operations from the same polling interval.
The API server is a FastAPI application with async SQLAlchemy backed by PostgreSQL. TimescaleDB hypertables handle time-series telemetry, which keeps historical query performance flat as the dataset grows. Alembic manages schema migrations and runs as its own stage in the CI pipeline so a migration failure surfaces before any code is deployed.
The frontend is Vue 3 with Pinia for state and Chart.js for time-series panels. All panels update on a shared polling interval without a page reload. Pinia stores hold the last-good snapshot from each data source, so a temporarily unavailable host shows stale-but-labeled data rather than a blank panel.
The CI pipeline is one of the more complete ones in the portfolio: ruff and mypy lint gates, a pytest suite, SAST and dependency scanning, a multi-stage Docker build, the Alembic migration stage, and an SSH deploy step that only runs on the main branch after all gates pass. The pipeline produces no artifacts unless every gate is green.
The service runs as a Docker Swarm stack behind Traefik, with the frontend and API as separate services so each can be scaled or updated independently. Collector and executor processes run as singleton tasks pinned to the node that has direct access to the management network.