sessions
Claude Code and Codex, live.
Status, output tokens/s, context fill, estimated cost and $/hr for every running session, bound to its process's CPU, GPU and memory. Dormant sessions (stale, bound to no live process) are hidden and counted in the footer.
STATUS AGENT CWD OUT/s $ $/HR
⠋ Busy claude ~/code/api-server 22.4 $7.64 $4.91
Waiting claude ~/code/web-app 11.1 $3.39 $2.90
⠋ Busy claude ~/code/infra 9.9 $3.56 $5.14
Waiting claude ~/code/mobile-app 5.9 $1.10 $1.28
enter details sorta dormant
subagents
Subagents and workflows as a tree.
Claude Agent spawns, nested and background; workflow runs with phase and progress; Codex child threads. Each has its own rate and cost.
⠋ Busy ~/code/api-server
● run Explore
● run general-purpose⇢
done Explore
wf ● run workflow review 2/4
f hide / show subagent rows
power / thermals
The hardware, beside the agents.
CPU/GPU/ANE/DRAM power, E- and P-cluster load, GPU, temperatures, fans, thermal pressure with a THROTTLED badge, memory and swap, network and disk.
22.3 W system Thermal Nominal
CPU 13.6W GPU 3.2W ANE 1.4W
Temp CPU 70.2°C SOC 66.7°C
Fans Left 3186 Right 3329 RPM
no sudo
Reads IOReport and SMC directly.
No wrapping powermetrics, which needs root. One binary that links only macOS system frameworks, no runtime dependencies.
# asitop wraps powermetrics:
~ % sudo asitop
# wattop reads IOReport + SMC as you:
~ % wattop
--json
Scriptable.
--json streams one snapshot per interval as NDJSON; --once prints one and exits.
$ wattop --demo --json --once \
| jq '.sessions[0] | {agent, status, model,
cost_usd, burn_usd_per_hr}'
# shown: recorded demo frame 0, rounded;
# a live --demo run prints its own figures
{
"agent": "claude",
"status": "busy",
"model": "claude-opus-5",
"cost_usd": 7.62,
"burn_usd_per_hr": 9.49
}doctor
See what resolved on your chip.
wattop doctor prints which SoC channels, agent sources, pricing and theme resolve, without entering the TUI. Run it first on a new Mac or after a macOS upgrade.
keys
- ↑↓
- select
- enter
- session detail
- f
- hide / show subagent rows
- s
- sort: status → cost → burn → cpu
- g
- graphs / full meters
- t
- cycle theme
- p
- pause display
- ?
- help
themes
Four, cycled with t.
- wattop-dark
- wattop-light
- nord
- catppuccin-mocha
Or --theme 58a6ff for a bare accent.
self-cpu
~5% of a core, measured.
Measured on an M5 Max: 75 s of --json watching 12 sessions and 1,293 subagents, mean 5.19%, max 6.94% in steady state. The first ~5 samples after startup read 95-304% while it catches up on existing transcripts.
honest labelling
Estimates that say they are estimates.
$ is an estimate from LiteLLM's API prices. It ignores Claude Pro/Max and ChatGPT/Codex plans.OUT/s is output tokens over the last 60 s divided by 60, a transcript rate rather than generation speed.- Claude context fill is an estimate, drawn with a dashed edge. Codex's is exact, with a solid edge.
- An unpriced model shows
$—, never $0.00. Those mean different things. $/hr counts only spend wattop watched happen, so a fresh launch reads $0.00/hr. A nonzero live $/hr has not yet been observed end to end; that path is covered by unit tests.- Codex status and pid binding are inferred from rollout files. Codex has no live IPC.
all limitations, with evidence →