Any app that controls fan speed needs administrator privileges, and that's something you should always question. This page explains exactly what gets installed, what it can do, and how to remove it.
Why administrator permission is needed
Fan speed is managed by the SMC (System Management Controller), a microcontroller in your Mac that macOS does not allow a regular application to write to. Reading temperatures and RPM is harmless, but writing a speed requires system privileges.
That's why FanFan Control is split into two pieces: the app you see, which runs with your normal user permissions, and a small privileged helper that performs only the operations that require elevated permissions.
What exactly gets installed
The first time you turn on manual control, macOS asks for your password once and installs two files:
| File | What it is |
|---|---|
/Library/PrivilegedHelperTools/com.fanfancontrol.helper |
The helper. About 450 KB. |
/Library/LaunchDaemons/com.fanfancontrol.helper.plist |
The registration that tells macOS when to launch it. |
One important detail: the app doesn't copy these files
itself. macOS does it via SMJobBless, Apple's
official mechanism for this. The system verifies the signatures of both
parties before installing anything, and refuses if anything doesn't
match. The app never touches system files directly or asks for your
password on its own — the dialog you see is macOS's own.
What the helper can do (and can't)
This is the part that really matters. The helper does not execute arbitrary commands: it exposes a closed interface of six operations, and there is no way to ask it for anything else.
| Operation | What it does |
|---|---|
listFansAndTemps | Return fans and temperatures |
setFanRPM | Set the speed of a fan |
setFanAuto | Return a fan to system control |
setAllAuto | Return all fans to system control |
discoverKeys | Enumerate the SMC's sensor keys |
helperVersion | Report its version |
There's no access to files, no network access, and no command execution. Even if someone managed to communicate with it, the worst they could do is move the fans.
Two-way validation
The classic risk with this design is that malicious software finds the already-installed helper and uses it as a backdoor. This is prevented with a mutual cryptographic check:
- macOS verifies the helper before installing it: it checks that it's signed by the same developer as the app.
- The helper verifies whoever calls it. On every connection, it requires the calling process to meet this code requirement:
identifier "com.fanfancontrol.app" and anchor apple generic and certificate leaf[subject.OU] = "5P2FSRLTVZ"
In plain terms: it only accepts commands from a program that identifies
itself as FanFan Control, signed with a certificate issued by Apple,
whose development team identifier is exactly
5P2FSRLTVZ — ours. Any other process that tries to connect
is rejected, even if it's running as administrator. And because that
check is resolved by the operating system itself against the binary's
signature, it isn't enough for an impostor to just use the same name.
Signing, notarization, and Hardened Runtime
The app and the helper are built with Hardened Runtime, which prevents code injection into the running process, and are signed with a Developer ID certificate issued by Apple to Jaime Lillo Benito.
Every version is then submitted to Apple for notarization, where it's scanned for malicious code and returned with a certificate embedded in the download itself. You can verify this yourself before opening anything, once you've downloaded the DMG:
spctl -a -t open --context context:primary-signature -v FanFanControl.dmg
It should respond accepted and source=Notarized Developer ID.
That's why, when installing the helper, macOS shows a "Background Items Added" notice with the name Jaime Lillo Benito: that's the real name on the Apple Developer account used to sign it, and it's exactly the proof that Apple verified who's behind it. It's not an error, nor is it a field in the helper that can be changed — an installer with no identifiable name behind it would be the less trustworthy signal, not the other way around.
Thermal safety can't be turned off
Lowering fan speed too much can overheat the machine. That's why the app includes a limit that doesn't depend on your settings: if CPU temperature exceeds 95 °C, all fans immediately return to the system's automatic control, regardless of how they were set. There's no setting or preference that overrides this.
Your license doesn't go anywhere
The license is validated locally. The app has an Ed25519 public key built in, which it uses to verify the signature on your key; the private key used to sign it lives only on the purchase server and is never distributed. Because the check is mathematical rather than a lookup, activating the license requires no internet connection, and no identifier for your machine is sent anywhere.
The practical consequence: the app keeps working even if this website disappears someday. Your copy doesn't depend on any server.
One caveat worth stating: if a purchase is refunded, its key goes onto a list of annulled licenses that travels inside new versions of the app. There are still no internet lookups —the list is compiled into the signed binary— but a refunded license stops unlocking Pro as soon as the app is updated. See the refund policy.
Updates: optional and signed
The app can tell you when a new version is out. It's the only thing it ever asks the network, and it asks you the first time before enabling it: say no and it never connects, and you keep the whole application, undiminished.
With checking enabled, all that happens is that the app downloads a small file from this site listing the published versions. That request reveals the same as visiting any web page —your IP and the version you have installed— and carries neither your license, nor your email, nor any data about your Mac.
Every update is signed with an Ed25519 key different from the one that signs licenses, and its public half is built into the app. A download whose signature doesn't match is discarded before it is ever installed, so neither a compromised server nor someone intercepting the connection can slip in a tampered version. And, like any other, it arrives signed and notarized by Apple.
How to uninstall everything
Dragging the app to the Trash doesn't remove the helper, since it lives outside the app bundle. To remove it completely, in Terminal:
sudo launchctl bootout system/com.fanfancontrol.helper
sudo rm /Library/PrivilegedHelperTools/com.fanfancontrol.helper
sudo rm /Library/LaunchDaemons/com.fanfancontrol.helper.plist
Once removed, the fans return to macOS's control. You can also delete
the saved license by searching for
com.fanfancontrol.app.license in Keychain Access.
Have a question that's not covered here?
Write to soporte@fanfancontrol.com and I'll answer it.