A self-hosted homelab dashboard you actually want to look at. Calm, live activity badges from any API, single container, zero dependencies. https://stackyard-demo.onrender.com
  • JavaScript 87.4%
  • HTML 8.5%
  • CSS 3.8%
  • Dockerfile 0.1%
  • Shell 0.1%
  • Other 0.1%
Find a file
2026-10-26 06:46:30 +00:00
.github Security: attach a VEX statement for the musl CVE to Docker Hub images (#555) 2026-10-25 15:24:22 -04:00
api Feature: import apps from Docker labels (#556) 2026-10-25 15:32:37 -04:00
docs Docs: refresh the social card and trim the README badges (#537) 2026-10-21 15:00:22 -04:00
e2e Fix: phone layout on sideways and large screens (#560) 2026-10-26 02:46:19 -04:00
nginx Security: load every catalogue icon through the server (#501) 2026-10-18 22:15:11 -04:00
scripts Improve: fail the image scan when Node.js misses a security release (#551) 2026-10-24 11:21:37 -04:00
templates Docs: describe v1.19.0 in the Community Applications template (#534) 2026-10-20 19:42:35 -04:00
test/repo Security: attach a VEX statement for the musl CVE to Docker Hub images (#555) 2026-10-25 15:24:22 -04:00
ui Fix: phone layout on sideways and large screens (#560) 2026-10-26 02:46:19 -04:00
.dockerignore Improve: add a dev Compose file that syncs the working tree (#523) 2026-10-20 00:26:31 -04:00
.editorconfig Encodes what code already uses, with Markdown exemption 2026-07-13 08:38:45 -04:00
.git-blame-ignore-revs Chore: ignore the formatting commit in git blame 2026-08-08 16:34:53 -04:00
.gitignore Improve: add a dev Compose file that syncs the working tree (#523) 2026-10-20 00:26:31 -04:00
ACCESSIBILITY.md Docs: list the English widget summaries and reword the Allowed Addresses entry (#401) 2026-10-03 20:14:43 -04:00
biome.json Refactor: move repository checks out of the API test suite (#326) 2026-09-22 17:42:04 -04:00
ca_profile.xml Add: Unraid Community Applications template (#89) 2026-08-16 15:37:05 -04:00
CHANGELOG.md Update the changelog for #560 2026-10-26 06:46:30 +00:00
CODE_OF_CONDUCT.md Docs: replace the code of conduct with a pointer to GitHub's 2026-08-09 20:56:11 -04:00
CONTRIBUTING.md Improve: add a dev Compose file that syncs the working tree (#523) 2026-10-20 00:26:31 -04:00
docker-compose.dev.yml Improve: add a dev Compose file that syncs the working tree (#523) 2026-10-20 00:26:31 -04:00
docker-compose.yml Security: stop the container cleanly and harden its runtime (#369) 2026-10-02 18:49:53 -04:00
docker-entrypoint.sh Security: stop the container cleanly and harden its runtime (#369) 2026-10-02 18:49:53 -04:00
Dockerfile Security: update Node.js to 24.22.1 and nginx to 1.30.6 (#550) 2026-10-24 11:13:44 -04:00
GOVERNANCE.md Docs: add governance and scan the image on pull requests (#240) 2026-09-06 01:02:01 -04:00
LICENSE Add LICENSE, and NOTICE 2026-07-05 08:51:08 -04:00
NOTICE Add LICENSE, and NOTICE 2026-07-05 08:51:08 -04:00
package-lock.json Build(deps-dev): Bump the dev-dependencies group with 2 updates (#515) 2026-10-19 18:28:32 -04:00
package.json Build(deps-dev): Bump the dev-dependencies group with 2 updates (#515) 2026-10-19 18:28:32 -04:00
playwright.config.js Fix: keep keyboard focus when Settings redraws the focused control (#373) 2026-10-02 20:24:36 -04:00
README.md Feature: Up Next widget for Sonarr, Radarr and Lidarr (#554) 2026-10-25 12:46:40 -04:00
SECURITY.md Docs: move contributor docs to the documentation site (#283) 2026-09-13 13:14:35 -04:00
supervisord.conf Security: stop the container cleanly and harden its runtime (#369) 2026-10-02 18:49:53 -04:00
tsconfig.frontend.json Feature: Gitea, Forgejo and GitLab in the Git widget (#552) 2026-10-24 15:35:15 -04:00
tsconfig.json Refactor: use structuredClone and Error.cause (#245) 2026-09-07 09:41:36 -04:00

Stackyard

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

ghcr.io Latest release Tests Status OpenSSF Best Practices

Stackyard dashboard

Try it: demo.sandobserver.com

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.

Documentation: stackyard.sandobserver.com/docs

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 and show what it reports as a live activity badge. One poll can carry several labelled values, each with its own colour and threshold. 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 runtime npm dependencies. The image adds only nginx and supervisor, from Alpine, to the official Node base.
  • Six languages, right-to-left included. Contrast and screen-reader labels are covered by tests.
  • Installs like an app. A mobile layout that opens in its own window from a home screen. No offline mode: every tile is live.

Widgets

Widgets and the services they read:

  • Clock
  • Now Playing: Plex, Jellyfin, Emby, Navidrome
  • Weather: Open-Meteo (no API key required) or OpenWeather (free API key), with UV and air quality warnings
  • DNS: AdGuard, Pi-hole, Technitium, NextDNS
  • GitHub: contribution graph and pull requests
  • Books: Audiobookshelf, Komga, Kavita
  • System summary: CPU, memory, disk, throughput, uptime, and network speed from SpeedTest Tracker or MySpeed. Reports on this machine, or on a host running Glances, Beszel, the Unraid API, Proxmox VE or TrueNAS
  • Disk health: TrueNAS, Unraid, Scrutiny
  • Backup: Duplicati, Kopia, Proxmox Backup Server, Backrest
  • Downloads: qBittorrent, Transmission, Deluge, SABnzbd, NZBGet
  • Up Next: the next episodes, films and albums from Sonarr, Radarr and Lidarr
  • Connections: Gluetun, Psiphon Conduit, Netbird, Plausible, Umami
  • Dashboard switch: links to your other Stackyard dashboards

Each widget is documented at Widgets. Adding one is a folder, with no changes to the rest of the app; see Build your first widget.

Getting started

You need Docker.

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

Then open http://localhost:8700 and set everything up at /admin. Config and uploaded icons persist in ./data and ./icons.

On Unraid, install it from Community Apps.

The same image is on Docker Hub as sandobserver/stackyard. Prefer ghcr.io: it is the registry the release signature covers.

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

Full instructions, including building from source, are at Installation.

Documentation

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 Security before exposing Stackyard beyond your LAN.

Accessibility

Stackyard targets WCAG 2.2 level AA and is partially conformant. What is supported, the known limitations, and how this was assessed are in ACCESSIBILITY.md.

Contributing

Contributions are welcome, within the constraints that keep Stackyard small and auditable (one container, no backend dependencies, vanilla frontend). See Contributing. Participation is covered by the Code of Conduct. Who maintains Stackyard and how decisions are made is in GOVERNANCE.md.

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.