Glance Dashboard v2: The Cleanest Self-Hosted Homelab Homepage (Setup Guide)

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:ro

No 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/status

Bring it up:

docker compose up -d
docker compose logs -f glance

It'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: homelab

If 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:ro

Then configure the widget explicitly:

- type: server-stats
  cpu: true
  memory: true
  disks:
    - path: /
      name: Root
    - path: /mnt/storage
      name: Storage

Other 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.

H