Homarr is a self-hosted dashboard and app launcher. It links every service on your server, shows live status widgets, and gives you one browser tab to rule them all from. It's a small thing, but the tab it replaces is worth it.
What it is
Drag tiles onto a board, point each at a URL or a Docker container, and get a launcher with status indicators. Newer versions support multiple users with per-user boards, so a family dashboard can show only what each person actually uses.
Before you start
- Recent 1.x releases changed how boards and users are stored. Check whether your version wants SQLite or Postgres before assuming the old compose file works.
- Mounting the Docker socket lets Homarr show container status. Skip it if you'd rather not grant that access — the links work fine without it.
- Homarr is a launcher, not a monitor. Pair it with Uptime Kuma and link the status page from a board tile.
1 — Write the compose file
services:
homarr:
image: ghcr.io/homarr-labs/homarr:latest
container_name: homarr
restart: unless-stopped
ports:
- "127.0.0.1:7575:7575"
environment:
SECRET_ENCRYPTION_KEY: CHANGE_ME_32_chars_minimum
DB_TYPE: sqlite
TZ: UTC
NODE_ENV: production
volumes:
- ./homarr/appdata:/app/appdata
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:7575/"]
interval: 30s
timeout: 5s
retries: 3
2 — Start it
mkdir -p ~/services/homarr/appdata
cd ~/services/homarr
docker compose up -d
docker compose logs -f homarr | grep -i "ready\|error"
3 — First-run setup
- Open
http://yourhost:7575and create the admin account. - Build a board and drag in tiles. The useful types: App for a link, Service Worker for a PWA, and Ping if you just want a green dot.
- Use Groups to separate services by function — Infrastructure, Media, Productivity — so the board stays legible once you pass thirty tiles.
- Add users under Settings → Users and give each their own board if this is a shared home server.
- Set it as your browser's homepage and as the default page on any wall tablet. That's the entire workflow this app is for.
4 — If you run a lot of services
# copy the URL list straight out of docker
docker ps --format '{{.Names}}' | sed 's/^/http:\/\/localhost:7575 -> /'
nextcloud, give it the public URL a human uses, not the internal container address. The dashboard is only useful if every link is one click from working, and internal names don't resolve in your browser.