3.9 KiB
| title | aliases | tags | sources | created | updated | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Glance — Go-Binary Homelab Dashboard |
|
|
|
2026-04-29 | 2026-04-29 |
Glance — Go-Binary Homelab Dashboard
Glance is a lightweight, single-binary homelab dashboard written in Go. It replaces heavier alternatives like Homarr and Homepage with a ~50 MB RAM footprint. Configuration is a single glance.yml file; there is no database. The UI is tab-based, each tab containing a column layout of widgets (bookmarks, RSS feeds, iframes, monitoring, etc.).
Key Points
- Minimal resource usage — ~50 MB RAM in practice; single Go binary with no database
$includedirective merges YAML at the same mapping level — cannot be used to separate page definitions into separate files; all pages must be inlined directly inglance.yml- Monitor widgets must use internal IPs (192.168.1.x), not Cloudflare-proxied public domains — Cloudflare overhead causes widget timeouts
- qBittorrent widgets require "bypass auth for subnet 192.168.1.0/24" — otherwise widgets receive 401 and show no data
- Password minimum is 6 characters — "admin" is rejected; use "admin1" or longer
Details
Setup and Configuration
Glance runs as a Docker container with a single bind-mounted glance.yml. The recommended 5-tab layout covers: Home / Services / Energy / Media / News.
Password management uses a hash stored in the environment:
# Generate a bcrypt hash for the admin password
docker run --rm glanceapp/glance password:hash <new_password>
# Copy the output hash into ADMIN_PASSWORD_HASH in your .env file
The $include directive is commonly misunderstood — it performs a YAML merge at the same mapping level, not a file include at arbitrary depth. This means pages cannot be split into separate files and included under pages:; the full page tree must live in glance.yml directly.
Widget Gotchas
Monitor widgets and Cloudflare: Glance's monitor widgets make HTTP HEAD requests to check uptime. When services are exposed via Cloudflare proxy (orange cloud), the extra DNS resolution and TLS handshake overhead regularly causes widget timeouts — even when the service itself is healthy. Fix: use the direct internal IP (http://192.168.1.x:PORT) in monitor widget URLs.
AdGuard stats widget: The /control/stats endpoint requires Basic Auth credentials. The Glance AdGuard widget has limited auth support; if it returns errors, skip it and use a direct iframe or bookmark instead.
Energy tab: An iframe embed of a Power Cost dashboard combined with Prometheus RAPL metrics works well. Key Prometheus queries:
- CPU power:
rate(node_rapl_package_joules_total[1m])(returns watts directly — no multiplication needed; see wiki/concepts/prometheus-joules-watts-gotcha) - CPU temperature:
node_hwmon_temp_celsius
Migration from Homarr
Homarr installation is retained at /opt/services/homarr/ for rollback. Glance does not import Homarr configuration — widgets and bookmarks must be recreated manually in glance.yml. The migration is straightforward because Glance's YAML config is simpler than Homarr's SQLite-backed UI.
Related Concepts
- wiki/concepts/homarr-proxmox-integration — previous dashboard; kept for rollback; Proxmox cert trust pattern
- wiki/concepts/prometheus-joules-watts-gotcha — RAPL rate() already returns watts; don't multiply by 1000
- wiki/concepts/docker-lxc-dns-configuration — Docker containers need explicit DNS for internal domains
- wiki/homelab/_index — homelab media and infrastructure stack context
Sources
- daily/2026-04-29.md — Glance deployed as Homarr replacement; 5-tab layout;
$includegotcha; monitor widget internal IP requirement; qBittorrent 401 fix; bcrypt password hash workflow; Energy tab iframe + Prometheus RAPL metrics