verdict
Use macmon if you want a small, open-source (MIT) power dashboard, or a Prometheus endpoint today: macmon serve exposes /metrics and can install itself as a launchd agent, and plottypus 1.0.0 has no exporter. It is also the one to read if you are writing your own IOReport client. Use plottypus if you are on macOS 27 and want CPU watts, or want processes, battery, fans, disk and network in the same window. In our side-by-side run on macOS 27, macmon reported cpu_power as 0.0 W in 20 of 20 samples while plottypus read 0.2 to 44 W.
At a glance#
Checked 2026-09-24 on a MacBook Pro Mac17,8 (M5 Pro), macOS 27.0, macmon 0.8.2 from Homebrew.
| plottypus 1.0.0 | macmon 0.8.2 | |
|---|---|---|
| CPU watts on macOS 27 | Yes. Live from SMC power rails on the M5 Pro; other chips get the last IOReport batch, marked ≈ with its age |
0.0 W in 20 of 20 samples on our M5 Pro |
| GPU MHz / °C | Yes / yes | Yes / yes |
| Per-cluster clocks | Yes, labelled Super, Performance, Efficiency | Yes, per cluster and per core (M5 clusters labelled P and S) |
| Per-process energy / GPU | Watts per process; GPU share in the details card | No process list |
| Needs sudo | No | No |
| Self-cost, same Mac and method | ~1.5% of one core at 500 ms, ~1.0% at 1 s | 1.47% at its 1 s default |
| Works over ssh / in tmux | Yes | Yes |
| Process actions | TERM, KILL, INT, STOP/CONT, any signal, renice, background QoS | n/a |
| JSON output | --json, --json-stream |
macmon pipe, plus serve (JSON and Prometheus over HTTP) |
| Themes / translucent windows | 10 built-in plus one built from your terminal’s palette; glass keeps cell backgrounds clear |
6 colour variants |
| Platforms | macOS on Apple Silicon only | macOS on Apple Silicon only |
| Price / licence | Free download, proprietary EULA; a paid Pro tier is planned, not on sale | Free, MIT |
Sources: macmon 0.8.2 release, macmon README, our own run below.
CPU watts on macOS 27#
macmon reads the IOReport “Energy Model” counters and divides each change by the sampling interval. That was the right recipe until macOS 27. Now the CPU, ANE and DRAM counters publish in batches, 2 to 108 seconds apart in our captures, and between batches the counter does not move, so the change over one second is zero. GPU Energy still publishes on every read, which is why GPU watts still work. The long version, with the raw captures: why macOS 27 shows 0.00 W CPU power.
We ran both tools at once for 20 seconds under load, one sample a second:
macmon pipe -s 20 -i 1000 | jq .cpu_power
plottypus --json-stream --count 20 -i 1s | jq .cpu_power| Samples (2026-09-24, M5 Pro, macOS 27.0) | macmon 0.8.2 | plottypus 1.0.0 |
|---|---|---|
cpu_power |
0.0 in all 20 | 0.18 to 44.19 W |
sys_power |
11.0 to 77.0 W | 18.0 to 77.0 W |
A second 20-second run ten minutes later, with mactop 2.1.5 added, gave the same picture: cpu_power 0.0 in all 20 samples from macmon (and 0 from mactop) while plottypus read 15.27 to 48.44 W.
Both agree on system power, which comes from the SMC PSTR key, not from IOReport. On the M5 Pro, plottypus takes CPU watts from the SMC’s CPU power rails, calibrated to 0.90–1.00× of IOReport; the SMC sweep runs every 2 s, so values change in pairs in a 1 s stream. On other chips plottypus uses the same IOReport counter as macmon but divides by the driver’s own timestamps, holds the value between batches with its age, and returns null once it is more than 10 s old. macmon returns 0.0 for ANE and DRAM too when nothing published, where plottypus returns null.
One window or two#
macmon is a silicon dashboard: E and P clusters, GPU, ANE, memory, power sparklines, temperatures. It stays readable in a small window, which is its point. It has no process list, no disks, no network and no battery.
plottypus puts the same silicon readings next to a process table with per-process watts, a battery panel with charge-hold reasons, fans with their idle state, and mirrored disk and network graphs. The Glance surface (v, or --surface glance) is the small-window layout.
Cost#
Measured with our perf-smoke.py script (160×45 pty, fresh config, medians of three 20 s windows, M5 Pro, macOS 27, 2026-09-23): macmon 0.8.2 used 1.47% of one core and about 0.005 W at its 1 s default. plottypus 1.0.0 uses about 1.0% at 1 s and 1.5% at its 500 ms default, about 0.007 W. The runs were hours apart on a busy machine, so call them even. macmon’s cost is almost all its sampling thread, one IOReport sample a second; plottypus samples the expensive PMGR provider every 2 s instead.
Switching from macmon#
plottypus’s JSON uses macmon’s field names where they exist, so most jq filters carry over:
| macmon | plottypus |
|---|---|
macmon pipe |
plottypus --json-stream |
macmon pipe -s 10 -i 500 |
plottypus --json-stream --count 10 -i 500 |
one sample: macmon pipe -s 1 |
plottypus --json |
cpu_power, gpu_power, ane_power, ram_power, sys_power, all_power, gpu_freq_mhz |
same names |
memory.ram_total, memory.ram_usage, memory.swap_total, memory.swap_usage |
same |
temp.cpu_temp_avg, temp.gpu_temp_avg, fans[] |
same |
ecpu_freq_mhz, pcpu_freq_mhz |
cpu.clusters[].freq_mhz, with kind set to efficiency, performance or super |
timestamp (ISO 8601) |
unix_ms |
0.0 when not measured |
null when not measured |
The last row is the one that breaks scripts: a filter like jq '.cpu_power // empty' skips the samples with no reading. Both tools’ first sample takes one interval, since a rate needs two reads.
In the TUI, macmon’s q quits in plottypus too. The rest differ: v switches between Work and Glance (not gauge and sparkline), T cycles themes (macmon’s c), and e on the cpu panel expands it to every core (macmon’s d).
If you rely on macmon serve for Prometheus, keep it: plottypus 1.0.0 has no exporter. One is planned for the Pro tier, which is not on sale yet.