Glance dashboard v2 hit GA last week and spent most of the weekend at the top of r/selfhosted. The reason isn't hard to see: most homelab startpages look like someone assembled them from spare Bootstrap components in 2018. Glance looks like someone actually cares about design, ships as a single Docker image, and configures entirely through YAML. This guide walks through a production-ready Docker Compose setup with Uptime Kuma status widgets, RSS feeds, and server stats — plus an honest comparison with Homepage so you know whether the switch is worth it.
Why Glance Dashboard v2 Now
Homepage has been the default recommendation for a couple of years — and it earns it. Service auto-discovery, a massive widget library, Docker API integration. But it has two persistent annoyances: the config schema changes frequently enough that upgrades break things, and the default theme is functional rather than attractive.
Glance takes the opposite trade. Fewer widgets, no auto-discovery, no magic — but the YAML structure is stable, the defaults look good, and the single-binary approach means there's nothing to break at startup. v2 specifically added proper widget composition (nested layouts, sidebar columns), a rewritten RSS parser that handles Atom and JSON Feed natively, and Uptime Kuma's status page API as a first-class widget type.
If your dashboard is mostly "show me what's up and what's new", Glance v2 is worth thirty minutes of your time.
Docker Compose Setup
Glance ships as a single binary and a single image. The config lives in one YAML file. That's it.
Create a project directory and drop in a docker-compose.yml:
services:
glance:
image: glanceapp/glance:v2
container_name: glance
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- ./glance.yml:/app/glance.yml:ro
- /etc/localtime:/etc/localtime:roNo environment variables required. No database. The /etc/localtime mount ensures relative timestamps ("2 hours ago") use your server's timezone — the docs don't mention this, but you'll notice it immediately if you skip it and your RSS items start showing oddly offset times.
Now create glance.yml. Everything goes in here:
server:
port: 8080
theme:
background-color: 240 8 9
primary-color: 217 92 83
contrast-multiplier: 1.2
pages:
- name: Home
columns:
- size: small
widgets:
- type: clock
hour-format: 24h
- type: weather
location: London, UK
units: metric
- type: server-stats
- size: large
widgets:
- type: hacker-news
- type: rss
title: Self-Hosted News
style: horizontal-cards
feeds:
- url: https://selfhosted.show/rss
title: Self-Hosted Show
- url: https://www.jeffgeerling.com/blog.xml
title: Jeff Geerling
- size: small
widgets:
- type: monitor
title: Services
sites:
- title: Uptime Kuma
url: http://uptime-kuma:3001
check-url: http://uptime-kuma:3001/api/badge/1/statusBring it up:
docker compose up -d
docker compose logs -f glanceIt's live on port 8080 within a few seconds. No wait for migrations, no first-run wizard, no seed data.
Wiring in Uptime Kuma
The monitor widget supports two modes: a basic HTTP check (pings a URL and expects a 2xx), or pulling from Uptime Kuma's status page API. The latter gives you proper response times and the green/yellow/red state that Uptime Kuma already tracks — much more useful than a raw ping.
First, create a status page in Uptime Kuma (Settings → Status Pages → New). Add the monitors you want to surface and note the slug — say it's homelab.
Then replace the basic monitor widget in your config:
- type: monitor
title: Infrastructure
style: summary
uptime-kuma-url: http://uptime-kuma:3001
status-page-slug: homelabIf Glance and Uptime Kuma are on the same Docker network, use the container name as the hostname. Different host? Use its LAN IP or Tailscale address.
One gotcha: Uptime Kuma's status page API returns 401 for private pages. Either make the status page public (it's behind your LAN anyway) or pass the API key in the URL as ?apikey=xxx. The Glance docs skip over this entirely — took me the better part of an evening to track down.
If you're still deciding between Uptime Kuma and Beszel for your monitoring stack, the Beszel vs Uptime Kuma breakdown covers which one fits better depending on whether you need uptime checks, host-level metrics, or both.
Server Stats and Other Useful Widgets
The server-stats widget pulls CPU, memory, and disk from the container's cgroup and the host's /proc. For accurate host-level disk stats, add bind mounts to your Compose file:
volumes:
- ./glance.yml:/app/glance.yml:ro
- /etc/localtime:/etc/localtime:ro
- /proc:/host/proc:ro
- /sys:/host/sys:roThen configure the widget explicitly:
- type: server-stats
cpu: true
memory: true
disks:
- path: /
name: Root
- path: /mnt/storage
name: StorageOther widgets worth enabling:
- bookmarks — replaces the links section of most startpages. Supports grouping and icons.
- github-releases — shows latest releases for repos you're tracking. Useful for staying current on self-hosted app upstream releases without checking GitHub manually.
- iframe — embeds any URL. Blunt instrument, but useful for Grafana panels or Portainer status views when no native widget exists.
- search — configurable bar with custom engines. Point it at your own SearXNG instance or leave it on DuckDuckGo.
Glance v2 vs Homepage: Honest Comparison
Both tools are actively maintained and genuinely good. Here's where each actually wins.
Use Glance when: you want a dashboard that looks polished without an afternoon of theme config; your use case is feeds + status + a handful of links; you value a stable config schema that doesn't shift between minor versions; or you want a single YAML file you can version-control and restore in thirty seconds flat.
Use Homepage when: you need deep service integration — Sonarr/Radarr queue counts, Proxmox VM status, Pi-hole query stats, the works; you want Docker label auto-discovery so new containers surface without touching config; or you're running 30+ services and need the breadth of Homepage's 80+ widget library. Glance has around 25.
The verdict: for most homelab setups under roughly 20 services, Glance v2 is the better starting point. The config is simpler, the defaults look better, and the RSS and news integration is genuinely first-class — it's clearly what the author uses it for. If you hit the widget ceiling, Homepage is still there, and the switching cost is low because both tools are stateless YAML configs.
Where Glance is weak right now: no Docker socket integration, no built-in auth layer, and the iframe widget is a blunt instrument for anything requiring real data.
Putting It Behind a Reverse Proxy
Glance has no built-in authentication. If you're exposing this beyond LAN — or just want consistent SSL termination — put Caddy or Traefik in front of it.
Minimal Caddy snippet:
dashboard.yourdomain.com {
reverse_proxy glance:8080
basicauth {
admin $2a$14$hashed_password_here
}
}For remote access without punching firewall holes, Tailscale is the cleanest option — install it on your homelab host and you get a private WireGuard mesh that reaches your dashboard from anywhere. The free tier covers most homelab setups comfortably.
If you're hosting this on a Hetzner cloud VPS for off-site access, pair it with a Namecheap domain and a Caddy Let's Encrypt cert — the whole setup takes under ten minutes and you get proper HTTPS with no manual cert renewal.
Worth the Switch
Glance dashboard v2 hits a sweet spot that's been missing in the homelab startpage space: genuinely good-looking defaults, stable config schema, zero runtime dependencies, and a widget set that covers 80% of what most homelabs actually need day to day.
Start with the Docker Compose snippet above, wire in your Uptime Kuma status page and a couple of RSS feeds, and adjust the theme colours to taste. If you outgrow the widget library down the line, the migration path to Homepage is straightforward — both are stateless YAML configs and the concepts map directly. But for a clean, fast homelab startpage 2025 and beyond, Glance is where I'd start.