cfbf01274d5d5fe07f825b2db32cc53a3245a520
## Summary Bundled remaining UX polish items from the screenshot review. ### Changes **Detail panel sections (#5)** - Fields grouped into ENDPOINT, TIMING, HTTP, CONFIG sections with subtle headers - Matches existing PROBE RESULTS and STATE CHANGES section pattern - Cleaner visual hierarchy without box-drawing clutter **Omit unconfigured fields (#6)** - Timeout hidden when 0 (unconfigured) - Method hidden when default GET - AcceptedCodes shows "200-299" explicitly when empty **Column header (#7)** - `LATENCY` → `LAT` (design short, never truncate — htop/btop pattern) **Alert detail view (#8)** - `i` key on Alerts tab opens full detail panel - Shows: type, health status, last sent time, send/fail counts, last error - Full config key:value pairs (untruncated) - Keybinding: `[i/Esc] Back [e] Edit [t] Test [q] Quit` ### Files (3) - `internal/tui/tab_sites.go` — section headers, field omission, LAT header - `internal/tui/tab_alerts.go` — viewAlertDetailPanel() - `internal/tui/tui.go` — stateAlertDetail, key handler, render routing Reviewed-on: lerko/uptop#37
uptop
Self-hosted uptime monitor with a TUI you can access over SSH. No browser, no install on the client — just ssh -p 23234 your-server.
Built on the foundation of RDGames/go-upkeep.
What it does
- 6 check types: HTTP, Push (heartbeat), Ping, Port, DNS, Groups
- 9 alert providers: Discord, Slack, Email, Ntfy, Webhook, Telegram, PagerDuty, Pushover, Gotify
- Config as code: define monitors in YAML, apply declaratively, version control your setup
- HA clustering: leader/follower with automatic failover
- Prometheus metrics:
/metricsendpoint for Grafana dashboards - Public status page: HTML + JSON, toggle with an env var
- SQLite or Postgres: SQLite for single-node, Postgres for production
- Uptime Kuma import: migrate from Kuma with one command
Quick start
go run cmd/uptop/main.go
ssh -p 23234 localhost
Seed some demo data to see it in action:
go run cmd/uptop/main.go -demo
Install
From source
go install gitea.lerkolabs.com/lerko/uptop/cmd/uptop@latest
Docker
docker pull lerko/uptop:latest
docker run -p 23234:23234 -p 8080:8080 -v ./data:/data lerko/uptop
Binary
Download from Releases.
Config as code
Export your current monitors:
uptop export -o monitors.yaml
Apply a config file:
uptop apply -f monitors.yaml
uptop apply -f monitors.yaml --dry-run # see what would change
uptop apply -f monitors.yaml --prune # delete anything not in the YAML
See docs/config-as-code.md for the full reference.
Docker
services:
monitor:
build: .
restart: unless-stopped
stdin_open: true
tty: true
ports:
- "23234:23234"
- "8080:8080"
volumes:
- ./data:/data
- ./ssh_keys:/app/.ssh
environment:
- UPTOP_DB_TYPE=sqlite
- UPTOP_DB_DSN=/data/uptop.db
- UPTOP_STATUS_ENABLED=true
- UPTOP_CLUSTER_SECRET=change-me
First run: attach to the container (docker attach uptop), go to the Users tab, add your SSH public key. Then detach with Ctrl+P, Ctrl+Q and connect normally over SSH.
Environment variables
| Variable | Default | What it does |
|---|---|---|
UPTOP_PORT |
23234 |
SSH server port |
UPTOP_HTTP_PORT |
8080 |
HTTP server port (status page, push, metrics) |
UPTOP_DB_TYPE |
sqlite |
sqlite or postgres |
UPTOP_DB_DSN |
uptop.db |
Database path or connection string |
UPTOP_STATUS_ENABLED |
false |
Enable public status page |
UPTOP_STATUS_TITLE |
System Status |
Status page title |
UPTOP_CLUSTER_MODE |
leader |
leader or follower |
UPTOP_PEER_URL |
Leader URL for follower nodes | |
UPTOP_CLUSTER_SECRET |
Shared key for cluster + API auth | |
UPTOP_INSECURE_SKIP_VERIFY |
false |
Skip TLS verification for checks |
Migrating from Uptime Kuma
Export your Kuma backup JSON, then:
curl -X POST http://localhost:8080/api/import/kuma \
-H "X-Upkeep-Secret: your-secret" \
-H "Content-Type: application/json" \
-d @kuma-backup.json
License
MIT — see LICENSE.