Homepage Dashboard: The Best Self-Hosted Startpage
If you've been running a homelab for any length of time, you've probably accumulated a growing list of services. Jellyfin for media, Nextcloud for files, Pi-hole for DNS, maybe Portainer for container management. And let's be honest, keeping track of all those URLs gets old fast. That's where Homepage comes in.
Homepage is a modern, fully static, lightning-fast dashboard that gives you a single pane of glass for your entire homelab. It's beautiful out of the box, incredibly customizable, and packed with integrations that actually work. After trying Heimdall, Organizr, and a handful of others, Homepage is the one that stuck for me.
Why Homepage Stands Out
There are plenty of dashboard solutions out there, so what makes Homepage special? A few things:
- Speed: It's built with Next.js and generates static pages. The result is a dashboard that loads instantly, even on lower-powered hardware.
- Widget ecosystem: Homepage has native support for over 100 services. We're talking Plex, Sonarr, Radarr, qBittorrent, Proxmox, Portainer, and way more. These aren't just links; they show live data.
- Clean configuration: Everything is configured through simple YAML files. No clunky web UI for setup, just edit the files and reload.
- Active development: The project moves fast, with new integrations and features landing regularly.
Getting Started with Docker
The easiest way to run Homepage is with Docker. Here's a simple docker-compose setup to get you started:
version: "3.3"
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
environment:
- PUID=1000
- PGID=1000
restart: unless-stopped
A few notes on this setup:
- The
./configvolume is where all your YAML configuration files will live. - Mounting the Docker socket (
/var/run/docker.sock) is optional but enables the Docker integration, letting Homepage show container status and stats. - Port 3000 is the default. Change it if you've got something else running there.
Spin it up with docker-compose up -d and hit http://your-server:3000. You'll see a default dashboard ready to customize.
Configuration Basics
Homepage uses four main configuration files, all in YAML format:
settings.yaml- Global settings like title, theme, and layoutservices.yaml- Your service links and widgetsbookmarks.yaml- Quick links organized by categorywidgets.yaml- Top-bar widgets for system info, weather, etc.
Let's look at each one.
settings.yaml
This controls the overall look and feel:
title: My Homelab
theme: dark
color: slate
headerStyle: boxed
layout:
Media:
style: row
columns: 4
Infrastructure:
style: row
columns: 3
The layout section is particularly useful. It lets you control how each service group displays, whether as rows or columns, and how many items per row.
services.yaml
This is where the magic happens. Here's an example with a few common services:
- Media:
- Jellyfin:
icon: jellyfin.png
href: https://jellyfin.example.com
description: Media streaming
widget:
type: jellyfin
url: http://jellyfin:8096
key: your-api-key-here
enableBlocks: true
- Sonarr:
icon: sonarr.png
href: https://sonarr.example.com
description: TV show management
widget:
type: sonarr
url: http://sonarr:8989
key: your-api-key-here
- qBittorrent:
icon: qbittorrent.png
href: https://qbit.example.com
description: Torrent client
widget:
type: qbittorrent
url: http://qbittorrent:8080
username: admin
password: your-password
- Infrastructure:
- Proxmox:
icon: proxmox.png
href: https://proxmox.example.com:8006
description: Hypervisor
widget:
type: proxmox
url: https://proxmox:8006
username: api@pam!homepage
password: your-api-token
- Pi-hole:
icon: pi-hole.png
href: https://pihole.example.com/admin
description: DNS ad blocking
widget:
type: pihole
url: http://pihole
key: your-api-key
Each service can have an icon (Homepage includes hundreds built-in), a description, and most importantly, a widget that pulls live data from the service. The Jellyfin widget shows active streams and library counts. Sonarr shows upcoming episodes and queue status. Pi-hole displays queries blocked and percentage filtered.
widgets.yaml
These are the info widgets that appear at the top of your dashboard. Here's a solid starter setup:
- resources:
cpu: true
memory: true
disk: /
label: System
- openmeteo:
label: Weather
latitude: 53.3498
longitude: -6.2603
timezone: Europe/Dublin
units: metric
- datetime:
text_size: xl
format:
dateStyle: long
timeStyle: short
- search:
provider: duckduckgo
target: _blank
The resources widget is fantastic for keeping an eye on your server's health. It shows CPU usage, memory consumption, and disk space right on your dashboard. No need to SSH in just to check if you're running low on storage.
The weather widget uses Open-Meteo, which is free and doesn't require an API key. Just plug in your coordinates and you're good to go.
Docker Integration
One of Homepage's killer features is its Docker integration. If you mounted the Docker socket, you can show container status directly on your services. Add this to any service:
- Jellyfin:
icon: jellyfin.png
href: https://jellyfin.example.com
server: my-docker
container: jellyfin
You'll also need a docker.yaml file:
my-docker:
socket: /var/run/docker.sock
Now Homepage will show a small status indicator on each service, turning green when the container is running and red when it's stopped. You can even click to see container stats like CPU and memory usage.
For remote Docker hosts, you can use TCP connections instead:
remote-server:
host: 192.168.1.100
port: 2375
Bookmarks for Quick Access
Not everything needs a widget. For simple links, use bookmarks.yaml:
- Developer:
- GitHub:
- abbr: GH
href: https://github.com
- Stack Overflow:
- abbr: SO
href: https://stackoverflow.com
- Social:
- Reddit:
- abbr: RD
href: https://reddit.com
- Hacker News:
- abbr: HN
href: https://news.ycombinator.com
Bookmarks appear in a separate section and use abbreviations instead of icons by default. They're perfect for external sites you visit frequently.
Tips for a Clean Setup
After running Homepage for a while, here are some tips that have served me well:
- Group logically: Organize services by function (Media, Infrastructure, Monitoring) rather than alphabetically. It makes scanning the dashboard much faster.
- Use descriptions: A one-liner under each service helps when you've got 20+ things running and can't remember what "Overseerr" does at a glance.
- Don't overdo widgets: Not every service needs live data. Sometimes a simple link is enough. Too many widgets can slow down page load and create visual clutter.
- Custom CSS: Homepage supports custom CSS if you want to tweak the look further. Create a
custom.cssfile in your config directory.
Wrapping Up
Homepage has become an essential part of my homelab stack. It's the first thing I see when I open a browser, giving me instant visibility into what's running, what's downloading, and whether anything needs attention. The setup is straightforward, the configuration is clean, and the widget support is genuinely impressive.
If you're still juggling browser bookmarks or can never remember which port Radarr runs on, give Homepage a shot. It takes maybe 15 minutes to get a basic setup running, and you can refine it over time as your homelab grows.
Check out the official documentation for the full list of supported widgets and configuration options. The project is open source and available on GitHub.