self-hosted · open source · MIT

Your homelab, on one calm screen.

Service boards, uptime monitors, domain watch, and system metrics - a single static Go binary with the UI baked in. No YAML, no external database, no mandatory accounts.

Get startedGitHub$docker run -p 3000:3000 ghcr.io/dvorinka/dash
localhost:3000
Media05
PPlexplex.localhost:32400up
JJellyfinjellyfin.localhost:8096up
IImmichimmich.localhost:2283up
local time
--:--:--
Europe/Prague
pi-hole
24.0%
queries blocked
Infrastructure06
PProxmoxproxmox.localhost:8006up
PPi-holepihole.localhostup
GGiteagitea.localhost:3000up
api42 ms
nas-01
34%cpu
tdvorak.dev
260d
until expiry · tls 81d
Deploy
one static binary
Database
SQLite, embedded
Config
UI-managed, no YAML
License
MIT

Boards

the differentiator

One board state. Four skins.

Bento, Cards, Index, and Console renderers share the same drag-drop, popovers, and state. Switching the look is a setting, not a migration. Try it - this demo is live.

same board, four renderers
PPlexplex.localup
JJellyfinjf.localup
PPi-holepihole.localup
GGiteagit.localup
GGrafanagraf.localup

Monitors

checks on a schedule

Uptime that watches itself

HTTP, TCP, ping, DNS, keyword, JSON-path, and push checks on an in-process scheduler. Heartbeat history, latency graphs, and alert rules per monitor - down means you hear about it, not discover it.

gitea.tdvorak.dev
https · 30s
38 ms
99.98%
api.internal
tcp · 60s
12 ms
100.00%
pihole.local
keyword · 60s
24 ms
99.62%

Domains

rdap + whois + tls

Every domain, accounted for

Expiry countdowns, TLS certificate chains, DNS records attributed to their provider, and CT-log subdomain discovery. Field-level history on every change.

tdvorak.dev
260d
kan.tdvorak.dev
260d
old-legacy.net
12d

Systems

push-based agent

Hosts that report in

A tiny dash-agent pushes CPU, memory, disk, network, temperatures, and per-container stats - SMART, ZFS, and GPU when the tooling exists. One binary per host, nothing else.

37%cpu
memory61%
disk /data44%
8 containersload 0.42 · up 14d

Status & alerts

public pages, real transports

Tell users before they ask

Automatic incidents on monitor down, maintenance windows, public status pages, and SVG badges. Alerts dispatch through webhook, Slack, Discord, Telegram, Gotify, ntfy, or SMTP.

status page · public/status/lab
All systems operational
edgeoperational
apioperational
mediaoperational
12:04:11pihole.local recovered→ slack · ntfy · smtp

Stack

boring, on purpose
go 1.24ginsqlite (modernc)embed.FSopenapi contractreact 18docker · ~34 MBgoreleaser binariesprometheus /api/metricspwa

It needs a persistent scheduler, WHOIS on port 43, ICMP, and SMTP egress - none of which exist on serverless. So the deploy story is docker run, and this page is the only part of Dash hosted here.

Install

~1 min
one-liner
$ curl -fsSL https://raw.githubusercontent.com/
    Dvorinka/Dash/main/install.sh | sh
# installs into ./dash, serves :3000
docker
$ docker run -d -v ./data:/data \
    -p 3000:3000 \
    ghcr.io/dvorinka/dash:latest

Everything is configured from the UI at localhost:3000. All state lives in one directory. Importers for Homepage, Homarr, and Dashy configs are built in.

Run it in one command.

MIT licensed. Self-hosted. Yours.

Star on GitHub