Your servers at a glance,
over the ssh you already have.
smx is a live terminal dashboard for your servers. Nothing to install on them and no credentials to set up. If ssh web1 works in your terminal, smx works too.
sm dashboard v0.7.0 5/6 up updated 12 sec ago (next: 48s) sort: name SERVER TARGET STATUS HOSTNAME OS LOAD CPU MEM DISK UPTIME REBOOT LATENCY web1 web1 up web1 Ubuntu 24.04 LTS 0.21 0.18 0.15 6% 1.9G/4.0G 18G/40G 41d 3h no 38ms web2 web2 up web2 Ubuntu 24.04 LTS 0.34 0.29 0.22 9% 2.2G/4.0G 19G/40G 41d 3h no 41ms api-2 api-2 up api-2 Debian 12 2.90 2.41 1.98 88% 3.1G/4.0G 22G/40G 6d 11h yes (12 pkgs) 52ms ▸ db1 [email protected]:2222 up db-prod Ubuntu 24.04 LTS 0.52 0.47 0.40 24% 7.4G/8.0G 74G/80G 12d 9h no 47ms cache1 cache1 up cache1 Debian 12 0.04 0.03 0.02 1% 0.6G/2.0G 3G/20G 88d 1h no 35ms worker-3 worker-3 unreachable — — — — — — — — 3002ms ↑/↓ navigate · enter server menu · m dashboard menu · ctrl+c quit
db1 [email protected]:2222 STATUS up (47ms, checked 09:41:12) HOSTNAME db-prod OS Ubuntu 24.04 LTS LOAD 0.52 0.47 0.40 ▂▂▃▂▃▄▃▃▂▃▄▅▄▃▃▂▃▃▄▃▂▂▃▃▂▃▄▃▃▃ cores=4 CPU 24% ▂▃▂▂▃▅▆▄▃▂▂▃▃▄▃▂▂▃▄▆▅▃▂▂▃▂▂▃▃▃ MEM 7.4G/8.0G ▅▅▅▆▆▆▆▆▆▆▇▇▆▆▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ DISK 74G/80G ▁▁▂▂▂▃▃▃▃▄▄▄▅▅▅▅▆▆▆▆▆▇▇▇▇▇▇███ mount=/ used_pct=92 UPTIME 12d 9h REBOOT no ← back · ctrl+c quit
actions on db1 Top processes (CPU/mem) [read-only] Disk usage (filesystems + inodes) [read-only] Recent system logs [read-only] ▸ Reclaim disk (journal + package caches) [confirm] Restart service — postgresql [confirm] Reload service config — nginx [confirm] Configure actions… confirm action Reclaim disk (journal + package caches) server: db1 This changes state on the host. y run · ← back · ctrl+c quit
$ sm status --json db1 | jq '.servers[0]' { "name": "db1", "target": "[email protected]:2222", "reachable": true, "latency_ms": 47, "checked_at": "2026-09-25T09:41:12Z", "metrics": { "cpu": { "value": "24%", "level": "ok", "num": 24 }, "mem": { "value": "7.4G/8.0G", "level": "warn", "num": 92.5 }, "disk": { "value": "74G/80G", "level": "crit", "num": 92.5 }, "load": { "value": "0.52 0.47 0.40", "level": "ok", "num": 0.13 } } } $ sm status >/dev/null || notify-team "a server is unreachable" # exit 1 when any host is down
$ sm run web1 web2 api-2 -- 'systemctl is-active nginx' web1 web1 active web2 web2 active api-2 api-2 failed exit 3 $ echo $? 1
Yellow and red cells follow your own thresholds. Press enter on any server to drill in, run an action, or edit it.
You already have secure access to every box.
Most monitoring tools want you to install an agent, open a port, and hand a SaaS your keys. smx starts from what you already trust. For every refresh it bundles each metric's small POSIX shell snippet into a single script and runs it in one ssh host /bin/sh round-trip. ssh runs in BatchMode with a connect timeout, so an unreachable host fails fast instead of hanging your dashboard.
Watch it, then act on it.
A dashboard you can leave open in a tab, with the fix one keypress away.
No agent. No credentials.
smx shells out to your system ssh, so your ~/.ssh/config, keys, ssh-agent, ProxyJump and known_hosts all just work. If ssh web1 works, smx works.
Import from ~/.ssh/config
sm import pulls in every Host you already have, and re-running it syncs changes. Preview with ‑‑dry‑run, prune stale hosts with ‑‑prune.
Everything at a glance
Hostname, OS, load, CPU, memory, disk, uptime and pending reboots, all colour-coded green, yellow or red against thresholds you set per metric and per server.
Trends, not snapshots
Drill into any server for sparkline history of every metric. History survives restarts, so you can see the disk that has been creeping up all week.
Fix it without leaving the TUI
Restart or reload a service, tail logs, see top processes, or reclaim disk space. Changes are opt-in per server, need a confirmation, and every run is written to an audit log.
Keyboard-driven
Arrow keys and enter reach everything. Every menu item explains itself, and the footer always shows the keys for the screen you are on, so there is nothing to memorize.
Made for cron and alerting
sm status --json has a stable schema, and its exit codes (0 all up, 1 some unreachable) drop straight into cron and CI. sm watch runs your own notify command whenever something changes.
Ad-hoc commands everywhere
sm run -- 'systemctl is-active nginx' runs one command on every server, grouped by host, with non-zero exits and stderr called out.
Pluggable collectors
Each metric is one small Go file with a POSIX sh snippet and a parser. Drop one in and it shows up in the table, the detail view and the JSON. Runs on Linux and macOS.
Three commands to a live dashboard.
Pull in every Host from your ~/.ssh/config. Nothing new to configure.
Get a one-shot table of every server. Handy in a script or cron job.
Leave the live dashboard open in a tab. It refreshes on a heartbeat.
Install
Needs the ssh client on your PATH. Building from source needs Go 1.24 or newer.
$ go install github.com/furvur/server-monitor/cmd/smx@latest $ go install github.com/furvur/server-monitor/cmd/sm@latest
$ sm import # add every Host from ~/.ssh/config (try --dry-run first) $ smx # open the live dashboard
Prefer a binary? Download a prebuilt sm + smx archive for Linux or macOS (amd64 and arm64) from GitHub Releases.
Free to use, free to fork, MIT licensed.
smx is written in Go and developed in the open. Star it, file an issue, or add a collector for the metric you care about.