Stashboard: The Ultimate Self-Hosted Homelab Service Dashboard

stashboard-self-hosted-homelab-service-dashboard.md
title Stashboard: The Ultimate Self-Hosted Homelab Service Dashboard
date
author VahaC
read 8 min read
category Self-Hosting
tags #container #Docker #Homelab #self-hosting
Stashboard: The Ultimate Self-Hosted Homelab Service Dashboard

If you run more than a handful of containers at home, you’ve already hit the wall: bookmarks scattered across browsers, no idea which service went down at 2 AM, passwords buried in a sticky note next to the keyboard, and zero visibility into whether your images are months out of date. Stashboard is a self-hosted homelab service dashboard I built to fix exactly that — one place for every service you run, with live health checks, AES-256-GCM encrypted credential storage, and full Docker container management built in.

The core constraint I set for myself: a self-hosted homelab service dashboard that requires a separate database container, a migrator sidecar, or a 50-line config file before you can even log in is not a dashboard — it’s a project. Stashboard ships as a single Docker image with SQLite, auto-generates its own encryption keys, and applies database migrations on startup. Pull the image, run docker compose up -d, open a browser. That’s the entire installation story.

🐋 Docker Hub: hub.docker.com/r/vahac/stashboard 💻 GitHub: github.com/VahaC/stashboard


What Makes This Self-Hosted Homelab Service Dashboard Different?

There are other homelab dashboards — Homer, Heimdall, Homarr. Most are excellent at what they do: pretty link pages. Stashboard takes a different angle. A self-hosted homelab service dashboard that only shows bookmarks is a glorified browser start page. Stashboard adds the operational layer on top:

  • 🟢 Live status indicators — each card runs a real HTTP health check; the dot turns red when the service goes down
  • 🔐 Encrypted credential storage — usernames, passwords, API keys, and notes encrypted at rest with AES-256-GCM, per service
  • 🐳 Docker container management — start, stop, restart containers across multiple hosts from one UI; SSH-tunnelled hosts supported, no exposed Docker port required
  • 🔔 Automatic update tracking — compares running image digests against the registry and emails you once when a newer image lands (no spam)
  • 📋 Live log streaming — real-time container logs with stdout/stderr toggles, pause, resume, and snapshot download

Each feature sits inside a four-tab modal on every service card: General · Healthcheck · Credentials · Docker. There is no separate “Docker manager” app to open — the self-hosted homelab service dashboard is the manager.


Core Features 🗂️

Service cards auto-resolve the favicon from the service URL, or you can upload a custom logo. Categories (with color) and tags are per-user and fully customizable. The light/dark/system theme preference is saved server-side and synced across devices.

Credentials tab stores everything encrypted before it touches the database — this makes Stashboard a useful self-hosted homelab service dashboard even if Docker tracking never gets configured. The AES-256-GCM key is auto-generated on first start and persisted on the stashboard-data volume — you don’t manage it manually unless you’re migrating from an existing deployment. If you run a self-hosted Vaultwarden for external passwords, the Credentials tab handles the internal, service-specific secrets that don’t need to live in a full password manager.

Healthcheck tab lets you configure the endpoint, method, and expected status code per service, view history, and trigger a manual check at any time.

Backup is a single JSON export from the Account page — covers the full schema including Docker connections, encrypted secrets, categories, and tags. Import works across instances.


Docker Container Update Tracking 🔔

This is what turns a self-hosted homelab service dashboard into something genuinely useful for daily homelab operations. For every Docker-linked service, Stashboard periodically compares the running container’s image digest against what its registry advertises:

  1. A newer digest is published → the card shows an Update badge
  2. An email goes out once per unique digest — no duplicate alerts
  3. A one-click “Update now” button pulls the new image and recreates the container in place
  4. After recreation, Stashboard polls the container’s health state; if it doesn’t come up healthy within the configured window, the attempt is logged as RecreateFailed
  5. For GHCR images, the matching GitHub Release is fetched and the changelog appears inline in the modal — so you know what changed before you click Update

Supported registries: Docker Hub, GHCR, Harbor, Nexus, Gitea Packages (Basic auth), and AWS ECR. Tag-pattern filtering lets you ignore pre-release tags (-rc, -beta) with a regex or a semver preset dropdown. Schedules are per-watch: Hourly (1/2/4/6/12/24 h), Daily at a fixed UTC time, or Weekly.

If you’ve been manually chasing container updates — like the manual Jellyfin Docker update flow I documented earlier — this is the automation that eliminates that entire workflow.

Stashboard also supports a webhook receiver: registries can push instant update notifications to a per-watch token-authenticated endpoint, with the schedule-driven sweep as fallback. Every update attempt goes to an immutable audit log.


Quick Setup: Self-Hosted Homelab Service Dashboard in One Command ⚡

You do not need the source code, a .NET SDK, or any build toolchain. The image is prebuilt on Docker Hub.

Step 1 — Grab the Compose file:

curl -O https://raw.githubusercontent.com/VahaC/stashboard/main/docker-compose.yml

Step 2 — Start it:

docker compose up -d

The app is live at http://localhost:8080. On first start it:

  • Creates the SQLite database and applies all pending schema migrations automatically
  • Generates a cryptographically strong AES-256 encryption key and JWT secret
  • Persists both under /app/Data/.secrets on the stashboard-data volume — never overwritten by an image update

No .env file required to get started. Add one only to change the host port or pin a specific version:

curl -O https://raw.githubusercontent.com/VahaC/stashboard/main/.env.example
mv .env.example .env
# edit .env, then docker compose up -d

⚠️ Back up the stashboard-data Docker volume. It holds the SQLite database and the auto-generated encryption key. Losing the key makes every stored credential unrecoverable.

Register the first account, log in, click + Add service. That’s it for the self-hosted homelab service dashboard to be fully operational.

If you’re new to Docker Compose, the Docker for beginners guide covers volumes, networks, and the compose workflow before you dive in.


Connecting Docker to Enable Update Tracking 🐋

Add the Docker socket to your docker-compose.yml:

services:
  app:
    volumes:
      - stashboard-uploads:/app/wwwroot/uploads
      - /var/run/docker.sock:/var/run/docker.sock
      # add :ro if you only want digest tracking without the Update now button

Then in the UI: any service → Docker tab+ Add container → fill in the image reference (e.g. jellyfin/jellyfin:latest) and container name → Test connectionSave.

For remote hosts, Stashboard supports TCP+TLS and SSH-tunnelled daemon connections — no exposed port required on the remote side. This is where the self-hosted homelab service dashboard starts to overlap with tools like Portainer — but the difference is that everything is consolidated in one place rather than a separate management layer.

The /docker instances page shows every container across every connected host with inline Start / Stop / Restart actions, live CPU and memory sparklines, and direct links into the Inspect, Logs, and Stats panels. I’ve used Dozzle for log streaming in the past — Stashboard now replaces it as part of the same self-hosted homelab service dashboard setup.


Updating Stashboard Itself 🔄

No rebuild required. Place deploy.sh in your compose directory and run it:

chmod +x deploy.sh
./deploy.sh

The script pulls the image at the tag set by STASHBOARD_TAG in .env (defaults to latest), recreates the container, and waits for the health check to pass. Migrations run on startup automatically. The stashboard-data and stashboard-uploads volumes are untouched.

To pin a specific version:

# in .env
STASHBOARD_TAG=5.1.1

What’s Coming Next 🗺️

The roadmap for V5.2+ includes:

  • Compose-aware recreate — proper docker compose up -d <service> that respects depends_on ordering and env_file resolution
  • Compose project grouping + bulk update — group containers by project, update all at once
  • Image prune — automatically clean up dangling images after “Update now”
  • Proxmox LXC update monitoring — track pending package updates on LXC containers via the Proxmox REST API, same Hourly/Daily/Weekly schedule model as Docker watches
  • Browser terminalxterm.js exec session inside the modal, admin-only, fully audited

The Proxmox LXC monitoring feature is the one I’m most personally excited about — bringing apt update visibility into the same self-hosted homelab service dashboard that already handles Docker containers makes homelab maintenance genuinely manageable from one screen. A single self-hosted homelab service dashboard for Docker containers, LXC packages, live logs, encrypted credentials, and update notifications is the end goal.


Get It Running Today

Stashboard is MIT-licensed, actively developed, and available now:

If you care about keeping your containers secure, pair Stashboard’s update tracking with Docker hardened images for a defense-in-depth approach to your self-hosted stack.

⭐ A GitHub star helps other homelab users discover this self-hosted homelab service dashboard — the project is MIT-licensed and community contributions are welcome — and if you find a bug or have a feature request, issues are open.

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.