A lightweight macOS menu bar app that adds a bias slider for fan speed — raises the minimum fan RPM while letting macOS automatic thermal control continue above that floor.
- Bias slider — set a minimum fan speed floor from 0% (system default) to 100% (max RPM)
- Thermal safety — automatic ramp-up curve keeps fans higher when CPU gets hot, regardless of slider position
- Live monitoring — real-time CPU temperature and per-fan RPM readings in the menu bar popover
- Sleep/wake aware — automatically re-applies fan settings after waking from sleep
- Auto-updates — built-in Sparkle updater checks for new versions
- Clean uninstall — resets fans to defaults when quitting or uninstalling the helper
- macOS 14.0 (Sonoma) or later
- Apple Silicon Mac (ARM64)
- Administrator password (for installing the privileged helper)
- Download the latest
.zipfrom Releases - Extract the zip
- Move Minimum Fan Control.app to your Applications folder
- Try to open it — macOS will block it the first time
- Go to System Settings → Privacy & Security and click "Open Anyway"
- The app will appear in your menu bar with a fan icon
- Click the fan icon and click Install Helper — enter your admin password when prompted
- Click the fan icon in your menu bar to open the popover
- The popover shows CPU temperature and current RPM for each fan
- Drag the Fan Bias slider to set your desired minimum fan speed:
- 0% — system defaults (automatic control only)
- 50% — fans run at least halfway between min and max RPM
- 100% — fans at maximum speed
- The thermal safety curve will push fans even higher if CPU temperature rises above 60°C
Two binaries work together:
- Minimum Fan Control.app — SwiftUI menu bar app (runs as your user)
- MinFanHelper — privileged daemon (runs as root, required for SMC write access)
The app communicates with the helper via HTTP on localhost:27015. The helper is installed to /Library/PrivilegedHelperTools/ and persists across reboots via launchd.
git clone https://github.com/NorthwoodsCommunityChurch/mac-fan-control.git
cd mac-fan-control
./build.shThe build script compiles both targets with SPM, creates the .app bundle, bundles the Sparkle framework, signs everything, and launches the app.
Mac Fan Control/
├── Package.swift # SPM manifest (3 targets)
├── build.sh # Build, bundle, sign, launch
├── Resources/
│ ├── Info.plist # App bundle metadata + Sparkle config
│ ├── AppIcon.icns # App icon
│ └── com.northwoods.minfanhelper.plist # Launchd daemon config
├── Sources/
│ ├── Shared/ # Shared between app and helper
│ │ ├── SMCKit.swift # IOKit SMC read/write
│ │ └── FanTypes.swift # Codable models for HTTP API
│ ├── App/ # Menu bar app
│ │ ├── MinimumFanControlApp.swift # @main, MenuBarExtra, Sparkle
│ │ ├── MenuBarView.swift # SwiftUI popover UI
│ │ ├── HelperInstaller.swift # Install/uninstall via admin dialog
│ │ └── HelperClient.swift # HTTP client for helper
│ └── Helper/ # Privileged daemon
│ ├── HelperMain.swift # Daemon entry point, sleep/wake
│ ├── SMCFanController.swift # Fan control + thermal curve
│ └── HTTPServer.swift # NWListener HTTP server
├── SECURITY.md # Security review findings
├── CREDITS.md # Third-party credits
└── LICENSE # MIT License
This app includes a privileged root daemon. See SECURITY.md for the full security review.
Key points:
- The helper daemon runs as root (required for SMC write access on Apple Silicon)
- The HTTP API is bound to localhost only (
acceptLocalOnly = true) - Bias values are validated to 0-100 range
- Thermal safety curve prevents dangerous fan settings
MIT License — Copyright (c) 2026 Northwoods Community Church
See CREDITS.md for third-party frameworks and inspiration.