← All projects

Fanctl

Smart fan control for Apple Silicon

Tang Yijia (Tom)

Category
Mac Apps
Platform
macOS 13+ · Apple Silicon
Version
2.7.0
Size
1.3 MB
License
MIT
Languages
8 languages

Smart, self-learning fan control for Apple Silicon Macs. Apple tunes the fans for silence and lets the chip run warm until it nears 90 °C — Fanctl lets you pick 48, 55 or 58 °C and a learning controller holds it, quietly.

Real appThe real menu bar panel
Web demoThermal simulator: CPU burn
Web demoCompare with the macOS stock curve

Try it in your browser

The demo below runs entirely in your browser on made-up sample data — it does not connect to any real service. Get the real thing on GitHub.

CPU temperature
— °C
 
Fan speed
—
 
System power
— W
t 00:00
Controller
—
 
  • Temperature
  • Target
  • Fan
  • Power
  • Other controller (dashed)

Same workload, two machines: the solid line is the controller you picked, the dashed line is the other one. The controller is ported from the real daemon (3-second control cycle, 2317–7826 RPM fan range of a 14" M4 Pro). The thermal model and the macOS curve (fans off or at the 2317 RPM floor, ramping only above ~85 °C) are simplified approximations, so absolute numbers are illustrative. The fan line turns grey whenever macOS is in control.

Reacts before the heat arrives

Whole-system power draw is roughly heat output, so Fanctl uses it as a feed-forward signal: when a build starts or a model loads, the fan target rises on the next control cycle instead of waiting for the die to warm up. On the developer's M4 Pro, a 10-thread CPU burn got a fan response in 6 seconds. Close to the target — or while temperature is climbing — the feed-forward is fully open; far below it, it backs off, because a lot of those watts (screen, peripherals) never reach the heatsink.

Glides instead of howling

On top of the feed-forward sits a PI loop on the temperature error, running every ~3 seconds. Back-calculation anti-windup bleeds the integral whenever the output clamp or the slew-rate limiter is saturated, so it never builds up a reserve that later overshoots. Every change is rate-limited, so speed transitions stay gentle. Under sustained heavy load, physics still wins — air cooling settles around 55–65 °C even at maximum RPM — and Fanctl holds that honest equilibrium rather than screaming at full speed forever.

Learns your machine

The feed-forward is a power → equilibrium-RPM map with anchor points at 10, 20, 35, 55 and 80 W, one map per profile. When temperature has been steady for a while, the bias the integral is carrying is moved into the nearest anchors, and the map is saved to disk. The longer it runs, the less work the feedback loop has to do — two Macs end up with two different controllers.

Quiet floor, and out of the way on battery

The SMC's advertised minimum (2317 RPM on the test machine) turns out to be advisory. With the optional low-speed range on, a light load and enough headroom, Fanctl drives the fans down to their real spin floor or stops them; any warmth brings them straight back. When it is comfortably cool it hands the fans back to macOS, and on battery it releases control and stops sampling entirely.

Three small programs do the work: smcfan (C, ~200 lines) talks to the AppleSMC fan registers, fanctld (a Python root daemon) runs the control loop, and the Swift menu bar app only reads the status files the daemon writes. Every exit path restores macOS fan control first, targets are clamped to the fan's probed range, and the chip's own thermal protection always outranks any software. No telemetry.