Stackyard

Stackyard

Docker app from SandObserver's Repository

Overview

A self-hosted homelab dashboard you actually want to look at.

Most dashboards are a wall of numbers and charts. Stackyard is the opposite: a calm, launcher-style grid of app tiles, folders, and a small number of genuinely useful widgets. Built to be glanced at a hundred times a day without feeling cluttered.

Everything is set up from the browser. Add app tiles, group them into folders, arrange pages, and drop in widgets for the services you already run. Widgets cover Docker, system health, downloads, media, backups, network and more.

Runs as one container with no external database and no runtime dependencies. Configuration and uploaded icons persist in the two paths below.

Note: most homelab services live on private addresses. The Allow Private IPs setting below is on by default so links and widgets pointing at your other containers work. Turn it off to keep the SSRF guard enabled.

Stackyard

A self-hosted homelab dashboard you actually want to look at.

ghcr.io Docker Hub Latest release Tests Status

Stackyard dashboard

Try it: stackyard-demo.onrender.com
Note: The first demo visit may take up to a minute due to Render's free-tier cold start.

Most dashboards are a wall of numbers and charts. Stackyard is the opposite: a calm, launcher-style grid of app tiles, folders, and a small number of genuinely useful widgets, running in a single container. Built to be glanced at a hundred times a day without feeling cluttered.

Contents

Why Stackyard

  • Attention goes where it's needed, not everywhere at once. A calm grid, no charts or counters. Health badges only appear when something's wrong.
  • A glance should tell you more than a number would. Widgets are small visuals, not readouts.
  • Anything can be a badge. Point Stackyard at any API, pick a value from the response, and show it as a live activity badge. No custom widget, no code.
  • Configured by clicking, not by editing files. Everything is set up in the web UI, with config import and export.
  • No dependencies. Review it once and stop worrying about the supply chain.

Has a mobile layout, and is available in English, Persian, Chinese, Spanish, German, and French.

Add it to a phone's home screen and it opens in its own window, without browser chrome. There is no offline mode: every tile shows live data, so the dashboard needs to reach your services.

Getting started

You need Docker.

Using Docker Compose (docker-compose.yml):

services:
  stackyard:
    image: ghcr.io/sandobserver/stackyard:latest
    container_name: stackyard
    restart: unless-stopped
    ports:
      - "8700:80"
    volumes:
      - ./data:/data
      - ./icons:/icons
docker compose up -d

Or with docker run:

docker run -d \
  --name stackyard \
  --restart unless-stopped \
  -p 8700:80 \
  -v ./data:/data \
  -v ./icons:/icons \
  ghcr.io/sandobserver/stackyard:latest

Then open http://localhost:8700 and set things up from the admin app on the dashboard (or go to /admin). Config and uploaded icons persist in ./data and ./icons.

The same image is published to Docker Hub as sandobserver/stackyard, if you would rather pull from there. Prefer ghcr.io: it is the registry the release signature covers.

The docker-compose.yml in the repo is the recommended version: it adds resource limits, dropped capabilities, and commented options for a reverse proxy, host access, and Docker health checks.

Building from source

git clone https://github.com/SandObserver/stackyard.git
cd stackyard
docker build -t stackyard:local .

Then run stackyard:local the same way as above. For working on the code without Docker, see CONTRIBUTING.md.

Configuring

Everything is configured in the admin UI (/admin), split into a few sections:

  • General: title, description, and your server's Host IP (used to allow your own server in badge URLs and SSRF checks). Also Monitoring (logging level, Docker container health checks, and the socket URL used to reach Docker), optional password protection, and config import / export. Backup also imports a gethomepage or Dashy YAML config: links and folders are added to the dashboard, existing items are left alone, and anything that cannot be carried across is listed before you confirm.
  • Appearance: wallpaper and the overall look. Settings Display Mode picks the appearance of the Settings pages: System Default, Light or Dark. It is stored in the browser and applies to that device only. Also Keep Screen Awake, which stops the screen dimming while the dashboard is open. Browsers allow this over HTTPS only.
  • Dashboard: add and arrange your apps, folders, and widgets, and configure each one (including live activity badges).
  • About: version and links.

Icons

App icons resolve automatically by name from the community dashboard-icons set. Stackyard fetches each icon once and keeps it in memory, so the CDN is not contacted on every page load. You can also upload your own; custom icons are stored in ./icons.

Widgets

Current widgets and the services they integrate with:

  • Clock
  • Now Playing: Plex, Jellyfin, Emby, Navidrome
  • Weather: Open-Meteo (no API key required)
  • DNS: AdGuard, Pi-hole, Technitium, NextDNS
  • GitHub: contribution graph and pull requests
  • Books: Audiobookshelf, Komga, Kavita
  • System stats: CPU, memory, disk usage, network speed (SpeedTest Tracker, MySpeed), RX/TX throughput, and uptime.
  • Disk health: TrueNAS, Scrutiny
  • Backup: Duplicati, Kopia
  • Connections: Gluetun, Psiphon Conduit, Netbird, Plausible, Umami

Adding one is a folder plus one registry entry, with no changes to the rest of the app. See docs/widgets.md.

Live activity badges

Instead of writing a widget to surface one number, point Stackyard at any API endpoint and it lists the values in the response. Pick the one you care about (pending requests in a media server, items in a queue) and it becomes a small badge on that tile. Any service with an API, without code.

Set Show From to badge only counts at or above a number, so a queue that is never quite empty stays quiet until it matters.

Security

Stackyard never returns stored secrets to the browser, guards the URLs you test in the admin UI against SSRF and pins the resolved IP, and bounds every upstream call so one slow service cannot hang the dashboard. Some features trade safety for convenience and are opt-in with warnings. Read docs/security.md before exposing Stackyard beyond your LAN.

Contributing

Contributions are welcome, within the constraints that keep Stackyard small and auditable (one container, no backend dependencies, vanilla frontend). See CONTRIBUTING.md and docs/frontend.md. Participation is covered by the Code of Conduct.

Changelog

Notable changes are listed in CHANGELOG.md; per-release notes are on the GitHub Releases page.

License

Licensed under the Apache License 2.0. You are free to use, modify, fork, and build on Stackyard, including commercially. In return you must keep the existing copyright and attribution notices, and the license does not grant rights to the Stackyard name or logo: forks are welcome but must use their own name and not present themselves as the original project. See NOTICE.

Media gallery

Install Stackyard on Unraid in a few clicks.

Find Stackyard in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.

Open the Apps tab on your Unraid server Search Community Apps for Stackyard Review the template variables and paths Click Install

Download Statistics

939
Total Downloads

Related apps

Explore more like this

Explore all

Details

Repository
ghcr.io/sandobserver/stackyard:latest
Last Updated2026-08-17
First Seen2026-08-17

Runtime arguments

Web UI
http://[IP]:[PORT:80]
Network
bridge
Privileged
false

Template configuration

WebUI PortPorttcp

Port the dashboard is reached on.

Target
80
Default
8700
Value
8700
Config StoragePathrw

Dashboard configuration. Keep this, or every setting is lost on update.

Target
/data
Default
/mnt/user/appdata/stackyard/data
Value
/mnt/user/appdata/stackyard/data
Icon StoragePathrw

Icons you upload for your app tiles.

Target
/icons
Default
/mnt/user/appdata/stackyard/icons
Value
/mnt/user/appdata/stackyard/icons
Allow Private IPsVariable

Let widgets and badges reach private addresses, which most homelab services use. Set to false to keep the SSRF guard on.

Target
ALLOW_PRIVATE_IPS
Default
true
Value
true
Docker Socket Proxy URLVariable

Optional. Address of a Docker socket proxy, for the Docker widgets. Example: http://socket-proxy:2375

Target
SOCKET_PROXY_URL
Trust ProxyVariable

Optional. Set to true when running behind a reverse proxy, so client addresses are read from the forwarded headers.

Target
TRUST_PROXY