GY

Claude Session Monitor

At work · shared internally · Swift, AppKit, Rust

A Mac menu bar app for finding Claude Code sessions awaiting input and returning to the right editor tab.

Claude Session Monitormenu bar capture · 1600×1000 · pending

Why it exists

I run several Claude Code sessions in parallel, each in its own editor tab or window. A session might be waiting for permission while another finished ten minutes ago with output I haven't read. Finding out which needs my attention means cycling through windows, and a session waiting on me is idle time I paid for.

I built a native Mac menu-bar app for myself in August 2026, over about a week. Claude Code built it, and Codex did an adversarial review.

What it does

The app monitors only Claude Code sessions. Its menu-bar indicator expands into a grouped list of sessions: those waiting for permission, those that finished with unread output, and the rest. Selecting a verified row returns me to that session's existing editor tab. A toast notification appears when a session starts waiting.

Claude Code emits hook events at points in a session's lifetime. A small Rust program receives them and writes a state file for each session. The Swift app reconciles those files against a census of running processes and editor windows, then renders the menu from the result.

I used Swift and AppKit for the app, with Swift Package Manager. I built against Cursor and added VS Code support afterwards. In the release notes, I noted an unverified assumption about how VS Code names its processes.

Finding the right window

If the app sends me to the wrong editor window, there is no error. The editor silently opens an unrelated blank session, and I would be typing into the wrong place before noticing.

Before navigating, the app correlates four things: the session's own state, the ancestry of its process, the identity of its workspace, and a census of the editor's windows. If they don't agree, it refuses to navigate. I can open a read-only view of the session's output instead.

The app keeps a finished session in a persistent unread state. Its process is gone, but I still need to read what it produced. The row stays in the menu until I look at the output.

What I took out

The initial version generated a short AI summary of each session that appeared on hover. The job that produced the summaries selected exited processes while the sessions listed on screen were still running, so it summarized the wrong sessions. I removed the feature and its scheduled generator rather than expanding it.

Navigation still depends on an undocumented interface in the editor's extension. I haven't notarized the app or added automatic updates. These limits make the app harder to distribute to strangers, even though it works on my Mac.

Status

I have the app installed on my Mac. I shared it internally with install instructions in August 2026. I don't track whether other people still use it. The source is not public.