▁▃▅ # for the 02:00 change window

Watch the whole window.

Monitor every host in one live table, then export structured JSON evidence when the maintenance window closes.

uv uv tool install pinghue
brew brew install inxbit/tap/pinghue

the story continues below · skip to install

02:12

api-gw drops one probe.

One lost echo out of seven hundred. Loss ticks up, the state flips to intermittent, and the history bar keeps the dot. A blip you would have missed is now on the record.

02:12:41 · api-gw · 1 echo lost · loss 3% · intermittent

Host states reflect the whole run, not the last few probes.

02:18

db-primary starts to drag.

Latency climbs from 18ms into the 300s. The glyphs go amber on the fixed scale, jitter spikes, and the average remembers it. No rescaling, no smoothing: slow looks slow.

02:18:23 · db-primary · last 438ms · jitter 37ms · ▆▆▇

Latency maps to a fixed glyph scale that never changes between runs.

02:31

backup-nas stops answering.

Three consecutive failures and the state goes down. It stays down until the host answers again, not until the graph scrolls past.

02:31:04 · backup-nas · 3 consecutive fails · down

Fail-on-down exit codes let cron and CI act on it.

02:47

The window closes. The table remembers.

Forty-seven minutes, eight hosts, every probe accounted for. Export the evidence, attach it to the change ticket, and go back to bed.

02:47:56 · window closed · 8 hosts · 2 intermittent · 1 down · evidence written

See the report it writes.

pinghue - 8 targets - ICMP - 1.0s 47:56
Terminal table showing host latency, loss, jitter, state, and colored history bars during a simulated monitoring run.
HOSTLASTAVGLOSSJITTERSTATEHISTORY
edge-router-19.1ms9.4ms0%0.2mshealthy▃▃▃▃
edge-router-212.4ms11.8ms0%0.3mshealthy▄▄▄▄
core-sw-12.1ms2.0ms0%0.1mshealthy▂▂▂▂
db-primary18.6ms61.2ms0%2.1msintermittent▄▄▆▆
cdn-edge23.8ms24.1ms0%0.5mshealthy▄▄▄▄
api-gw30.7ms31.0ms3%0.4msintermittent▅▅·▅
backup-nas-6.1ms41%0.2msdown▃▃··
dns-resolver1.0ms1.1ms0%0.1mshealthy▁▁▁▁

Up to 1024concurrent probes

Schema version 1stable JSON evidence

macOS and Linuxsupported platforms

No server or daemonlocal by design

TUI when you watch. Lines when you script.

ICMP the default

$ pinghue 1.1.1.1 8.8.8.8 example.com

Concurrent echo probes with the full TUI: history bars, states, and keyboard control.

TCP no privileges needed

$ pinghue -p 443 example.com api.internal

Connect checks against any port, 1 to 65535. Refused connections get their own amber marker.

--no-tui for cron and CI

$ pinghue -p 443 example.com -c 3 --no-tui
2026-05-14T18:32:11.420000+00:00 example.com ok latency=14.08ms

One line per probe, fail-on-down exit codes, and --output for the report.

One fixed scale, every run.

Latency maps to a fixed glyph scale. It never rescales, so rows stay comparable across hosts, and across runs. Try it:

14 milliseconds maps to glyph 4 of 8, green.

▁≤1ms
▂≤3ms
▃≤10ms
▄≤30ms
▅≤100ms
▆≤300ms
▇≤1000ms
█>1000ms
·loss / down
!TCP refused

A host that blips once stays intermittent until you reset it. A maintenance-window report should reflect everything that happened, not only the final moments.

PingHue monitoring sixteen hosts in a dense terminal table with latency, loss, state, and history columns.

Close the window with a report.

$ pinghue -f hosts.txt --duration 180 --output maintenance.json{  "schema_version": 1,  "pinghue_version": "5.1.0",  "run": { "host": "local", "exit_reason": "deadline", … },  "targets": [    { "target": "db-primary", "status": "intermittent",      "stats": { "sent": 180, "received": 178, "loss_pct": 1.11, … } }  ]}
  • Versioned contract. JSON uses schema_version: 1. Breaking changes require a new schema version.
  • Whole-run stats. stats covers every probe in the run; samples is the recent tail.
  • Private by default. Output files are written 0600, and existing files are never replaced without --overwrite.

# what pinghue is not

Small on purpose.

A focused local tool for maintenance windows, migrations, and quick reachability checks. Nothing more, on purpose.

Sixty seconds to a live table.

uv uv tool install pinghue
pipx pipx install pinghue
brew brew install inxbit/tap/pinghue
pip python -m pip install pinghue

macOS and Linux, Python 3.10 to 3.14. Then run the environment doctor: pinghue --check. On Linux, ICMP may need a one-line ping_group_range fix, or just use TCP mode.