If you’re running multiple self-hosted services in your homelab, you’ve probably experienced the frustration of juggling bookmarks, memorizing ports, and keeping track of which service runs where. A self-hosted dashboard solves this problem by providing a unified interface to access and monitor all your applications from one place.

💡 This article contains affiliate links. If you buy through them, we earn a small commission at no extra cost to you. Learn more.

In this comprehensive guide, we’ll explore two of the most popular self-hosted dashboard solutions: Homepage and Dashy. Both are excellent choices, but they cater to slightly different needs. We’ll walk through installation, configuration, features, and help you decide which one is right for your homelab.

Why You Need a Self-Hosted Dashboard

Before diving into the specifics, let’s understand why a dashboard is essential for any serious self-hoster:

Centralized Access: Instead of remembering 192.168.1.50:8080, 192.168.1.51:9000, and dozens of other URLs, you access everything from one beautiful interface.

Service Monitoring: Most dashboards integrate with monitoring tools to show you service health, uptime, and resource usage at a glance.

Organization: Group services by category (Media, Downloads, Monitoring, etc.) to keep your homelab organized.

Discovery: When you have 20+ services running, a dashboard helps you remember what you’ve deployed and where it lives.

Aesthetics: Let’s be honest — a well-designed dashboard makes your homelab feel more professional and enjoyable to use.

Homepage vs Dashy: Quick Comparison

Before we dive into installation, here’s a high-level comparison:

Homepage

  • Modern, widget-based interface
  • Deep service integrations (shows stats directly on tiles)
  • Built-in resource monitoring
  • Active development and growing community
  • Configuration via YAML files
  • Better for users who want real-time service stats

Dashy

  • Highly customizable visual appearance
  • Simpler service listings (primarily links)
  • Extensive theming options
  • More mature project
  • Configuration via YAML or web UI
  • Better for users who prioritize aesthetics and customization

Both are excellent choices. Homepage excels at showing you what’s happening across your services, while Dashy excels at looking exactly how you want it to look.

Installing Homepage with Docker

Homepage is a modern, fast dashboard with excellent service integrations. Let’s get it running.

Prerequisites

You’ll need:

Docker Compose Setup

Create a directory for Homepage:

1
2
mkdir -p ~/homepage
cd ~/homepage

Create a docker-compose.yml file:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
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 # Optional: for Docker integration
    restart: unless-stopped

Important security note: Mounting the Docker socket (/var/run/docker.sock) allows Homepage to auto-discover and monitor your containers, but it also grants significant privileges. Only do this if you trust Homepage and understand the implications. For enhanced security, consider using a Docker socket proxy like Tecnativa’s docker-socket-proxy.

Start Homepage:

1
docker-compose up -d

Homepage will create configuration files in ./config on first run. Access it at http://your-server-ip:3000.

Basic Configuration

Homepage uses YAML files in the config directory. Let’s create a basic setup.

Edit config/services.yaml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
---
# Media Services
- Media:
    - Jellyfin:
        icon: jellyfin.png
        href: http://192.168.1.50:8096
        description: Media streaming server
        widget:
          type: jellyfin
          url: http://192.168.1.50:8096
          key: YOUR_JELLYFIN_API_KEY

    - Radarr:
        icon: radarr.png
        href: http://192.168.1.50:7878
        description: Movie management
        widget:
          type: radarr
          url: http://192.168.1.50:7878
          key: YOUR_RADARR_API_KEY

# Downloads
- Downloads:
    - qBittorrent:
        icon: qbittorrent.png
        href: http://192.168.1.50:8080
        description: Torrent client
        widget:
          type: qbittorrent
          url: http://192.168.1.50:8080
          username: admin
          password: YOUR_PASSWORD

# Monitoring
- Monitoring:
    - Uptime Kuma:
        icon: uptime-kuma.png
        href: http://192.168.1.50:3001
        description: Service monitoring
        widget:
          type: uptimekuma
          url: http://192.168.1.50:3001
          slug: homelab

Edit config/widgets.yaml to add system widgets:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
---
- resources:
    cpu: true
    memory: true
    disk: /
    cputemp: true
    uptime: true

- search:
    provider: google
    target: _blank

Edit config/settings.yaml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
---
title: My Homelab Dashboard
favicon: https://your-favicon-url.com/favicon.ico
theme: dark
color: slate
layout:
  Media:
    style: row
    columns: 3
  Downloads:
    style: row
    columns: 2
  Monitoring:
    style: row
    columns: 3

Restart Homepage to apply changes:

1
docker-compose restart

Advanced Homepage Features

Docker Integration: If you mounted the Docker socket, Homepage can auto-discover containers. Add to config/docker.yaml:

1
2
3
4
---
my-docker:
  host: localhost
  port: 2375

Service Widgets: Homepage supports 100+ service integrations. Each widget can show real-time data:

  • Jellyfin: Currently playing, library counts
  • Radarr/Sonarr: Queue size, missing items
  • qBittorrent: Download/upload speed, active torrents
  • Proxmox: CPU, RAM, node status
  • Pi-hole: Queries blocked, percentage blocked

Find the complete widget list in the Homepage documentation.

Bookmarks: Add quick links in config/bookmarks.yaml:

1
2
3
4
5
6
---
- Self-Hosting:
    - SelfHostWise:
        - href: https://selfhostwise.com
    - Reddit r/selfhosted:
        - href: https://reddit.com/r/selfhosted

Installing Dashy with Docker

Dashy is a feature-rich dashboard with extensive customization options and a gorgeous interface.

Docker Compose Setup

Create a directory for Dashy:

1
2
mkdir -p ~/dashy
cd ~/dashy

Create a docker-compose.yml file:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
version: "3.8"

services:
  dashy:
    image: lissy93/dashy:latest
    container_name: dashy
    ports:
      - 4000:80
    volumes:
      - ./config.yml:/app/public/conf.yml
    environment:
      - NODE_ENV=production
    restart: unless-stopped

Start Dashy:

1
docker-compose up -d

Access Dashy at http://your-server-ip:4000.

Basic Configuration

Dashy uses a single config.yml file. Create it in your Dashy directory:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
---
pageInfo:
  title: My Homelab Dashboard
  description: Welcome to my self-hosted services
  navLinks:
    - title: GitHub
      path: https://github.com
    - title: SelfHostWise
      path: https://selfhostwise.com

appConfig:
  theme: nord-frost
  layout: auto
  iconSize: medium
  language: en
  statusCheck: true
  statusCheckInterval: 60

sections:
  - name: Media Services
    icon: fas fa-film
    items:
      - title: Jellyfin
        description: Media streaming
        icon: hl-jellyfin
        url: http://192.168.1.50:8096
        statusCheck: true
        
      - title: Radarr
        description: Movie management
        icon: hl-radarr
        url: http://192.168.1.50:7878
        statusCheck: true

  - name: Downloads
    icon: fas fa-download
    items:
      - title: qBittorrent
        description: Torrent client
        icon: hl-qbittorrent
        url: http://192.168.1.50:8080
        statusCheck: true

  - name: Monitoring
    icon: fas fa-chart-line
    items:
      - title: Uptime Kuma
        description: Service monitoring
        icon: hl-uptimekuma
        url: http://192.168.1.50:3001
        statusCheck: true
        
      - title: Grafana
        description: Metrics dashboard
        icon: hl-grafana
        url: http://192.168.1.50:3002
        statusCheck: true

Restart Dashy to apply changes:

1
docker-compose restart

Advanced Dashy Features

Themes: Dashy includes 20+ built-in themes. Change the theme in appConfig:

  • nord - Nord color palette
  • nord-frost - Nord with frost tones
  • material-dark - Material design dark
  • dracula - Dracula theme
  • monokai - Monokai color scheme
  • high-contrast-dark - High contrast for accessibility

Status Checking: Dashy can ping your services and show online/offline status. Enable per-item:

1
2
3
4
5
- title: Nextcloud
  url: http://192.168.1.50:8080
  statusCheck: true
  statusCheckUrl: http://192.168.1.50:8080/status.php
  statusCheckInterval: 60

Web Search: Add a search bar:

1
2
3
4
appConfig:
  webSearch:
    searchEngine: duckduckgo
    openingMethod: newtab

Authentication: Protect your dashboard with built-in auth:

1
2
3
4
5
appConfig:
  auth:
    - user: admin
      hash: 5E884898DA28047151D0E56F8DC6292773603D0D6AABBDD62A11EF721D1542D8  # "password" hashed
      type: local

Generate password hashes with:

1
echo -n 'your-password' | sha256sum

Icons: Dashy supports multiple icon sources:

  • favicon - Auto-fetch from service
  • hl-jellyfin - Home Lab icons
  • si-docker - Simple Icons
  • fas fa-home - Font Awesome
  • Custom URLs or local images

Widgets: Add widgets for weather, system info, or custom HTML:

1
2
3
4
5
6
- name: System Info
  icon: fas fa-server
  widgets:
    - type: gl-current-cpu
      options:
        hostname: http://192.168.1.50:8082

Reverse Proxy Setup

Running your dashboard behind a reverse proxy (Traefik, nginx, Caddy) is highly recommended for SSL and custom domains.

Traefik Example (Homepage)

Add labels to your docker-compose.yml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
services:
  homepage:
    image: ghcr.io/gethomepage/homepage:latest
    container_name: homepage
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.homepage.rule=Host(`dashboard.yourdomain.com`)"
      - "traefik.http.routers.homepage.entrypoints=websecure"
      - "traefik.http.routers.homepage.tls.certresolver=letsencrypt"
      - "traefik.http.services.homepage.loadbalancer.server.port=3000"
    volumes:
      - ./config:/app/config
    restart: unless-stopped

networks:
  proxy:
    external: true

nginx Proxy Manager Example (Dashy)

  1. Create a new Proxy Host in nginx Proxy Manager
  2. Set domain name: dashboard.yourdomain.com
  3. Forward to: dashy:80
  4. Enable “Block Common Exploits”
  5. Request SSL certificate with Let’s Encrypt

Security Best Practices

1. Use Strong Authentication: Both Homepage and Dashy should be protected, especially if exposed to the internet.

2. Reverse Proxy with SSL: Always use HTTPS for external access.

3. Firewall Rules: If using Tailscale or WireGuard, restrict dashboard access to your VPN network only.

4. Read-Only Docker Socket: Use a socket proxy instead of direct socket mounting:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
services:
  socket-proxy:
    image: tecnativa/docker-socket-proxy
    container_name: socket-proxy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - CONTAINERS=1
      - NETWORKS=1
      - SERVICES=1
      - TASKS=1
    restart: unless-stopped

  homepage:
    image: ghcr.io/gethomepage/homepage:latest
    depends_on:
      - socket-proxy
    environment:
      - DOCKER_HOST=socket-proxy:2375

5. API Key Protection: Store API keys in environment variables instead of config files:

1
2
3
4
widget:
  type: radarr
  url: http://radarr:7878
  key: {{HOMEPAGE_VAR_RADARR_KEY}}

Performance and Resource Usage

Both dashboards are lightweight, but here’s what to expect:

Homepage:

  • RAM: ~50-100 MB
  • CPU: Minimal (<1% idle)
  • Disk: ~100 MB
  • Startup time: 2-3 seconds

Dashy:

  • RAM: ~60-120 MB
  • CPU: Minimal (<1% idle)
  • Disk: ~150 MB
  • Startup time: 3-5 seconds

Both run smoothly on minimal hardware like a Raspberry Pi 4 or entry-level mini PC.

Which Dashboard Should You Choose?

Choose Homepage if you want:

  • Real-time service statistics on your dashboard
  • Deep integration with homelab services
  • Active development and modern features
  • Resource monitoring built-in
  • Docker auto-discovery

Choose Dashy if you want:

  • Maximum visual customization
  • A mature, stable project
  • Web-based configuration UI
  • Extensive theming options
  • Beautiful, polished interface out of the box

Or run both! Many homelabbers run Homepage on port 3000 for daily monitoring and Dashy on port 4000 as a public-facing dashboard for guests or family members.

Troubleshooting Common Issues

Homepage widget not showing data:

  • Verify API keys are correct
  • Check service URLs are accessible from the Homepage container
  • Review Homepage logs: docker logs homepage
  • Ensure services support the widget type

Dashy status checks failing:

  • Confirm statusCheckUrl is correct
  • Check if service requires authentication
  • Increase statusCheckInterval to reduce load
  • Review browser console for CORS errors

Changes not applying:

  • Always restart the container after config changes
  • Verify YAML syntax (indentation is critical)
  • Check for typos in file paths or URLs

Performance issues:

  • Reduce number of widgets polling services
  • Increase polling intervals
  • Disable unused features
  • Use a Docker socket proxy instead of direct mounting

Backup and Migration

Both dashboards store configuration in simple YAML files, making backup trivial:

1
2
3
4
5
# Backup Homepage
tar -czf homepage-backup-$(date +%Y%m%d).tar.gz ~/homepage/config/

# Backup Dashy
cp ~/dashy/config.yml ~/backups/dashy-config-$(date +%Y%m%d).yml

To migrate to a new server:

  1. Copy configuration files
  2. Deploy the docker-compose.yml
  3. Update IP addresses/URLs as needed
  4. Restart the container

Conclusion

A self-hosted dashboard transforms your homelab from a collection of scattered services into a cohesive, organized system. Whether you choose Homepage’s powerful integrations or Dashy’s stunning customization, you’ll wonder how you ever managed without one.

Homepage is ideal for power users who want deep service insights and real-time monitoring. Dashy is perfect for those who value aesthetics and want a beautifully designed interface with extensive theming.

Both are actively maintained, well-documented, and free. Start with one, experiment with both, and find what fits your workflow.

Your homelab deserves a proper command center. Set one up today, and enjoy the satisfaction of having all your services beautifully organized in one place.


Looking for more self-hosting guides? Check out our articles on Traefik reverse proxy setup, Docker Compose best practices, and securing your self-hosted services.