Profile
Back to NewsBack
GitHub Trending 12 min
Reader Mode
helson-lin/FanBar: Free, open-source Mac fan control for the menu bar. Monitor temperatures, set fan curves — Apple Silicon & Intel.

helson-lin/FanBar: Free, open-source Mac fan control for the menu bar. Monitor temperatures, set fan curves — Apple Silicon & Intel.

8 hours ago

FanBar — free, open-source native macOS fan control

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

License: GPL-3.0 release downloads DMG downloads stars

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.
The official site publishes a concise llms.txt for answer engines and agents that need authoritative product facts.

📸 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
FanBar English menu-bar popover (Light) FanBar English menu-bar popover (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
FanBar English menu-bar popover on a two-fan MacBook Pro (Light) FanBar English menu-bar popover on a two-fan MacBook Pro (Dark)

Cooling gives each panel preset its own editable temperature→RPM curve.

Light Dark
FanBar English cooling settings (Light) FanBar English cooling settings (Dark)

Appearance chooses the menu bar icon and what the status item shows, previewed live in a simulated menu bar.

Light Dark
FanBar English appearance settings (Light) FanBar English appearance settings (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
FanBar English general settings (Light) FanBar English general settings (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 fanbar command-line tool reads status and temperatures, switches presets, sets a fixed RPM, or hands the fans back to macOS from Terminal or scripts, with --json output 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--arm64.dmg | | Intel | FanBar--x86_64.dmg | | Universal (Sparkle updates use this) | FanBar-.dmg |

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

  1. Launch FanBar and read the current temperature and fan speeds from the menu bar.
  2. To control fans, choose Enable fan control and follow the macOS authorization prompt.
  3. Choose a panel preset or fixed RPM from the popover. Use Automatic at any time to return control to macOS.
Fixed RPM and panel presets can restore macOS control after 15 minutes, 30 minutes, or one hour.

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
The setting is shared by the menu-bar popover, settings window, onboarding flow, status messages, helper errors, and the desktop widget.

🤝 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-.dmg. 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:

倾藏's avatar
倾藏
一撒撒一撒's avatar
一撒撒一撒
Taolela's avatar
Taolela
Estelle00's avatar
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.

Chat with me