v0.3.0Apple Silicon, macOS 14+MIT

Watch the agents.
Watch the watts.

Watch every Claude Code and Codex session, its subagents, its output tokens/s (a 60 s average) and what it costs, beside what your Mac's CPU, GPU and power are doing. One terminal pane, one binary, no sudo.

brew install --cask jasonm4130/wattop/wattop
Star on GitHub

Nothing else to install: no daemons, no root, no account. No sessions yet? Try wattop --demo.

  1. 01 what your agents are doing

    Each session's status (Busy, Waiting, RateLimited or Stale), context fill and tool count, bound to its own process. Subagents and workflows nest under it, each with the tool it is on.

  2. 02 what they cost

    $ and $/hr per session and per subagent: API-price estimates from LiteLLM's table. Subscription plans are ignored, and the screen says so.

  3. 03 what your Mac is doing

    Power by rail, cluster load, temperatures, fans and thermal pressure, with two minutes of history, read without sudo.

wattop / Apple M4 Pro--demo · synthetic

Token throughput

OUT 133.5 tok/s0–167
IN  8573.6 tok/s0–10609

Hardware history

CPU % 72.30–100
GPU % 25.50–100
POWER W 22.30–30

Compute / memory

E (4)
69.9%2448 MHz
P (10)
73.2%4136 MHz
GPU (20)
25.5%965 MHz
Memory
68.1%

Mem 32.7/48.0 GB Swap 0.6/3.0 GB

DRAM Total ~39.3 GB/s (estimate)

Power / thermals / I/O

22.3 W system   Thermal Nominal

CPU 13.6W  GPU 3.2W  ANE 1.4W  DRAM 2.0W

Temp  CPU 70.2°C  GPU 66.2°C  SOC 66.7°C

Fans  Left 3186 RPM  Right 3329 RPM

Net  ↓ 3.1 MB/s  ↑ 209.6 KB/s

Disk R 13.6 MB/s  W 618.8 KB/s

Sessions / 6

Agent sessions in the synthetic demo, with subagent and workflow rows nested under their parent session.
StatusPIDAgent ModelCWDCTX OUT/s$$/HR TLSACPU% GPU/sRSS
Busy48213claudeclaude-opus-5~/code/api-serverapi-server~35%22.4$7.64$4.911023/711.0%2.4652M
● runExploreclaude-haiku-4-5▸ Read · Map auth middleware call sites25.8$0.25$0.91
● rungeneral-purp…⇢claude-sonnet-5▸ Write · Draft sessions table migration7.0$0.34$0.98
doneExploreclaude-haiku-4-5Find existing migration helpers0.0$0.07
wf ● runworkflowwf_7c1e9a4 · review · 1 run 2/4 done25.8$0.78$1.88
Waiting51877claudeclaude-sonnet-5~/code/web-appweb-app~23%11.1$3.39$2.901340/01.7%4.8592M
Busy39502claudeclaude-opus-5~/code/infrainfra~16%9.9$3.56$5.14720/028.6%4.9489M
Waiting55310claudeclaude-sonnet-5~/code/mobile-appmobile-app~50%5.9$1.10$1.28330/01.7%2.8521M
Waiting60144codex*gpt-5.6-terra~/code/data-pipelinedata-pipeline44%8.5$3.07$3.6301/12.0%—215M
● runreviewergpt-5.6-terra▸ shell · Hopper etl/loaders13.8$0.52$3.62
Waiting61022codex*gpt-5.6-terra~/code/cli-toolcli-tool27%3.3$1.12$3.0600/01.5%—146M

Machine 22.3W total|$20.91/hr total|$19.87 session total|wattop self 2.4% CPU

Costs are estimates from a pricing table and ignore subscription plans.

A recreation of the wattop terminal dashboard. Top: token throughput graphs (output and input tokens per second) and hardware history graphs for CPU, GPU and power. Middle: CPU cluster, GPU and memory load, and a power, thermals and I/O readout. Bottom: a table of six Claude Code and Codex sessions with status, model, working directory, context fill, output tokens per second, estimated cost and cost per hour, with subagent and workflow rows nested under their sessions. It updates once a second unless paused or reduced motion is set.

Recorded from wattop --demo: a synthetic machine and sessions, so rates and costs are illustrative. This is an HTML recreation that plays 25 recorded --json snapshots forward and back at one a second.

01 install

brew install --cask jasonm4130/wattop/wattop

wattop --demo # try it: synthetic data, no sessions needed

wattop doctor # what resolved on this chip

wattop # the dashboard; q quits

# or, with Go 1.27 and the Xcode command line tools:

go install github.com/jasonm4130/wattop/cmd/wattop@latest

# or from source:

git clone https://github.com/jasonm4130/wattop.git

cd wattop && make build && ./bin/wattop

needs
Apple Silicon (arm64), macOS 14 or newer. No Intel or Linux build.
update
brew update && brew upgrade --cask wattop
binary
arm64 archive on GitHub Releases, with checksums and GitHub build provenance. Not Apple-notarized: the Homebrew cask removes quarantine from the wattop binary it installs so that it launches.
status
Early-stage. Built and tested on an M5 Max so far. Other chips should work; run wattop doctor to see what resolves on yours.
install docs →

02 features

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 →

03 privacy

wattop runs entirely on your Mac. No account, no telemetry, one outbound request.

read
~/.claude and ~/.codex transcripts, read-only. Never written to.
read
The whole process table: every process you own, with its command line, working directory, CPU and memory, to find agent processes and bind sessions to them. Kept in memory; nothing leaves the Mac.
net
At most one GET per 24 h to LiteLLM's public price list on raw.githubusercontent.com. If it fails, the table embedded in the binary is used.
write
The price-list cache at $XDG_CACHE_HOME/wattop/pricing.json (default ~/.cache).
none
Telemetry, analytics, accounts, crash reporting in the wattop binary.
note
--json output includes working directories, process command lines and subagent descriptions. Treat it like your shell history before sharing it.

04 compare

Toolhardware power & sensorsClaude Code / Codex sessionssubagent treelive TUIneeds sudo
wattopyesboth, liveyesyesno
mactopyesnonoyesno
asitopyesnonoyesyes
ccusagenoboth, plus others (reports)nonono
Claude Code Usage MonitornoClaude, livenoyesno

Checked against each project's README in September 2026. wattop vendors mactop's IOReport/SMC collector. If you only want hardware, mactop is excellent; for historical usage reports across many agents, ccusage is. wattop is for watching live agents and the machine running them at once.

Apple Silicon (arm64) with macOS 14 or newer. wattop links Apple's private IOReport framework through CGO, so there is no Linux or Intel build.

Release archives include checksums and GitHub build provenance; they are not Apple-notarized. This is an early-stage project: read the limitations before you rely on a number.

One command to install. One to run.

brew install --cask jasonm4130/wattop/wattop
Star on GitHub

Or go install github.com/jasonm4130/wattop/cmd/wattop@latest, or the arm64 archive from GitHub Releases. Read the docs.