How it works
It works as soon as it opens. For Claude, two optional extras make it complete, and each one is added only when you choose. Codex, in beta, needs nothing extra.
What it watches
- Sessions: Claude Code writes a small status file for every open session, saying whether it’s working or waiting for you, and keeps a chat history for every session with its title. Claude Doing? reads those, so every session is listed, open or recently closed, however you run Claude Code. Where the Claude desktop app has a record of a session, its sidebar title is used.
- Processes: everything running below each session, such as shells, dev servers and MCP servers, with its CPU and memory, from the same process list Activity Monitor uses.
- VMs and containers: it asks each tool that’s installed what’s running: Docker (which covers Docker Desktop, OrbStack, Colima and Rancher Desktop), Podman, Parallels Desktop, UTM, VMware Fusion, VirtualBox, Lima, Colima, Multipass, Tart, OrbStack machines and Apple’s
containertool. - Live graphs: Claude’s share of memory, CPU, network, disk and GPU, counting only its sessions, what they started and the Claude app. The System page shows the same for the whole Mac, with each core and the busiest processes.
- History: a reading every ten seconds is kept for seven days, so the charts can look back an hour, a day or a week.
- Usage: the token counts in Claude Code’s own history files, by hour, day, project, model and session, split into input, output and cache. Every model counts, including Claude on Bedrock or Vertex and models behind a gateway. Days and weeks run from your plan’s weekly reset, which the companion plugin reads; until it has, the app doesn’t show day and week totals.
Dev containers
Dev containers from VS Code (or the devcontainer CLI) and DevPod are recognised by the labels those tools put on them, and named after their project.
A Claude session running inside one can report to the app as well. Report sessions… on the container adds a small hook to the project’s own .claude folder, which the container shares with your Mac: Claude in the container runs it and it writes one line per tool call to a log in that folder, which the app reads. On your Mac the same hook does nothing. Nothing in devcontainer.json changes, and it’s removed from the container’s right-click menu. It needs the project folder shared from your Mac, which is the default.
Linking what’s running to the session that started it
A VM or container is started through another app, so it isn’t “under” the Claude session that asked for it. Claude Doing? links them in one of two ways, and says which:
- Hook (certain): with the hook added, Claude Code tells the app about each command as it runs.
- History (likely): without it, the app matches commands in the chat histories by time and by the tool they name, such as
docker compose upbefore a container started. It only links when the evidence is clear, so some things show as Not Claude until the hook is on.
The hook
Adding it puts entries for PreToolUse, PostToolUse, SessionStart and SessionEnd in ~/.claude/settings.json, keeping everything else, after saving a backup. Each runs a small program that writes one line per event to a log on your Mac: the time, the session, the tool and a one-line summary. It prints nothing, so nothing is added to Claude’s context. It always succeeds, so it never blocks or changes what Claude does. And if its program is ever deleted, the entry quietly does nothing.
Plan limits and the daily budget
Your plan’s limits can only be read from inside a Claude session. The companion plugin reads them there, once a minute and after each reply, and writes them to a file the app reads. It passes on:
- your plan’s 5-hour and weekly limits, from any session, or a gateway’s spend limit
- per-model limits and your sidebar’s groups, from a Code session in the Claude desktop app, once you’ve run
/doing-connect-wfcthere and allowed it - the weekly limit’s readings over time, so each day’s share of your budget is exact
It’s installed with Claude Code’s own claude plugin commands. It adds nothing to your conversations and uses no tokens.
Terminal or desktop app
Claude Doing? works with the Claude Code command-line tool alone; the Claude desktop app is optional. Each session is listed once, whether it runs in the terminal, an IDE or the desktop app.
| Terminal alone | With the desktop app | |
|---|---|---|
| Open sessions, what they’re doing and what they started | ✓ | ✓ |
| Recently closed sessions, titled | ✓ | ✓ with its sidebar’s titles |
| Remote Control | ✓ open sessions | ✓ open and closed |
| Tokens by session, project and model | ✓ | ✓ |
| 5-hour and weekly limits, daily budget, other use | ✓ on a Claude plan | ✓ on a Claude plan |
| Per-model limits | – | ✓ |
| Sidebar groups, archived sessions | – | ✓ |
Does the desktop app need to be running? For per-model limits and sidebar groups, yes: they’re read through the desktop app’s own tools, which only a Code session open in it can use, so the app needs to be running with a Code session open. The last reading is used for an hour after. Its sidebar titles and archived sessions are read from its files, so for those it only needs to be installed. When there’s no desktop app, Usage says which figures need it.
On an API key, Bedrock, Vertex or a gateway there’s no plan, so there are no plan limits to read: token usage is complete, but the daily budget and other use need a Claude plan. A gateway’s spend limit is shown when it reports one.
Codex (beta)
Claude Doing? can show OpenAI’s Codex alongside Claude. It’s off until you turn it on, when the app asks after updating or in Settings › General › Beta features. With it off, nothing of Codex’s is read.
It covers Codex however you run it on this Mac: the Codex app, the Codex command-line tool or the VS Code extension. All three keep their files in ~/.codex (or $CODEX_HOME), and that’s all the app reads, so there’s nothing to install:
- Sessions: each session’s history, title, folder and model, and whether it’s open now, from the thread files a running Codex holds open. Codex sessions join Activity with a Codex badge and have their own Sessions page under Codex.
- What it started: Codex has no hook, so containers and processes are linked from the commands in its history, marked History.
- Usage: Codex writes your plan’s limits into its history with each reply, so the weekly limit, the daily budget and other use need no plugin. Other use here is Codex cloud tasks, ChatGPT Work and other agentic features, or Codex on another computer, which share Codex’s allowance. Days and weeks run from Codex’s own weekly reset.
- Storage: Codex’s folders join Storage, with a filter for All, Claude or Codex. Session histories are Check first, and those open now are in use. Archived sessions, caches and shell snapshots are safe. Its sign-in, settings, plugins, skills, memories and databases are always kept.
It’s a beta: if an update to Codex changes its files, Settings › Monitoring says Not recognised and those figures are left out until Claude Doing? catches up.
What it keeps on your Mac
Everything stays on your Mac, in the app’s folder in ~/Library/Application Support/ClaudeDoing. What it works out from Claude’s history files (token totals, recent commands, plan readings and the charts’ readings) is kept in a small database there, index.sqlite, so it starts with its figures instead of reading the histories again. Claude’s own files are only read, never changed.
Updates
Once a day the app checks the latest release on GitHub for a signed update file. If there’s a newer version it asks before installing it. The update is installed only if:
- the file is signed with WhiteFish Creative’s key
- the download matches the size and SHA-256 in that file
- the new app carries the same Developer ID signature
You can turn the daily check off in Settings.
Removing it
Settings › Monitoring › Uninstall… removes the hook (keeping a backup of your settings) and the companion plugin. It also deletes the app’s own folder and preferences, then moves the app to the Trash. You can also remove the hook or the plugin on its own.
Already deleted the app? The hook program lives outside it, so it can still remove everything:
"$HOME/Library/Application Support/ClaudeDoing/hook/claude-doing-hook" --uninstall
Your Claude sessions, chat histories and other settings are never touched.