---
title: "Glance — Go-Binary Homelab Dashboard"
aliases: [glance-homelab, glance-dashboard, glanceapp]
tags: [homelab, dashboard, glance, docker, self-hosted]
sources:
  - "daily/2026-04-29.md"
created: 2026-04-29
updated: 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
- **`$include` directive merges YAML at the same mapping level** — cannot be used to separate page definitions into separate files; all pages must be inlined directly in `glance.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:

```bash
# 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; `$include` gotcha; monitor widget internal IP requirement; qBittorrent 401 fix; bcrypt password hash workflow; Energy tab iframe + Prometheus RAPL metrics
