How it works
It works as soon as it opens. Two optional extras make it complete, and each one is added only when you choose.
What it watches
- Sessions: Claude Code writes a small status file for every open session, saying whether it’s working or waiting for you. Claude Doing? reads those, and matches each one to its title in the Claude desktop app.
- 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.
- Usage: the token counts in Claude Code’s own history files, by hour, day, project, model and session, split into input, output and cache. 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.
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, weekly and per-model limits (with the Claude app’s permission, which
/doing-connect-wfcasks for once) - the desktop app’s session list and sidebar groups, so projects are grouped as in your sidebar
- 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.
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.