What plottypus reads on Apple Silicon.Clusters, clocks, watts, heat, fans and processes. On this M5 Pro the CPU rails read 15–48 W.

plottypus is a system monitor for Apple Silicon that runs in your terminal. It never prints a zero it did not measure.

Measured with macmon 0.8.2 and mactop 2.1.5 on 24 Sept 2026 (the run). Live CPU watts on the M5 Pro. On other chips, the last IOReport value with its age (≈), then — once it is more than 10 s old, which on macOS 27 (Golden Gate) is often.

install
curl -fsSL https://plottypus.com/install.sh | sh

1.0.0Apple Siliconno sudo~2.2 MBfree

plottypus 1.0.0 · M5 Pro · cargo build --release

The plottypus work screen at 160 by 45 cells. Six braille graphs over the last two minutes: CPU with its watts and temperature, GPU, memory and swap, heat with fan speeds, network, and power. On the right, the process list filtered to rustc.

Real capture, not a mock-up: 20 s at 500 ms while cargo rebuilt plottypus's own release tree. The process list is filtered to rustc.

the measurement

Same Mac, same 20 seconds

CPU watts reported by macmon, mactop and plottypus, one sample a second, run at the same time
toolcpu watts, 1 sample/scpu Wat 0.0system W
macmon 0.8.2⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀0.020 of 2019–104
mactop 2.1.5⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀0.020 of 2019–96
plottypus 1.0.0⣀⣀⣤⣤⣤⣤⣀⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣤⣤⣤⣤⣿⣿⣿⣿⣿⣿⣿⣿⣀⣀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣶⣶⣶⣤⣤⣤⣤⣶⣶⣶⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿15–480 of 2019–104

MacBook Pro Mac17,8 (M5 Pro), macOS 27.0 (26A428), 2026-09-24, 00:39 IST, no sudo. The three tools ran at once: macmon pipe, mactop's headless JSON and plottypus --json-stream. Same scale on every row, 0 to 50 W.

Both tools saw the load. Their own system-power figures moved between 19 and 104 W in the same seconds. Only the CPU channel sat at zero.

The reason is upstream of them. On macOS 27 the PMGR “Energy Model” IOReport counters publish in batches 2–108 s apart, and sometimes not for tens of minutes. Divide one second's delta by one second and you get 0.0 W, then a spike. macmon is the tool plottypus learned IOReport from; its maintainers track this as issue #76. Stats users report the same 0.00 W in #3608 and #3621.

what it reads

Clusters, clocks, zones, rails and every process

Left: the chip summary (M5 Pro, 6 Super + 12 Performance cores, 20-core GPU, 24 GB), a GPU graph, a fan graph and per-core bars S0 to S5 and P0 to P11. Right: the super cluster at 14% and 2.5 GHz, and the super zone temperature at 74 degrees.

cpu, expanded (crop, --demo data)
per-cluster clocks
Each cluster gets its own graph and clock, computed from IOReport P-state residency.
zone temperatures
From the SMC: 3,626 SMC keys on the M5 Pro, 285 temperature keys among them. No sudo, no helper daemon.
per-core load
Every core as a bar: S0–S5 and P0–P11 on the M5 Pro.
power
System, CPU, GPU, ANE and DRAM watts on one line, battery drain and time left beside them. Anything IOReport has not published is ≈ or —, never 0.
interval
100 ms to 60 s, 500 ms by default. [ and ] change it live.

A process tree sorted by memory with columns pid, name, user, cpu percent, trend, gpu percent, mem, rss, power, read, write, wakeups per second and started. ollama-runner leads at 136% CPU, 88% GPU, 9.3 GB and 1.9 W.

processes, tree view (--demo data): mem is the physical footprint Activity Monitor shows, cpu% is its unit (100 = one core), power is each process's watts from the kernel's per-task energy counter

honest by default

— when it does not know. Never a made-up 0.

No reading. Another user's process without root (the kernel answers EPERM), a sensor this Mac does not have, a watt figure older than 10 s. JSON prints null.
Held. Between macOS 27 batches plottypus keeps the last IOReport rate, timed by the driver's own timestamp, and shows its age next to it.
Not drawn. Hardware that is not there gets no panel: no fans on a fanless MacBook Air, no battery on a Mac mini. Anything under 0.05 W counts as absent.

self-cost

Cheap enough to leave open all day

1.5%[1]

of one core at the default 500 ms

0[1]

redraws while idle; one frame per sample otherwise

0.007W[1]

of its own, the kernel's per-task estimate

2.2MB[2]

one binary, nothing else installed

  1. scripts/perf-smoke.py: 3 fresh processes, 5 s warm-up, 20 s window each, median. M5 Pro, macOS 27, median of 3, 160×45. About 1% of one core at 1 s. Before the rewrite it cost 7.06% of a core at 250 ms, 5.09% at 1 s and 0.18 W, with 106 empty redraws a second.
  2. 2,166,064 bytes, arm64, ad-hoc signed, not notarized.

themes

It looks like your terminal

The default theme is auto. At startup plottypus asks the terminal for its own colours (OSC 10, 11 and 4), waits at most 120 ms, and builds every role from your palette. Over ssh it skips the question.

10 built-in themes besides. Glass mode notices a translucent Ghostty, kitty or Alacritty from its config file and leaves the background to the terminal.

The same demo moment drawn in the selected theme.

theme auto: your terminal's own palette (Kanagawa Dragon here) (--demo data)

keys and scripts

Keys you already know. Output you can pipe.

Key profiles

PLOTTYPUS_KEYS=htop or btop, or pick one in settings. The mouse works too: click a row, click a header to sort, drag the gutter.

actionplottypushtopbtop
help?F1??
settingssF2Sos
filter processes/F3/f/
process treetF5tet
sorto<F6PMN
quit process (TERM)xF9xx
force quit (KILL)KKK
pause samplingpZp
quitqF10qq

Every key, all three profiles

Scripting

JSON schema 1, macmon field names, null for unmeasured. --json prints one sample, --json-stream keeps going.

json, schema 1 (head of a real sample)
plottypus --json{
  "schema_version": 1,
  "unix_ms": 1790190745798,
  "interval_ms": 1000,
  "primed": true,
  "soc": {
    "name": "Apple M5 Pro",
    "e_cores": 0,
    "p_cores": 12,
    "s_cores": 6,
    "gpu_cores": 20,
    "memory_bytes": 25769803776
  },
  "cpu": {
    "usage": 1.0,
    "scaled": 0.9628398,
    "freq_mhz": 4289,
    "temp_c": 88.42795,
    …
  },
  …
diagnose, during cargo build
plottypus --diagnoseBusy: rustc plottypus using 4.8 cores
  - cpu active: 78%
  - top process: rustc plottypus (pid 42415) at 4.8 cores
checked:
  cpu      78% active, top rustc plottypus at 4.8 cores
  memory   17.1G of 24.0G used, 711M swapped, pressure nominal
  thermal  nominal, cpu 77 °C

Every JSON field

supported Macs

Apple Silicon, M1 to M5

  • M1
  • M2
  • M3
  • M4
  • M5

Including Pro, Max and Ultra. Intel Macs: no.

What each Mac shows

M5 Pro (Mac17,8)
Live CPU watts from the SMC rails, within about 10% of IOReport. Run on hardware.
every other chip
CPU watts from IOReport, ≈ with an age, — after 10 s. Everything else as on the M5 Pro, from per-chip tables pinned by fixture tests.
macOS
Tested on macOS 27.0; the binary targets macOS 11+.

Beside the others

toolcpu watts on macOS 27sudolives in
plottypus 1.0.015–48 W, measurednoterminal
macmon 0.8.20.0 W in 20 of 20, measurednoterminal
mactop 2.1.50.0 W in 20 of 20, measuredno (fan control: yes)terminal
Stats 3.0.170.00 W in user reports (#3608, #3621)nomenu bar
btop 1.4.7not shownnoterminal

Measured rows: our M5 Pro, 2026-09-24. Stats: not run by us. btop has the look people copy, and it is cheap at its 2 s default (1.3% of a core on our M5 Pro, btop 1.4.7, measured 2026-09-23). Since 1.4.7 it shows Apple Silicon GPU watts; it does not show CPU watts on macOS.

Every comparison, dated and sourced

price

Free now. Pro later.

Free. Every live reading stays free. Personal or commercial use, on any number of Macs, under the EULA. The source is not open.

Pro is not on sale yet. Planned: $9 at launch, then $12, one time, three Macs, every 1.x update. Built once the free launch passes 500 installs or stars. No waitlist, no email form.

What Pro will add, and the offline licence

faq

Questions a skeptic asks

Does it need sudo?

No. Every reading comes from calls an ordinary user may make: the SMC through IOKit, IOReport, HID sensors, Mach and sysctl. Root would only add other users' processes; without it their rows show — (on our Mac, 295 of 890 processes).

How accurate is it on M1 to M4?

It has run on one Mac so far, an M5 Pro (Mac17,8) on macOS 27.0. Other chips run from per-chip tables pinned by fixture tests. There, CPU watts come from IOReport: held with ≈ and an age between batches, and — once the last batch is more than 10 s old. If you have another chip, plottypus doctor prints what it can read; please send it.

Why is it free, and why is the source closed?

Free to use under the EULA. The source is not open. Free covers personal and commercial use on any number of Macs, and every live reading stays free. A paid Pro edition is planned for later; it is not on sale.

Does it touch the network?

The app makes no network connections: no telemetry, no update check, no crash reporter. The site sets no cookies. Vercel Analytics and Speed Insights count page views and load times.

Does it run on Intel Macs or Linux?

No. It reads Apple Silicon counters (IOReport channels, SMC keys, cluster residency), so it ships for arm64 macOS only.

What does — mean?

No reading. The kernel refused (EPERM for another user's process), the Mac has no such sensor, or a held watt figure is more than 10 s old. plottypus never prints 0 for a number it does not have; the JSON output prints null.

Why not sudo powermetrics?

powermetrics is Apple's own sampler and it needs root. plottypus reads the same class of counters without sudo and puts them next to clocks, temperatures, memory and processes on one screen.

install

One line, no sudo

terminal
curl -fsSL https://plottypus.com/install.sh | shplottypus

The script checks the SHA-256 before it copies anything, installs to ~/.local/bin (it prints the PATH line if that is missing) and never asks for sudo. A Homebrew tap is coming.

or by hand

plottypus-v1.0.0-macos-arm64.tar.gz (1.1 MB)

sha-256 89cdc2d1993dde0607d942103f393fb5bda6b38e1666ef96c3534d2c56e59f9b

Install, verify, uninstall