FanBar — Free, Open-Source Mac Fan Control
A free, open-source Mac fan control app for the menu bar. Monitor temperatures and fan speeds, set a fixed RPM, or create temperature-based fan curves.
English · 简体中文 · 繁體中文 · 日本語 · Русский · Français
getfanbar.com · Is FanBar safe? · FanBar vs Macs Fan Control
Screenshots • Highlights • Download • Usage • Build • Architecture • Releases • Issues
FanBar supports macOS 11 Big Sur and later on compatible Apple Silicon and Intel Macs that expose readable AppleSMC fan data. It keeps everyday use safe and quiet with macOS automatic management, while making manual control available only after the signed control service is approved.
FanBar at a glance
FanBar is a free, open-source native macOS menu-bar app for monitoring CPU/GPU/SSD/battery temperatures and fan RPM. It keeps normal cooling under macOS automatic management, then offers bounded manual control only after you explicitly approve the signed helper.
- Supported Macs: macOS 11 Big Sur or later on Apple Silicon and Intel Macs that expose readable AppleSMC fan data.
- Cooling modes: Automatic, fixed target RPM, Silent, Balanced, Performance, and Extreme; each preset has an editable temperature-to-RPM curve.
- Safety boundary: targets stay within each fan's reported hardware range, and FanBar attempts to restore Automatic when a preset expires, the app quits, the connection is lost, or the helper fails. See exactly what the root helper can and cannot do.
- Compared with Macs Fan Control: read the source-backed comparison.
- Download: use the latest notarized GitHub Release; no account, subscription, or advertising is required.
- Compatibility evidence: check the source-linked device matrix for what has actually been observed on specific Macs.
📸 Screenshots
English interface in light and dark appearance. Switch to Simplified Chinese, Traditional Chinese, Japanese, Russian, or French from Settings → General → Interface language without restarting.
| Light | Dark |
|---|---|
![]() |
![]() |
On a Mac with two fans, each fan gets its own speed, status and range side by side. This capture is from a MacBook Pro (M2 Max) running Balanced.
| Light | Dark |
|---|---|
![]() |
![]() |
Cooling gives each panel preset its own editable temperature→RPM curve.
| Light | Dark |
|---|---|
![]() |
![]() |
Appearance chooses the menu bar icon and what the status item shows, previewed live in a simulated menu bar.
| Light | Dark |
|---|---|
![]() |
![]() |
General includes local device compatibility checks, control-service status, automatic restore, notifications, language, login, updates, and command-line and Raycast setup. Log records temperatures and fan speeds to CSV. Longer settings panes scroll.
| Light | Dark |
|---|---|
![]() |
![]() |
✨ Highlights
- At-a-glance status — Show the menu-bar icon, CPU temperature, average fan RPM, or both — side by side or stacked to save menu bar width.
- Six menu bar icons — Choose Swirl, Ringed, Bold, Propeller, Guard, or Outline; all are optically matched to system icons, and the hub turns solid while FanBar controls the fans. The icon spins with the fans and coasts to a stop when they halt; turn this off in Settings → Appearance to keep it still and save a little CPU.
- Desktop widget — On macOS 14 or later, add FanBar to the desktop to see average RPM, per-fan speeds, CPU temperature, and control mode. WidgetKit refreshes are system-scheduled and are not second-by-second.
- Live visualization — Each fan leads with its RPM and speed band on a 0-to-max meter. A compact grid shows CPU, GPU, memory, and disk load, colored green, orange, or red by level, with disk judged by free space. Monitor CPU/GPU temperatures plus SSD and battery temperatures when the Mac exposes them, with a rolling ten-minute chart.
- Multiple cooling modes — Restore macOS automatic control, set a target RPM, or choose the Silent, Balanced, Performance, or Extreme panel preset.
- Smart temperature curves — Each panel preset has its own editable curve that smoothly adjusts fan output from chip temperature.
- Selectable temperature source — Use CPU, GPU, or SSD temperature for curve control; unavailable sensors trigger the existing safe fallback.
- High-temperature notifications — Opt in to macOS notifications when CPU or GPU reaches a threshold you set (60–105°C, 90°C by default); each sustained high-temperature episode alerts once and re-arms after cooling down. Pick an alert sound that plays even when notification sounds are off or a Focus is on. While hot, the panel offers a one-click switch to maximum cooling.
- Command line and Raycast — The
fanbarcommand-line tool reads status and temperatures, switches presets, sets a fixed RPM, or hands the fans back to macOS from Terminal or scripts, with--jsonoutput for automation. Install it from Settings → General → Command Line & Automation, where you can also set up Raycast Script Commands. - CSV log — Record CPU, GPU, SSD, and battery temperatures, fan speeds, and the control mode every 2–60 seconds to CSV files in
~/Library/Application Support/FanBar/Logs, starting a new file on launch, at midnight, or never. - Safe fallback — Targets are clamped to each fan's reported hardware range. On quit, disconnect, or service failure, FanBar attempts to restore macOS automatic control.
- Native authorization flow — First-run guidance explains why the control service is needed and opens the correct macOS settings page.
- Six languages — English, 简体中文, 繁體中文, 日本語, Русский, and Français, or follow the system language.
⬇️ Download
The latest notarized build is on the GitHub Releases page:
| Chip | File |
|:--|:--|
| Apple Silicon | FanBar- |
| Intel | FanBar- |
| Universal (Sparkle updates use this) | FanBar- |
Install with Homebrew
With Homebrew installed, add this repository as a tap and install:
brew tap helson-lin/fanbar https://github.com/helson-lin/FanBar.git
brew install --cask helson-lin/fanbar/fanbar
The cask installs the signed, notarized universal app for Apple Silicon and Intel
into /Applications. Launch FanBar and approve its control service to enable fan
control. If you already installed FanBar manually, quit it and move the existing
/Applications/FanBar.app to the Trash before installing through Homebrew.
FanBar can update itself through Sparkle. To upgrade explicitly with Homebrew:
brew update
brew upgrade --cask helson-lin/fanbar/fanbar
To uninstall, quit FanBar first, then run:
brew uninstall --cask helson-lin/fanbar/fanbar
Add --zap to also remove saved preferences and caches. Homebrew may request an
administrator password to unload the fan-control service.
Requirements
- macOS 11 Big Sur or later
- A Mac that exposes fan data through AppleSMC
- Xcode 26 and Swift 6 for local builds
[!WARNING]
AppleSMC is an undocumented hardware interface. Lowering fan speed can increase temperature; sustained high speed can increase noise, power use, and mechanical wear. Use manual control only when you understand the trade-offs, and prefer Automatic or Smart cooling for normal use.
🚀 Usage
- Launch FanBar and read the current temperature and fan speeds from the menu bar.
- To control fans, choose Enable fan control and follow the macOS authorization prompt.
- Choose a panel preset or fixed RPM from the popover. Use Automatic at any time to return control to macOS.
On macOS 14 or later, open the Notification Center widget editor and add FanBar. The widget displays the latest snapshot published by the main app; WidgetKit controls refresh timing, so use the menu-bar popover when you need second-level telemetry.
Command line and Raycast
Install fanbar from Settings → General → Command Line & Automation → Command-line tool → Install…. It links /usr/local/bin/fanbar to the tool inside the app, so it updates with FanBar.
fanbar status # mode, preset, fans, temperatures
fanbar preset set performance
fanbar mode fixed 3000 --hold # keep it until you change it
fanbar mode auto # hand the fans back to macOS
Without --hold, macOS control comes back after the restore timer set in Settings. Add --json for machine-readable output. If FanBar isn't running, the command opens it in the background; switching modes needs the approved control service.
For Raycast, click Set Up in Raycast… in the same section, then add the script folder once in Raycast (Settings → Extensions → + → Add Script Directory). You get commands to switch presets, set a fixed RPM, return to Automatic, and see CPU, GPU, and SSD temperatures in root search.
Full reference: docs/cli.md.
Change the interface language
Open Settings → General → Interface language and choose:
- System — follow the Mac's current language (Simplified or Traditional Chinese, Japanese, Russian, French, otherwise English)
- English
- 简体中文
- 繁體中文
- 日本語
- Русский
- Français
🤝 Community
Contributing · Code of Conduct · Support · Security policy
Please report suspected vulnerabilities through the private channel in the security policy. Bug reports, feature requests, and usage questions use the public issue forms below.
🐛 Report an issue
Before submitting, search existing issues. Then choose an issue form for a bug, feature request, or usage question. Bug reports should include the FanBar version, macOS version, Mac model, and steps to reproduce. Please remove personal information from screenshots and logs.
🛠️ Build and run
Clone the repository, then build a local app bundle:
zsh scripts/generate-icons.sh
FANBAR_ALLOW_ADHOC=1 FANBAR_SIGN_IDENTITY=- zsh scripts/package-app.sh
open dist/FanBar.app
FANBAR_ALLOW_ADHOC=1 FANBAR_SIGN_IDENTITY=- creates a verification-only ad-hoc package. Its privileged helper cannot authenticate, so use a real signing identity for fan-control testing or distribution. See CONTRIBUTING.md for setup and validation.
Create a local DMG
FANBAR_ALLOW_ADHOC=1 FANBAR_SIGN_IDENTITY=- zsh scripts/build-dmg.sh
The default output is dist/FanBar-. To build a specific architecture:
FANBAR_ARCHS=arm64 FANBAR_APP_OUTPUT=dist/FanBar-arm64.app \
FANBAR_ALLOW_ADHOC=1 FANBAR_SIGN_IDENTITY=- zsh scripts/package-app.sh
FANBAR_SIGN_IDENTITY=- FANBAR_DMG_OUTPUT=dist/FanBar-arm64.dmg zsh scripts/build-dmg.sh dist/FanBar-arm64.app
FANBAR_ARCHS=x86_64 FANBAR_APP_OUTPUT=dist/FanBar-x86_64.app \
FANBAR_ALLOW_ADHOC=1 FANBAR_SIGN_IDENTITY=- zsh scripts/package-app.sh
FANBAR_SIGN_IDENTITY=- FANBAR_DMG_OUTPUT=dist/FanBar-x86_64.dmg zsh scripts/build-dmg.sh dist/FanBar-x86_64.app
Verify a DMG's signature, architecture, and installation structure with:
zsh scripts/test-dmg.sh dist/FanBar-0.6.3.dmg
🏗️ Architecture
FanBar separates the UI from privileged writes:
FanBar.app → privileged XPC → FanBarHelper (root) → AppleSMC
The helper does not expose arbitrary SMC writes. It only supports reading fans, setting a bounded target/preset/fraction, and restoring automatic control. macOS 13 and later use SMAppService; macOS 11–12 use a compatible launchd registration path.
📦 Continuous integration and releases
Pull requests must pass lint, format, zero-warning build, tests and diff coverage; see docs/code-quality.md.
FanBar uses Sparkle 2 for online updates. The stable feed is the appcast.xml
asset in the latest GitHub Release. Every update must pass Developer ID,
notarization, and FanBar's independent EdDSA signature verification.
Store Apple notarization credentials once on the release Mac:
xcrun notarytool store-credentials FanBar-notary \
--apple-id "your Apple ID" \
--team-id "64S5F787T9"
After committing an updated CFBundleShortVersionString and increasing
CFBundleVersion on main, publish locally with:
gh auth login -h github.com
FANBAR_NOTARY_PROFILE=FanBar-notary zsh scripts/release-local.sh
The local release command requires a clean main checkout and performs the
universal2 build plus separate arm64 and x86_64 DMGs, signing,
notarization, DMG verification, checksums, signed appcast, Git tag, and
GitHub Release upload. Existing releases are preserved by default; use
--replace-assets only for an intentional retry.
The Sparkle private key is stored in the login Keychain under the FanBar
account. Do not regenerate it after the first release because installed clients
must keep trusting the same public key. CI releases also require the exported
private key in the SPARKLE_PRIVATE_KEY GitHub Actions secret.
GitHub Actions validates universal2 builds on pushes and pull requests. Local
publishing is the default. To opt into tag-triggered CI publishing, set the
repository variable FANBAR_PUBLISH_FROM_CI=true and configure
SPARKLE_PRIVATE_KEY plus the other release secrets. Do not enable CI publishing
while using the local release command.
When CI publishing is enabled, push a tag matching the app version:
git tag -a v0.6.3 -m "FanBar 0.6.3"
git push origin v0.6.3
Update the Homebrew cask
When CI publishes a release, the homebrew job in macos-release.yml pins the
cask to it and opens a chore/homebrew-cask- PR; merge it once the
checks pass. After a local release, or to pin another tag, run the script and
submit the cask change in a PR yourself:
python3 scripts/update-homebrew-cask.py # Latest stable release
Or: python3 scripts/update-homebrew-cask.py v0.6.3
The script requires Python 3 and an authenticated gh CLI. It rejects drafts,
prereleases, and releases missing the universal DMG. Merge Casks/fanbar.rb into
main to make the new version available through brew update. The Homebrew CI
workflow checks cask style, the download checksum, installation, and removal.
⭐ Star History
🙏 Acknowledgements and license
Copyright © 2024–2026 Jarin He. FanBar's source code is licensed under the GNU General Public License v3.0.
You may use, modify, and redistribute FanBar—including commercially—as long as you comply with the GPL-3.0: keep the copyright and license notices, and release the source of any distributed modified version under the same license.
Name and icon are excluded. The "FanBar" name and the FanBar icon/logo are not covered by the GPL-3.0 license. If you distribute a modified version, you must rename it and replace the icon so it cannot be confused with the official FanBar.
The Apple Silicon control sequence references the MIT-licensed agoodkind/macos-smc-fan. See THIRD_PARTY_NOTICES.md for complete third-party attribution.
Thanks to these people for reporting bugs and helping make FanBar better:
![]() 倾藏 |
![]() 一撒撒一撒 |
![]() Taolela |
![]() Estelle00 |
Local compatibility checks
Open Settings → General → Device Compatibility to check individual temperature sensors, fan readings, and control-service/request states. Onboarding and cooling attention states lead to the same view.
Checks stay on this Mac: they do not contact a server, install the service, or change fan speeds. Missing readings and failed attempts do not establish incompatibility. Service readiness and accepted requests do not verify physical RPM; request evidence is session-only.
The bundled catalog matches model and OS/app/helper versions locally. It currently contains no formally verified records and says so explicitly. Reports can be previewed and saved as JSON offline. Optional reporting to https://report.getfanbar.com requires explicit consent; raw reports are private unless the user chooses publication after review. Independent withdrawal credentials are saved in this Mac’s Keychain before sending. The closed report schema excludes serials, unique device identifiers, users, paths, processes, and temperature history.
The open-source Workers + D1 service, public matrix, review interface, upload schema and processing rules live in services/compatibility and contracts.













