Modeling absolute temperature from powermetrics, in a tmux split
Apple Silicon Macs measure their own junction temperatures continuously. They use those measurements to clock down, ramp fans, and decide when to throttle. The values are not exposed to userspace. What you get instead is powermetrics, which emits CPU power, GPU power, and "thermal pressure" as a discrete state (Nominal, Moderate, Heavy, Trapping, Sleeping). That's it. If you want to know whether your machine is currently running hot in a way that matters, you mostly have to model it.
powermetrics (the repo, not the tool) is that model, in a tmux split.
A pair of small shell scripts watch CPU and GPU power continuously. A second pair compute a thermal estimate from those power numbers using a simple lumped-element model: ambient temperature, an idle offset, a power-to-temperature theta per side, a clamshell-mode factor when the lid is closed, and a small bias for the display. The defaults are calibrated to my M-class laptop; everything is overridable on the command line:
AMBIENT_C=23 IDLE_OFFSET_C=9 DISPLAY_BIAS_W=2.5 \
CPU_THETA_C_PER_W=1.55 GPU_THETA_C_PER_W=1.35 CLAMSHELL_FACTOR=1.08 \
./tmux-wall.sh
The tmux layout sets two columns — CPU on the left, GPU on the right — refreshed every two seconds by default (SAMPLE_MS=2000). The display shows watts, the modeled absolute temperature, and the estimated CPU-vs-GPU gradient. The numbers are not direct sensor readings, and the project is honest about that everywhere: this is a model, with parameters that were derived from a few hours of "run a known workload, watch the fan, calibrate against fan-curve thresholds I trust."
The reason this exists is the same reason most observability projects exist: I wanted to see something the system was deliberately hiding from me. Apple's reasoning for not exposing junction temperatures is reasonable — they don't want every browser tab claiming the laptop is overheating because of a memory leak somewhere in the GPU stack. But for someone running long compute jobs locally (Jupyter, the autoresearch quantum loop, Aer simulations), the difference between "fan is loud because the laptop is hot" and "fan is loud because the laptop is about to throttle" is real.
A model is enough. You don't need junction-accurate temperatures to make good decisions about a long-running job. You need a number that moves consistently with the thing you actually care about. That's what this provides.
What becomes possible: a long-running compute laptop becomes its own slow telemetry station, with a tmux pane you can glance at and trust.