Teploy Dash

The dashboard that
reads the truth.

A fleet dashboard and uptime monitor for the teploy CLI, in one 17 MB Go binary. It has no database of its own: it reads the state files the CLI writes and shells out to the CLI for every action, so what you see is what is running.

$brew install useteploy/tap/teploy-dash
Read the docs
teploy-dash — fleet100.108.123.49:34565 apps · 3 servers
Fleet / read from /deployments on each server
appserverimagedomainstate24h
apihetzner-euapi:9f3c21api.acme.comrunning99.99%
webvultr-nycweb:41c9e2acme.comrunning99.98%
workerdo-sfoworker:b7d2a0-running99.97%
docshetzner-eudocs:c11e08docs.acme.commaintenance100%
apihetzner-euapi:a4e770api.acme.comdeploying14s
teploy deploy api · from webhook push 4e2b1czero downtime
Build image
Start new container
Health check 200
Route via Caddy
Stop old
logs — apiwebsocket
12:04:11 listening on :3000
12:04:11 db pool ready (10)
12:04:12 GET /health 200 3ms
12:04:14 POST /api/orders 201 41ms
12:04:14 GET /api/orders/8f2 200 9ms
12:04:15 GET /health 200 2ms
12:04:17 POST /api/checkout 200 212ms
monitors3 up
acme.comHTTP · 60s184ms
api.acme.com/healthHTTP · 30s41ms
postgres:5432TCP · 60s2ms
worker heartbeatcron · 5mon time
status.acme.comall systems operational
Websiteoperational99.99%
APIoperational99.98%
Databaseoperational100%
public · names and uptime only · no targets, no IPs

Dokploy and Coolify keep their own record of what is deployed. Change anything over SSH and the record is wrong, and now you have two truths. Dash keeps none. The server is the record, and Dash is a window onto it.

One source of truth

Terminal, UI and webhook all land in the same file

The CLI writes /deployments/<app>/state.json on every deploy, whoever triggered it. Dash reads those files, read-only, and when you press a button it runs the same CLI on that server. There is no second database to fall out of sync, because there is no second database.

  • A deploy from your laptop shows up in Dash immediately
  • A rollback from Dash is a real teploy rollback on the box
  • Delete Dash and nothing about your deployments changes
What's inside

Operations, not a control plane

The things you would otherwise open a terminal for, and the monitoring you would otherwise pay someone for.

teploy-dash

Fleet view

Every app on every server: state, image hash, domain, container status. Refreshed without hammering SSH.

app restart · rollback

App and accessory control

Start, stop, restart, rollback, lock, maintenance mode. Each one is the CLI binary on that server, invoked for you.

logs api -f

Streamed logs

WebSocket tailing per app with an SSE fallback. The deploy in flight streams too.

env set · secret set

Env and secrets

List, set and unset from the UI. Delegated to the CLI; Dash never stores a value itself.

template install

One-click templates

Install from the community catalog into any server in the fleet, with the accessories it needs.

kv

Key-value panel

List by pattern, reveal, set, remove. Keys the panel cannot drive render read-only instead of offering buttons that fail.

monitor add

Uptime monitors

HTTP, TCP and ping checks with per-monitor interval and timeout. 24h stats, response-time history, test-now.

alerts

Alerts on transitions

Webhook and SMTP on up, down and recovered. Per-monitor thresholds. Cron heartbeats catch a job that never ran.

--public-status

Public status page

Opt-in, unauthenticated /status for your users: name, state, 24h uptime. No targets, IPs or server names leak.

restore-test

Scheduled restore tests

Dash restores real backups into scratch containers on a schedule and proves they open. A backup you have not restored is a hope.

--bind 100.x

Tailnet-only by default

Bind to your Tailscale address and the dashboard is unreachable from the public internet, no reverse proxy required.

--nucleus-url

Nucleus or JSONL

Store monitor history in Nucleus over pgwire, or in rolling JSONL files with no extra dependency at all.

restore tests — nightly4 of 4 passed
api · postgresbackup 2027-03-01 02:00restored in 41s · 1,204 tablespassed
web · uploadsbackup 2027-03-01 02:10restored in 12s · 8,441 objectspassed
worker · redisbackup 2027-03-01 02:15restored in 3s · 92k keyspassed
docs · postgresbackup 2027-03-01 02:20restored in 9s · 61 tablespassed
scratch containers, torn down after · alert on failure and on recovery
Backups you can trust

Every backup gets restored. On a schedule. By a machine.

The CLI takes S3 backups with retention and cron. Dash takes the next step nobody does by hand: it restores each one into a scratch container, checks that it opens, and tears it down. A restore that fails pages you the same way a monitor does.

One binary.
17 MB.
Port 3456.

The frontend is embedded. Copy the binary anywhere and run it.

First launch is a setup page for your username and password, stored as bcrypt hashes. The install script verifies the release checksum before it runs, installs a systemd unit, and prints the generated admin password once. Bind to your tailnet and it never touches the public internet.

Install

Point it at /deployments

Dash reads the directory the CLI already writes to. Run it on the server, or mount the directory into the container. Monitor history goes to Nucleus if you have one, or to a JSONL file if you do not.

brew install useteploy/tap/teploy-dash teploy-dash # open http://localhost:3456
docker run -d -p 3456:3456 \ -e TEPLOY_DASH_PASSWORD=$(openssl rand -base64 24) \ -v /deployments:/deployments \ ghcr.io/useteploy/teploy-dash:latest
# verifies the release checksum before running curl -fsSLO https://github.com/useteploy/teploy-dash/releases/latest/download/install.sh curl -fsSLO https://github.com/useteploy/teploy-dash/releases/latest/download/checksums.txt sha256sum -c <(grep " install.sh$" checksums.txt) && sh install.sh
Comparison

How Dash compares

DashDokployCoolifyUptime Kuma
Own deployment databaseNone, reads CLI stateYesYesn/a
Can drift from what is on the serverNoYes, after SSH changesYes, after SSH changesn/a
Uptime monitorsHTTP, TCP, ping, cronNoNoYes
Public status pageYesNoNoYes
Scheduled restore testsYesNoNoNo
Streamed logsWebSocket + SSEYesYesNo
FootprintOne binary, ~17 MBNode + Postgres + RedisNode + Postgres + RedisNode + SQLite

Already running the CLI?

Dash reads the state files your CLI already writes. Install it on any server in the fleet.