blog

Check Mac CPU temperature in the terminal

Activity Monitor does not show a CPU temperature, a GPU temperature, or a fan speed. macOS has no built-in window for those numbers. pmset -g therm tells you whether the Mac has recorded thermal pressure, not a temperature in degrees. powermetrics can sample thermal data, and it needs sudo.

plottypus reads the sensors an ordinary user is allowed to read, and prints them in the terminal. No sudo.

sh
plottypus

The heat panel is the one to look at. Its title is the hottest reading, the GPU temperature, and the fans:

text
╭ heat  peak 47°  gpu 38°  fans idle ──── 35–50° [↗]╮

Expand it (the panel key is in Keys) and you get a graph per zone, the package, the GPU, one graph per fan, and other sensors the Mac exposes, such as the SSD. The border scale is the band of values on screen, not 0 to 100.

What the numbers are#

Temperatures come from two places, both without root:

  • the SMC key list, read through IOKit. On the M5 Pro that list is 3,626 keys, 285 of them temperatures;
  • the IOKit HID temperature services, such as the NAND sensor plottypus doctor lists.

Zone labels (super, performance, efficiency, GPU) are a mapping of those sensors for the chip. They are zone temperatures, not a per-core die temperature. Colour is tied to the degrees: 45°, 70°, 80°, 88° and 95° look the same in every theme.

Fans show rpm, and a graph, when they spin. When every fan is stopped the title says fans idle. Apple Silicon Macs often sit there at idle. A fanless MacBook Air has no fan to report: the heat panel keeps its temperatures and leaves the fans out. A Mac that exposes no temperature sensors to user space hides the heat panel. There is no and no 0 rpm standing in for a sensor that is not there. The mark for “the kernel did not give this” is . JSON prints null.

One sample, in JSON#

sh
plottypus --json | jq '{cpu: .temp.cpu_temp_avg, gpu: .temp.gpu_temp_avg}'

temp.cpu_temp_avg and temp.gpu_temp_avg are degrees Celsius. null means this sample has no such reading. The field list is in JSON output.

plottypus doctor prints the sensor census for the Mac you are on: how many SMC keys, how many of them are temperatures, every HID temperature service, and whether a fan exists. Paste that output if a chip looks wrong. The M5 Pro (Mac17,8) on macOS 27 is the machine these screens were checked on. Other chips are covered by the sensor tables and by fixtures, not yet by a hardware run of each one. The table is Supported Macs.

What this is not#

This is not a fan controller. plottypus reads rpm. It does not write a fan curve. It is also not a substitute for Activity Monitor when you need to force-quit an app: Activity Monitor names the process, and it does not name the temperature. The heat panel names the temperature, and the process list sits beside it.

The same window shows watts. Where those come from, and why some of them are marked , is Mac CPU watts without sudo. The panel reference is Panels.