halton-meter status prints a Rich table of every component a Halton
Meter install touches: the four launchd processes, the three TCP
listeners, the system-proxy state, the sentinel files, and the install
mode. With --json the same content comes out as a single JSON
object, suitable for scripts and dashboards.
For the deep diagnostic — every layer of cert trust, certifi patch,
plist registration, port binding, sentinel state — use halton-meter doctor instead. status is the fast overview; doctor is the
forensic walkthrough.
Synopsis
halton-meter status [--json] What it checks
The implementation is halton_meter.lifecycle.status. Per row:
- daemon process — PID via
launchctl list com.haltonlabs.meter - watchdog process — PID via the watchdog label
- edge process — PID via the edge label; expected up regardless of daemon state
- userenv login agent — PID; expected
-(one-shot) - mitmproxy listener — port
internal_port(default 8090) bound on loopback - FastAPI listener — port
api_port(default 8765) bound on loopback,/healthreturns 200 - system-proxy state — per-interface
networksetup -getsecurewebproxy - sentinel files —
proxy-managed,apps-managed,install-mode - install mode —
env-only/apps/full
A healthy run
$ halton-meter status
halton-meter v0.1.24 · status
component state detail
────────────────────────────────────────────────────────────────────
install-mode apps ~/.halton-meter/install-mode
daemon healthy PID 80214 · com.haltonlabs.meter
watchdog healthy PID 80215 · com.haltonlabs.meter.watchdog
edge healthy PID 80213 · 127.0.0.1:8081
userenv applied last applied at login
mitmproxy listener bound 127.0.0.1:8090
fastapi listener bound 127.0.0.1:8765
system-proxy off (apps mode)
sentinels consistent proxy-managed: - apps-managed: ✓ JSON output
For scripts and dashboards:
$ halton-meter status --json
{
"version": "0.1.22.21",
"install_mode": "apps",
"daemon": { "state": "healthy", "pid": 80214, "label": "com.haltonlabs.meter" },
"watchdog": { "state": "healthy", "pid": 80215 },
"edge": { "state": "healthy", "pid": 80213, "port": 8081 },
"ports": { "edge": 8081, "internal": 8090, "api": 8765 },
"system_proxy": { "state": "off" },
"sentinels": { "proxy_managed": false, "apps_managed": true }
} The JSON shape is stable across patch releases — adding fields, never removing or renaming.
Common states
| State | Meaning | Next step |
|---|---|---|
healthy | Component up and responding | None |
stopped | Process registered with launchd but not running | halton-meter start |
unbound | Listener port not held | halton-meter doctor |
inconsistent | Sentinel says one mode, system state says another | halton-meter init <correct-mode> to reconcile |
unknown | Layer couldn’t be probed | Almost always cert/permission; doctor will identify |
Reading the underlying state by hand
$ launchctl list com.haltonlabs.meter # PID + LastExitStatus
$ launchctl list com.haltonlabs.meter.edge
$ launchctl list com.haltonlabs.meter.watchdog
$ launchctl print "gui/$(id -u)/com.haltonlabs.meter"
$ cat ~/.halton-meter/effective-ports.json # the chosen tuple
$ cat ~/.halton-meter/install-mode # env-only / apps / full launchctl list returns "PID" = <int> when alive and "PID" = -;
when registered but not running.
What’s next
halton-meter doctor— the deep diagnostic whenstatusshows anything nothealthy- Troubleshooting — the failure-by-
failure repair guide keyed on what
statusreports - Fail-open behaviour — why a stopped
daemon with a healthy edge is the expected state during
stop