MacFan is a native macOS 26+ fan monitor and safety-first controller for Apple Silicon Macs. It uses SwiftUI for the application, a separately signed root LaunchDaemon for AppleSMC access, native XPC peer requirements, and a time-limited control lease that restores System Automatic on failures.
The repository currently contains no Verified hardware profile. One exact
MacBookPro18,1 / macOS 25G76 capability is available as Experimental
after an explicit Advanced-settings opt-in; all other unmatched combinations
remain read-only until they complete the documented safety matrix. After
changing Resources/HardwareProfiles.json, rebuild and use Repair Helper
Version so the LaunchDaemon reloads the new profile.
MacFan is a standalone debug host. Fan control itself lives in Swift packages so a later PowerToys-style suite can embed it. See architecture.
Requirements: macOS 26, Xcode 26.6, Swift 6.3, arm64, and
XcodeGen (brew install xcodegen).
MacFan.xcodeproj is generated from project.yml and not committed; the
scripts generate it via script/generate_project.sh. After changing
project.yml, rerun that script:
./script/generate_project.sh
./script/test.sh
./script/build_and_run.shThe local Run action builds without signing and does not install the helper. Developer-signed helper/XPC testing must use an Apple Development certificate from one Team. Release signing uses Developer ID Application.
See the design, installation, uninstallation, implementation status, and hardware validation.
Release maintainers use script/release.sh for the signed Developer ID,
notarization, staple, and Gatekeeper verification pipeline. It intentionally
fails before archive when the Team, Sparkle public key, or notary profile is
missing.
Source is Apache-2.0. Original visual assets are CC BY 4.0. Third-party notices
are in THIRD_PARTY_NOTICES.md.