Open-source fan control for Intel Macs running Windows (Boot Camp).
Reads temperatures and fan speeds, and lets you force fan RPM or follow a temperature curve, by talking directly to the Apple SMC — the controller every Mac fan utility uses.
Boot Camp's stock fan curve is conservative, so these machines get hot and throttle under sustained load. FanCamp lets you ramp the fans earlier.
Experimental (v0.1), but working end to end: reading, forcing, curves and restoring automatic control are all verified on real hardware.
Tested on a MacBookPro16,1 (16-inch, 2019, T2) running Windows 11 Pro.
Both the T2 (MMIO) and pre-T2 (port) interfaces are implemented; only the T2 path has
been exercised on hardware, so reports from other models are very welcome —
run fancamp diag and open an issue.
Apple Silicon Macs cannot run Windows natively and are out of scope.
git clone https://github.com/john7rho/fancamp
cd fancamp
dotnet publish src/FanCamp -c Release -o publish
./publish/fancamp.exe install-driver # one-time, asks for admin via UAC
./publish/fancamp.exe statusNeeds the .NET 8 runtime (or add --self-contained -p:PublishSingleFile=true to the
publish command to get a standalone exe).
install-driver installs the signed InpOut
kernel driver (vendored in drivers/, MIT licensed) and sets it to load at boot.
After that one-time step, fancamp runs without admin.
fancamp status show fans and temperature sensors
fancamp set <fan#|all> <rpm> force a fan to a fixed RPM (clamped to its min/max)
fancamp auto [fan#|all] return fan(s) to automatic control
fancamp curve follow a temperature curve until Ctrl+C, then restore auto
fancamp curve --sensor TC0P --min-temp 50 --max-temp 80 --interval 5
fancamp keys dump every SMC key with type and value
fancamp read TC0P read one key
fancamp diag show how fancamp found and connected to your SMC
fancamp autostart install [curve options] run that curve at every login
fancamp autostart remove stop running at login
fancamp autostart status show the setup and tail the log
Real output from the test machine:
> fancamp status
Fans (2):
# Name Actual Min Max Target Mode
0 - 2585 1836 5297 2581 auto
1 - 2394 1700 4905 2390 auto
Sensors:
CPU PECI (TCXC) 68.3 °C
CPU proximity (TC0P) 64.1 °C
CPU package (TC0F) 70.9 °C
GPU proximity (TG0P) 65.2 °C
Battery (TB0T) 35.3 °C
Palm rest (Ts0P) 33.0 °C
Fan names read as - on T2 Macs because Apple dropped the FiID descriptor key there.
A quieter, cooler machine under load is usually just:
fancamp curve --min-temp 55 --max-temp 85fancamp autostart install --min-temp 60 --max-temp 90 --interval 5That writes a per-user Run entry — no admin, no scheduled task, and it shows up in
Task Manager's Startup tab where you can see and disable it like anything else. The
curve then runs in the background with its console hidden, logging to
%LOCALAPPDATA%\fancamp\curve.log.
fancamp autostart status # is it set up, is it running, last few log lines
fancamp autostart remove # stop starting at loginOnly one curve runs at a time: a second one exits rather than fighting the first, and
set/auto warn you when a background curve is about to override them.
Pick the ramp to suit the machine. A range that starts near idle temperature keeps fans audible all the time; starting a little above idle stays quiet when you are doing nothing and still ramps hard under load.
The SMC is the ACPI device APP0001. Its values live in a store of four-character keys:
F0Ac is fan 0's actual RPM, TC0P is the CPU proximity temperature. Forcing a fan
means writing its target (F0Tg) and flipping its mode key (F0Md).
There are two ways to reach it. Pre-T2 Macs use I/O ports at 0x300; T2 Macs (2018
and later) use a memory-mapped window and the ports read back 0xFF. FanCamp
discovers the addresses from the device's ACPI resources, prefers MMIO, and falls back
to ports.
Windows user-mode code can do neither port I/O nor physical memory mapping, so FanCamp uses the signed InpOut helper driver — the usual approach for open-source hardware tools on Windows.
Full details, including the register map and the quirks found along the way, are in
docs/PROTOCOL.md. This is a clean-room implementation from public
documentation (the Linux applesmc driver, the t2linux patches, smcFanControl); no
proprietary software was decompiled.
- Fan targets are always clamped to the fan's own reported
[min, max], so FanCamp cannot drive a fan below Apple's floor. Asking for 500 RPM gets you the minimum. - Mode changes are verified: FanCamp reads the mode back and rewrites it if the SMC did not take it, so "restored to automatic" means it actually happened.
curverestores automatic control on Ctrl+C, console close, logoff and shutdown — including when it is running hidden in the background.- If FanCamp is killed forcefully (
taskkill /F, a crash), the fans stay at their last forced speed and Apple's thermal management stays disabled until you runfancamp auto.fancamp statusalways shows which mode each fan is in. - Security: once installed, the InpOut driver can be opened by any local process —
that is what lets FanCamp run without admin, and it is the shared weakness of every
port-I/O helper of this generation. Remove it with
sc.exe delete inpoutx64if that tradeoff bothers you; a PawnIO backend is on the roadmap. - This is experimental software that pokes at your Mac's embedded controller. It uses the same mechanism as long-established tools, but there is no warranty — see LICENSE.
- Tray app with a live readout, so the background curve is visible at a glance
- PawnIO backend to replace InpOut
- Verify the port path on a pre-T2 Mac
- CI and signed releases
Issues and pull requests welcome, especially fancamp diag output from Mac models not
listed above. Sensor labels live in FanController.KnownSensors.
MIT — see LICENSE. The vendored drivers/inpoutx64.dll is MIT licensed by
its authors (drivers/inpout-license.txt).
Not affiliated with Apple. "Macs Fan Control" is a separate proprietary product by CrystalIDEA; FanCamp shares no code with it.