Process probe · native macOS
What is running on your machine right now — and since when.
See which Claude Code sessions are alive on your Mac, across every account — and it says "I don't know" instead of guessing.
A next dev you started three hours ago, an MCP server left running since yesterday, a port held by a process you no longer recognize. Checking by hand means ps, lsof, kill — and a guess: if a process with that PID exists, you assume it's today's, even though PIDs get recycled.
A probe that can't rule out recycling and answers "alive" anyway isn't measuring anything — it's guessing, with confidence.
Shows Claude Code sessions across every configured account on the machine, not just the default one
A ternary verdict per session — alive, stale, or unknown — never a guessed yes/no
Catches PID reuse by comparing the process's real start time to the one recorded, not just whether a process with that number exists
A menu bar icon, for a glance without opening the window
A local, append-only history of each session's identity — no account, no cloud
An MCP server that reads straight from disk and answers even with the app closed
The colors below are exactly the ones in the app — "unknown" carries its own color, never the one for "stale".
The process exists and procStart matches what was recorded — PID reuse is ruled out.
No process with that PID, or one with a different procStart: the PID was recycled by another process.
The process exists, but reuse can't be ruled out — no baseline, or ps couldn't be read. It never becomes a guessed "alive".
Sources/VitalsCore/Liveness.swift, Theme.swift
Each one reads from a specific file, or from a live measurement against the real fleet.
Both "couldn't measure" branches in the verdict function return .unknown — not a guessed "alive" the way they did before 4 Sep 2026.
Sources/VitalsCore/Liveness.swift — verdict(for:)
procStart is compared as a date, not a string — a fix that repaired a false "stale" verdict reported 21 days out of every 30, on days 1-9 of the month.
Sources/VitalsCore/Liveness.swift — compareProcStart; docs/HANDOFF.md, Sep 3
Account enumeration finds every configured Claude Code account on the machine, with the source of each — alias, environment variable, or orphaned directory. It also finds an account named only by a shell alias, one that has no folder on disk yet.
Sources/VitalsCore/Accounts.swift
The MCP pod reads straight from disk, not through a socket to the app — it answers even if the Vitals window isn't open.
Package.swift — the VitalsMCP target's doc comment
A tested mechanism is not the same thing as a shipped feature. Here is exactly where one ends and the other begins.
WatchTarget/TargetProbe/TargetReconciler apply the same ternary verdict to any PID, command, or port — tested, with a "reoccupied" event that says "port 3000 is a different process than this morning."
Sources/VitalsCore/{WatchTarget,TargetProbe,TargetReconciler}.swift
vitals-tool watch pid:<pid> / cmd:<pattern> / port:<port> returns a verdict once, on request. There is no loop that re-probes it on its own.
REZULTAT.md — "TargetReconciler is not wired into a scanning loop"
The main panel groups sessions by account and shows their verdict — no non-Claude process appears there today.
Sources/Vitals/RootView.swift; docs/HANDOFF.md, Sep 4
Nothing in this section is a promise of port supervision as a feature of the interface — today, it isn't one.
Because sometimes it genuinely cannot confirm whether the process running now is the one that started — no baseline, or ps couldn't be read. A guessed verdict would be more reassuring and more false. "Unknown" never turns into "stale", and it never hides as "0 sessions".
The mechanism that would do that exists and is tested — it just doesn't run inside the app's window yet. Today the window shows Claude Code sessions only; the generic verdict is reachable manually, from the command line.
The store is local, SQLite, append-only. The MCP server reads straight from disk, not over a network call.
It requires macOS 14 or later — the package's own declared requirement.
Yes. The app checks a licence, and the build you download is signed with a Developer ID and notarised by Apple — Gatekeeper accepts it on first launch, with no warning.
The app checks a licence — the Ed25519 public key and the verifier are both in the binary you download from this page, signed with a Developer ID and notarised by Apple. It opens on an ordinary double-click, the first time.
+ VAT, calculated at checkout for your country
Open the app, go to Preferences → Licence and paste the key from the email.