|
| 1 | +<p align="center"> |
| 2 | + <img src="images/banner.png" alt="MacFansControl" width="100%"> |
| 3 | +</p> |
| 4 | + |
| 5 | +<p align="center"> |
| 6 | + <strong>Native macOS fan control for Apple Silicon and Intel</strong><br> |
| 7 | + Monitor every temperature sensor. Set precise fan speeds. Reduce noise during light work, maximize cooling under heavy loads. |
| 8 | +</p> |
| 9 | + |
| 10 | +<p align="center"> |
| 11 | + <a href="https://github.com/beyondthecode-bc/MacFansControl/releases/latest"><img src="https://img.shields.io/github/v/release/beyondthecode-bc/MacFansControl?style=flat-square&label=Download&color=blue" alt="Latest Release"></a> |
| 12 | + <img src="https://img.shields.io/badge/platform-macOS%2014%2B-lightgrey?style=flat-square" alt="Platform"> |
| 13 | + <img src="https://img.shields.io/badge/chip-Apple%20Silicon%20%2B%20Intel-orange?style=flat-square" alt="Apple Silicon + Intel"> |
| 14 | + <img src="https://img.shields.io/badge/languages-8-green?style=flat-square" alt="Languages"> |
| 15 | + <a href="https://github.com/beyondthecode-bc/MacFansControl/stargazers"><img src="https://img.shields.io/github/stars/beyondthecode-bc/MacFansControl?style=flat-square" alt="Stars"></a> |
| 16 | +</p> |
| 17 | + |
| 18 | +<p align="center"> |
| 19 | + <a href="https://github.com/sponsors/beyondthecode-bc"><img src="https://img.shields.io/badge/Sponsor-%E2%9D%A4-pink?style=flat-square&logo=github" alt="GitHub Sponsors"></a> |
| 20 | +</p> |
| 21 | + |
| 22 | +<p align="center"> |
| 23 | + Built with Swift and SwiftUI. No Electron, no web views, no bloat. |
| 24 | +</p> |
| 25 | + |
| 26 | +--- |
| 27 | + |
| 28 | +## Download |
| 29 | + |
| 30 | +Download the latest version from [**Releases**](https://github.com/beyondthecode-bc/MacFansControl/releases/latest). Unzip, move `MacFansControl.app` to Applications, and launch. |
| 31 | + |
| 32 | +The app includes built-in auto-updates via [Sparkle](https://sparkle-project.org) — you'll be notified when new versions are available. |
| 33 | + |
| 34 | +## Features |
| 35 | + |
| 36 | +**Temperature Monitoring** |
| 37 | +- Full sensor suite: CPU cores, GPU, SSD, battery, power regulators, ambient |
| 38 | +- Real-time readings in the menubar with customizable display format |
| 39 | +- Pin favorite sensors or category averages to the menubar |
| 40 | + |
| 41 | +**Fan Control** |
| 42 | +- Set exact RPM for any fan via slider |
| 43 | +- Link fans to temperature sensors with custom curves (min/max temp-to-RPM mapping) |
| 44 | +- Visual multi-point fan curve editor |
| 45 | +- One-click return to automatic (system-controlled) mode |
| 46 | + |
| 47 | +**Safety** |
| 48 | +- Watchdog process returns fans to safe speeds if the app crashes or is force-quit |
| 49 | +- Sleep/wake restoration re-applies your settings automatically |
| 50 | +- Fans always return to automatic on clean quit |
| 51 | + |
| 52 | +**Presets** |
| 53 | +- Save and switch between named fan configurations |
| 54 | +- Set a default preset that auto-applies on launch |
| 55 | + |
| 56 | +**Preferences** |
| 57 | +- Tabbed settings window: General, Sensors, Fans, Presets, Menu Bar, About, Disclaimer |
| 58 | +- Drag-reorder favorites, hide sensors, copy Markdown snapshots |
| 59 | +- Favorite category averages (CPU avg, GPU avg) for cleaner monitoring |
| 60 | +- Launch at login, dock icon toggle, temperature unit (C/F) |
| 61 | +- Per-app language override |
| 62 | + |
| 63 | +**Localization** |
| 64 | +- 8 languages: English, French, German, Spanish, Japanese, Korean, Portuguese (Brazilian), Chinese (Simplified) |
| 65 | +- Community translations welcome via pull requests |
| 66 | + |
| 67 | +## Supported Chips |
| 68 | + |
| 69 | +| Generation | Variants | |
| 70 | +|---|---| |
| 71 | +| **M1** | M1, M1 Pro, M1 Max, M1 Ultra | |
| 72 | +| **M2** | M2, M2 Pro, M2 Max, M2 Ultra | |
| 73 | +| **M3** | M3, M3 Pro, M3 Max, M3 Ultra | |
| 74 | +| **M4** | M4, M4 Pro, M4 Max, M4 Ultra | |
| 75 | +| **M5** | M5, M5 Pro, M5 Max, M5 Ultra | |
| 76 | +| **Intel** | Coffee Lake, Whiskey Lake, Ice Lake (Mac mini, iMac, and generic Intel Macs) | |
| 77 | + |
| 78 | +## Requirements |
| 79 | + |
| 80 | +| | Requirement | |
| 81 | +|---|---| |
| 82 | +| **OS** | macOS 14.0 (Sonoma) or later | |
| 83 | +| **Chip** | Any Apple Silicon or supported Intel Mac | |
| 84 | + |
| 85 | +## Getting Started |
| 86 | + |
| 87 | +### 1. Install the app |
| 88 | + |
| 89 | +Download and move `MacFansControl.app` to your Applications folder. |
| 90 | + |
| 91 | +### 2. Install the Background Helper |
| 92 | + |
| 93 | +On first launch, open **Preferences > General** and click **Install Helper**. |
| 94 | + |
| 95 | +The background helper allows MacFansControl to change fan speeds without asking for your password every time. Since the app is not yet signed with an Apple Developer certificate (coming soon), macOS will prompt for your administrator password during installation. This is a one-time setup — once installed, fan control works silently in the background. |
| 96 | + |
| 97 | +> **Why is this needed?** Changing fan speeds requires elevated (root) privileges. The helper runs as a small background service that handles these privileged operations securely via XPC, so the main app never needs root access itself. |
| 98 | +
|
| 99 | +### 3. Use the menubar |
| 100 | + |
| 101 | +MacFansControl lives in your menubar. Click the temperature readout to see sensors, fans, presets, and quick access to preferences. |
| 102 | + |
| 103 | +## Translations |
| 104 | + |
| 105 | +This repository hosts the translation files for MacFansControl. You can help translate the app into your language or improve existing translations. |
| 106 | + |
| 107 | +### How to contribute |
| 108 | + |
| 109 | +1. Fork this repository |
| 110 | +2. Edit an existing file in the [`languages/`](languages/) folder, or create a new one by copying `English.xml` |
| 111 | +3. Translate the string values (the text between `<string>` tags) — **do not** change the `id` attributes |
| 112 | +4. Keep any `%1`, `%2`, `%@`, `%d` placeholders in place — the app needs them |
| 113 | +5. Submit a pull request |
| 114 | + |
| 115 | +### Current languages |
| 116 | + |
| 117 | +| Language | File | Status | |
| 118 | +|---|---|---| |
| 119 | +| English | [`English.xml`](languages/English.xml) | Complete | |
| 120 | +| French | [`French.xml`](languages/French.xml) | Complete | |
| 121 | +| German | [`German.xml`](languages/German.xml) | Complete | |
| 122 | +| Spanish | [`Spanish.xml`](languages/Spanish.xml) | Complete | |
| 123 | +| Japanese | [`Japanese.xml`](languages/Japanese.xml) | Complete | |
| 124 | +| Korean | [`Korean.xml`](languages/Korean.xml) | Complete | |
| 125 | +| Portuguese (BR) | [`Portuguese_Brazilian.xml`](languages/Portuguese_Brazilian.xml) | Complete | |
| 126 | +| Chinese (Simplified) | [`Chinese_Simplified.xml`](languages/Chinese_Simplified.xml) | Complete | |
| 127 | + |
| 128 | +Want to add a new language? Copy `English.xml`, rename it to your language name, translate the values, and submit a PR. |
| 129 | + |
| 130 | +## Bug Reports & Feature Requests |
| 131 | + |
| 132 | +Please use [Issues](../../issues) to report bugs or request features. |
| 133 | + |
| 134 | +## Support the Project |
| 135 | + |
| 136 | +If MacFansControl saves you from fan noise or thermal throttling, consider supporting development: |
| 137 | + |
| 138 | +<p align="center"> |
| 139 | + <a href="https://github.com/sponsors/beyondthecode-bc"> |
| 140 | + <img src="https://img.shields.io/badge/Sponsor_on_GitHub-%E2%9D%A4-pink?style=for-the-badge&logo=github" alt="GitHub Sponsors" height="40"> |
| 141 | + </a> |
| 142 | + |
| 143 | + <a href="https://www.buymeacoffee.com/BEYONDTHECODE"> |
| 144 | + <img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" height="50"> |
| 145 | + </a> |
| 146 | +</p> |
| 147 | + |
| 148 | +--- |
| 149 | + |
| 150 | +## Troubleshooting |
| 151 | + |
| 152 | +### "MacFansControl" Not Opened — Gatekeeper warning |
| 153 | + |
| 154 | +MacFansControl is not yet notarized with Apple (Apple Developer certificate coming soon). On first launch you may see this dialog: |
| 155 | + |
| 156 | +<p align="center"> |
| 157 | + <img src="images/gatekeeper-not-opened.png" alt="MacFansControl Not Opened dialog" width="220"> |
| 158 | +</p> |
| 159 | + |
| 160 | +**To fix this:** |
| 161 | + |
| 162 | +1. Click **Done** to dismiss the dialog |
| 163 | +2. Open **System Settings > Privacy & Security** |
| 164 | +3. Scroll down — you'll see a message that MacFansControl was blocked |
| 165 | +4. Click **Open Anyway** |
| 166 | + |
| 167 | +<p align="center"> |
| 168 | + <img src="images/gatekeeper-blocked.png" alt="Open Anyway in Privacy and Security" width="420"> |
| 169 | +</p> |
| 170 | + |
| 171 | +This only needs to be done once. After that, the app will open normally. |
| 172 | + |
| 173 | +### Password prompt every time I change fan speed |
| 174 | + |
| 175 | +You need to install the background helper. Go to **Preferences > General** and click **Install Helper**. The helper runs as a privileged background service so you won't be asked for your password on every fan speed change. |
| 176 | + |
| 177 | +Since the app doesn't have an Apple Developer certificate yet, macOS will ask for your administrator password once during helper installation. This is expected and safe — the helper is a small daemon that only handles fan speed writes via the SMC interface. |
| 178 | + |
| 179 | +### The app doesn't appear after launching |
| 180 | + |
| 181 | +MacFansControl is a **menubar app** — it doesn't open a window on launch. Look for the temperature readout in your menubar (top-right area of the screen). If you don't see it, it may be hidden behind the notch on newer MacBooks — try closing other menubar apps to make room. |
| 182 | + |
| 183 | +### Fans show 0 RPM |
| 184 | + |
| 185 | +This usually means the background helper isn't installed or isn't running. Go to **Preferences > General** — if the helper status shows "not installed", click **Install Helper**. If it shows installed but fans still read 0 RPM, try clicking **Reinstall Helper**. |
0 commit comments