Process probe · native macOS

Vitals

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.

sessions probed now
claude · sessionpid + procStart matchalive
cron · watcherPID reused sincestale
mcp-serverps unreadableunknown
claude · sessionpid + procStart matchalive
scroll

The problem

Guessing with confidence isn't a measurement

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.

What's in the window today

Six things the app actually does

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 verdict

Three states, never a boolean

The colors below are exactly the ones in the app — "unknown" carries its own color, never the one for "stale".

Alive

The process exists and procStart matches what was recorded — PID reuse is ruled out.

Stale

No process with that PID, or one with a different procStart: the PID was recycled by another process.

Unknown

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

Why you can trust it

Six things you can check, not just take our word for

Each one reads from a specific file, or from a live measurement against the real fleet.

"Unknown" is a real verdict, not just an icon

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:)

PID reuse, caught at the source

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

Not just the default account

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

An MCP server that answers with the app closed

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

Where the line is today

What's tested, and what's in the window

A tested mechanism is not the same thing as a shipped feature. Here is exactly where one ends and the other begins.

The generic target exists — just not in the window

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

Reachable today only from the CLI, one shot at a time

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 window shows Claude Code sessions only

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.

Requirements

System
macOS 14.0 or later
Network
None — the store is local, SQLite
Account
None — it reads the Claude Code accounts already configured

Questions

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.

Status

Available to buy

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.

€29

+ VAT, calculated at checkout for your country

Activation

How to activate your licence

Download the app

Download version 1.0.2

2.8 MB

Open the app, go to Preferences → Licence and paste the key from the email.