# plottypus vs btop

Canonical: https://plottypus.com/vs/btop

Last updated: 2026-09-24

> btop 1.4.7 and plottypus 1.0.0 on an M5 Pro running macOS 27. CPU watts, cluster clocks, GPU temperature, self-cost, process actions and key mappings.

**Verdict.** Use btop if you also watch Linux or BSD machines and want one tool, one config and one set of keys on all of them. It runs on Linux, macOS, FreeBSD, NetBSD and OpenBSD, it is open source (Apache-2.0), and on Linux it reads NVIDIA, AMD and Intel GPUs, which plottypus does not. Use plottypus if the machine you care about is an Apple Silicon Mac. On our M5 Pro, btop 1.4.7 showed no CPU watts, no cluster clocks, 18 unlabelled cores and a GPU temperature of 0 °C. plottypus shows the Super and Performance clusters with their MHz, CPU and GPU watts, and per-process energy.

## At a glance

Checked 2026-09-24 on a MacBook Pro Mac17,8 (M5 Pro, 6 Super + 12 Performance cores, 20-core GPU), macOS 27.0, btop 1.4.7 from Homebrew with a fresh config.

| | plottypus 1.0.0 | btop 1.4.7 |
|---|---|---|
| CPU watts on macOS 27 | Live from SMC power rails on the M5 Pro; other chips get the last IOReport batch, marked `≈` with its age | Not shown on macOS |
| GPU watts | Yes | Yes, from IOReport (added in 1.4.7) |
| GPU MHz / °C | Yes / yes | 338 MHz shown / **0 °C** on the M5 Pro |
| Per-cluster clocks | Super, Performance and Efficiency clusters with MHz | Cores listed flat as C0–C17, no clocks |
| Per-process energy / GPU | Watts per process; GPU share in the details card | No / no |
| Needs sudo | No | No |
| Self-cost, same Mac and method | ~1.5% of one core at 500 ms, ~1.0% at 1 s | 1.30% at its 2 s default, 2.28% at 1 s |
| Works over ssh / in tmux | Yes | Yes |
| Process actions | TERM, KILL, INT, STOP/CONT, any signal, renice, background QoS | TERM, KILL, any signal, nice |
| JSON output | `--json`, `--json-stream` | No |
| Themes / translucent windows | 10 built-in plus one built from your terminal's palette; `glass` keeps cell backgrounds clear | 41 bundled theme files; `theme_background = false` for a transparent background |
| Platforms | macOS on Apple Silicon only | Linux, macOS, FreeBSD, NetBSD, OpenBSD |
| Price / licence | Free download, proprietary EULA; a paid Pro tier is planned, not on sale | Free, Apache-2.0 |

Sources: [btop 1.4.7 release](https://github.com/aristocratos/btop/releases/tag/v1.4.7), [btop README](https://github.com/aristocratos/btop/blob/v1.4.7/README.md), [btop's key list](https://github.com/aristocratos/btop/blob/v1.4.7/src/btop_menu.cpp), [btop's macOS collector](https://github.com/aristocratos/btop/blob/v1.4.7/src/osx/btop_collect.cpp). The btop screen readings are from our own capture at 160×45 on the machine above.

## What btop shows on an M5 Pro

btop's CPU box lists the 18 cores as `C0` to `C17`, each with a load bar and a temperature. It does not say which six are Super cores, and it shows no clock for any of them. On a Mac with two kinds of core that matters: a core at 100% and 1.3 GHz is doing a fraction of the work of one at 100% and 4.4 GHz.

The GPU line shows load, memory in use and power, and the GPU box (`5`) adds a clock. Its temperature read `0°C` on our M5 Pro; plottypus read 74–75 °C for the same GPU a few minutes earlier. btop tracks this as [issue #1653](https://github.com/aristocratos/btop/issues/1653), open on 2026-09-24. Its network download rate reading 0 B/s on recent macOS is [issue #1850](https://github.com/aristocratos/btop/issues/1850), also open.

plottypus puts the clusters first. Here is one sample from `plottypus --json` with every core busy:

```json
"clusters": [
  {"kind": "performance", "cores": 12, "usage": 1.0, "scaled": 1.0,  "freq_mhz": 4380},
  {"kind": "super",       "cores": 6,  "usage": 1.0, "scaled": 0.948, "freq_mhz": 4368}
]
```

`usage` is the share of time the cores were busy; `scaled` weights it by clock, so a cluster idling along at a low frequency does not look as busy as one at full speed.

## Watts

btop 1.4.7, the latest release (1 May 2026), shows GPU power on Apple Silicon: [#1541](https://github.com/aristocratos/btop/pull/1541) added a GPU backend that reads IOReport's `GPU Energy` channel. It shows no CPU power on macOS. The CPU power readout it gained in 1.4.5 ([#1227](https://github.com/aristocratos/btop/pull/1227)) is wired up in the Linux and BSD collectors only, and the 1.4.7 macOS collector never turns it on. plottypus reads CPU power without sudo. On the M5 Pro it comes from the SMC's CPU power rails, calibrated against IOReport. On other chips it comes from IOReport's `CPU Energy` counter, divided by the driver's own timestamps rather than by the sampling interval. On macOS 27 that counter publishes in batches seconds to minutes apart, so plottypus holds the last batch, marks it `≈` with its age, and shows `—` once it is more than 10 s old. It never shows a made-up 0.

System watts (the SMC `PSTR` key), GPU watts and, when the counters publish, ANE and DRAM watts sit beside it.

## Cost of leaving it open

Both tools only repaint when something changed: 0 idle redraws each. 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):

| | plottypus 1.0.0 | btop 1.4.7 |
|---|---|---|
| CPU, default interval | ~1.5% (500 ms) | 1.30% (2 s) |
| CPU at 1 s | ~1.0% | 2.28% |
| Energy (kernel estimate) | ~0.007 W (500 ms) | 0.011 W (2 s), 0.028 W (1 s) |

The btop runs and the plottypus 1.0.0 runs were taken hours apart on a machine with other builds going, so treat differences under about 0.3 points as noise. At its own defaults btop is a little cheaper, because it samples a quarter as often.

## Processes

Both have a filterable, sortable process table with a tree view, a details pane and signals. btop has per-process mini graphs and "follow process". plottypus adds, per process:

- energy in watts (the kernel's per-task estimate), GPU share, disk I/O and wakeups;
- footprint memory, the figure Activity Monitor calls Memory;
- STOP/CONT, renice and a background-QoS toggle in the details card;
- a kill refused if the pid has been reused since you selected it.

Without sudo, macOS will not describe other users' processes. plottypus shows `—` in those cells rather than a zero.

## Scripting

btop is interactive only. plottypus prints the same data as JSON, using macmon's field names where they exist:

```sh
plottypus --json | jq '{cpu_power, gpu_power, sys_power}'
plottypus --json-stream --count 60 -i 1s > build.ndjson
plottypus --diagnose        # "Busy: rustc using 9.1 cores" plus the evidence
```

## Switching from btop

plottypus ships a btop key profile. Turn it on in any of three ways:

```sh
PLOTTYPUS_KEYS=btop plottypus       # this session only
```

```toml
# ~/.config/plottypus/config.toml
keymap = "btop"
```

or `s` → keys → key profile inside the app. The help screen (`?`) follows the profile you pick.

| btop | In plottypus with the btop profile |
|---|---|
| `f` or `/` filter | same |
| `←` `→` sort column, `r` reverse | same |
| `e` tree | same (`t` also toggles the tree) |
| `o` options | `o` or `s` opens settings |
| `Enter` details | same |
| `q` quit, `m` menu, `?` help | same |
| `t` SIGTERM | `x` (plottypus asks `y`/`n` first) |
| `k` SIGKILL | `K` (`k` moves up, vim-style) |
| `s` signal menu | `Enter`, then `X` in the details card |
| `N` nice | `Enter`, then `+` / `-` in the details card |
| `+` / `-` update timer (±100 ms) | `]` or `+` samples faster, `[` or `-` slower |
| `p` presets, `1`–`5` toggle boxes | `1`–`5` are presets (silicon, ml, laptop, sre, ricer); `p` pauses |

Watch `t` and `k`. In btop they send signals; in this profile they toggle the tree and move the selection up, and every kill goes through `x`, `K` or the signal picker, each behind a `y`/`n` prompt.

Two config lines that make plottypus feel closer to btop's defaults:

```toml
interval_ms = 2000        # btop's update_ms default; accepts 250, 500, 1000, 2000 or 5000
glass = "on"              # like theme_background = false: never paint a cell background
```
