Building the Perfect NAS Dashboard with Homepage
Turn a wall of bookmarks into a living control room. Build a gethomepage.dev dashboard with live Docker container cards, resource widgets and a status board that actually updates.
Every homelab starts with a browser bookmarks folder. Then the folder grows to 40 links, half of them dead, and you’re typing 192.168.1.50:8123 from memory like a caveman. The upgrade is a proper dashboard — and after trying a dozen of them, Homepage is the one that stuck.
It’s a single Docker container, zero database, config in YAML, and it can talk to your Docker socket so every card shows live status — not a static link.
What Homepage gives you
- Service discovery — point it at the Docker socket and every running container becomes a card automatically, with a live up/down dot.
- Widgets — CPU, memory, disk, network, weather, and integrations for everything from Glances to your UPS.
- No build step — edit YAML, save, it hot-reloads. No React, no database, no pain.
Wiring up the Docker integration
Homepage needs read access to the Docker socket. Mount it read-only — never give a dashboard write access to your containers:
services:
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
ports:
- 3000:3000
volumes:
- ./config:/app/config
- /var/run/docker.sock:/var/run/docker.sock:ro
restart: unless-stopped
Then tell it which Docker host to watch in config/docker.yaml:
my-docker-host:
host: unix:///var/run/docker.sock
Cards that monitor containers
In config/services.yaml, define groups and let Homepage discover the rest. A hybrid setup — a few hand-pinned services, the rest auto-discovered — keeps the dashboard curated instead of chaotic:
- Media:
- Plex:
icon: sh-plex
href: http://192.168.1.50:32400
description: Movies and TV
widget:
type: plex
url: http://192.168.1.50:32400
key: {{HOMEPAGE_VAR_PLEX_TOKEN}}
- Docker:
- Homepage:
icon: sh-homepage
href: http://192.168.1.50:3000
The widget: block is what makes it alive — the Plex card shows what’s currently playing, not just a logo. For anything with an API, check the widget gallery before you build a custom integration. You’ll usually find it exists.
Widgets that make it feel alive
The right widgets turn the dashboard from a link page into a status board:
- Resource monitor — Glances or the built-in
resourceswidget, showing CPU, RAM and disk for the NAS itself. - Network — per-interface throughput, so you can see a backup saturating the link at a glance.
- Storage — disk usage per pool, which is the first thing you check when something feels slow anyway.
Environment-variable templating ({{HOMEPAGE_VAR_* }}) keeps secrets like API keys out of the YAML — put them in a .env that’s gitignored.
Layout and theming
Homepage’s layout is a grid of columns per group, with status dots, uptime, and ping latency on every card. Set statusStyle: dot in settings.yaml and a dark theme, and the whole thing looks like a proper NOC instead of a bookmarks page. It also supports a layout yaml for precise placement.
The verdict
Homepage replaced four tools in my lab: the bookmarks folder, a Grafana board I never finished, a Uptime Kuma instance I checked weekly, and the “what port was that again?” question. One container, one YAML directory, and every morning the dashboard tells me everything I need to know before I even open a terminal. If your NAS dashboard is still a bookmarks folder, this is the 20-minute fix.
Written by
Sten
Senior Editor
Builds AgenticOS and runs a homelab full of containers, GPUs and experiments.
Keep reading
Related articles
Docker Compose for Real Life: The Stack That Never Breaks
Stop copying Compose files from blog posts and praying. Real-world patterns for healthchecks, volumes, restart policies and logging that keep a homelab stack alive for years.
The Open Source Stack That Runs My Homelab
A NUC, a NAS, and zero licence fees. The battle-tested open source stack that runs my homelab — from containers and DNS to dashboards and backups — and what each tool actually earns its place.