First half of #35 lands: the hub can now monitor other boxes too. Agentless — just an SSH key and Python 3 on the remote.
Highlights
- Host pill bar at the top of every page — Local + each registered remote. One click switches the active host across the whole dashboard.
- Overview tab is now the All-hosts fleet table — every box's CPU + cores, RAM % + GB, GPU util + VRAM, load, uptime, temp, top disks, refreshed every 10 s. Click any row to focus that host.
- Hosts tab — onboarding wizard with 🔍 Scan LAN suggestions, inline ✎ edit, and a real Test connection that checks SSH /
/proc/ Docker socket / systemd D-Bus /nvidia-smiseparately, with OS-aware remedies per row (Alpine vs Debian/RHEL/SUSE/Arch vs macOS). - ▶ Run on remote button on every actionable remedy — if
sudois needed, an inline panel asks for the password with a clear "used once, not stored, never in argv" note and streams output back. - Host and Services tabs now work for any registered remote, not just local.
- Capability-aware "why empty" notices on tabs that are still local-only — instead of a generic "local-only", you see e.g. "cloudy has no NVIDIA GPU" or "Docker is not installed on cloudy", read from the host's own Test result.
How it works (very briefly)
The hub pipes a small probe.py (pure stdlib) through SSH on every poll cycle: ssh user@host python3 -. The remote runs it, prints one JSON blob, exits — nothing persists on the remote. The hub caches results per host and the UI reads from /api/fleet and /api/host_data/<name>.
Security posture
- Pubkey auth only, passwords disabled. The hub generates its own ed25519 key on first boot under
/data/.ssh/(persists across rebuilds). - Per-host SSH timeouts so a slow remote can never block the polling loop.
- Sudo password handling for Run-on-remote: piped via the local subprocess's stdin → ssh's encrypted channel →
sudo -S -p ''on the remote. Never in any process's argv, never persisted to SQLite, never written to logs.
What's not yet in this slice
Per-host GPU / Containers / AI Models data collection, per-host history charts, and the topology view from the Issue #35 design. Slated for the next releases; the tabs concerned already tell you precisely why they're empty for non-local hosts based on each host's capability check.
Upgrade
cd <your-clone-dir>
git pull
docker compose pull
docker compose up -dOr if you're new to it:
curl -fsSLO https://raw.githubusercontent.com/SikamikanikoBG/homelab-monitor/main/docker-compose.yml
docker compose pull
docker compose up -dOpen http://<your-host-ip>:9800, head to the Hosts tab, and follow the wizard to register your first remote.
Image
Multi-arch (linux/amd64, linux/arm64) on Docker Hub:
sikamikaniko123/homelab-monitor:0.8.0 · also 0.8 and latest.