- 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.
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.
- 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.