What's Changed
Highlights
- macOS 27 Golden Gate support. Apple gated the SMC charge-control keys behind a private entitlement, so
battnow falls back to the native macOS charge limit (PowerUIAgent) when direct SMC control is unavailable. On macOS 27 it sets exact targets from 10% to 99%, below the Settings slider's 80% minimum.- Native mode has an upper limit only (no
lower-limit-delta). If the battery is above the limit, macOS may drain it toward the target even while plugged in, and macOS may occasionally charge to 100%.
- Native mode has an upper limit only (no
- One-time charging.
batt charge nowcharges to your limit right away;batt charge fullcharges to 100% once. Your limit is left unchanged. - MagSafe LED control now works in firmware-managed mode and adapter mode.
- macOS 15.8 (which ships
20xxxfirmware) keeps using firmware-managed limits. - Opt-in adapter mode (
sudo batt adapter-mode enable) for gated firmware. It enforces upper and lower limits by cutting wall power. It works only whilebattis awake and disables Force Discharge and auto-calibration.
Commits
Since v0.8.0:
- feat: add adapter mode for charge limiting on gated macOS 27 firmware by @tr3mo in #154
- fix: guard capabilities and charger with a mutex by @tr3mo in #159
- feat: add one-time charging by @DeLuke84 in #155
- feat: keep Clamshell mode awake during adapter disable by @DeLuke84 in #157
- feat: drive MagSafe LED in adapter mode by @igors-m4-liberdade in #165
- feat: support native charge limits on macOS 27 by @MandalorianY in #166
- feat: support MagSafe LED in firmware mode by @brookqin in #167
- fix: restore macOS 12 source builds without SMAppService by @mvanhorn in #170
- docs: add an MkDocs documentation site by @CHE3MZ in #168
- docs: fix broken star history chart by @Dessalines39394 in #150
Installation
GUI version
- Download
.dmgand open it (right-click open if macOS says it's damaged) - Drag
batt.apptoApplications - macOS may say it's damaged when you try to run it (it's NOT) and wants you to move it to trash. To fix it, run this in Terminal:
sudo xattr -r -d com.apple.quarantine /Applications/batt.app. - Run
batt.app. - Follow the MenuBar UI to install or upgrade.
- Disable macOS's optimized charging:
System Settings->Battery->Battery Health->i-> Turn OFFOptimized Battery Charging. Built-in charge limit also need to be disabled if you are on macOS 26.4 or later.
CLI version
Note
Command-Line version is already included if you have installed the GUI version.
Option 1: Installation Script (Recommended)
bash <(curl -fsSL https://github.com/charlie0129/batt/raw/master/hack/install.sh)Option 2: Homebrew
brew install batt
sudo brew services start batt # Do NOT forget sudo.Disable macOS's optimized charging: System Settings -> Battery -> Battery Health -> i -> Turn OFF Optimized Battery Charging. Built-in charge limit also need to be disabled if you are on macOS 26.4 or later.
Upgrade
GUI version
Just follow the installation steps again. After you open the new version of batt.app, click Upgrade Daemon... upgrade to the new daemon.
CLI version
Please use the same method (Installation Script / Homebrew) as you installed to upgrade batt. Using both methods will cause conflicts. If you don't remember how you installed it, you can check the binary location by running which batt. If it is in /usr/local/bin, you probably used the installation script. If it is in /opt/homebrew/bin, you probably used Homebrew.
Option 1: Installation Script
bash <(curl -fsSL https://github.com/charlie0129/batt/raw/master/hack/install.sh)
# Yes, the command is the same as installing.Option 2: Homebrew
Important
If you previously ran batt v0.7.3 or earlier, follow the one-time service-label migration before starting the service. When the Homebrew formula moved from v0.7.3 to v0.7.5, its service label changed from cc.chlc.batt to homebrew.mxcl.batt.
brew update
sudo brew services stop batt # Do NOT forget sudo.
brew upgrade batt
sudo brew services start batt # Do NOT forget sudo.Homebrew service-label migration
if sudo launchctl print system/cc.chlc.batt >/dev/null 2>&1; then
sudo launchctl bootout system/cc.chlc.batt
fi
sudo rm -f /Library/LaunchDaemons/cc.chlc.batt.plistCompatibility Matrix
Check your firmware version by running system_profiler SPHardwareDataType | grep -i firmware in Terminal. Do NOT rely on macOS version.
| Firmware Version | First macOS release | GUI | CLI (Prebuilt) | CLI (Build from Source) | Note |
|---|---|---|---|---|---|
6723.x.x
| macOS 11 Big Sur | ❌ | ❌ | ⚠️ | |
7429.x.x / 7459.x.x
| macOS 12 Monterey | ❌ | ⚠️ | ✅ | |
8419.x.x / 8422.x.x
| macOS 13 Ventura | ⚠️ | ⚠️ | ✅ | |
101xx.x.x
| macOS 14 Sonoma | ⚠️ | ⚠️ | ✅ | |
118xx.x.x
| macOS 15 Sequoia | ✅ | ✅ | ✅ | |
138xx.x.x / 18xxx.x.x
| macOS 26 Tahoe | ✅ | ✅ | ✅ | |
20356.0.0.0.15 ~ 20457.0.77.0.2
| macOS 27 Golden Gate Developer Beta 1~3 | ✅ | ✅ | ✅ | Firmware-managed limits |
20457.0.125.0.2+
| macOS 27 Golden Gate Developer Beta 4+ | ✅ | ✅ | ✅ | Native limits (10–99%, upper only) or opt-in adapter mode; see docs |
| Other | Unknown | ❓ | ❓ | ❓ |
- ❌: Unsupported
- ✅: Supported
- ⚠️: Not verified, but expected to work.
- ❓: Unknown, please raise an issue if you have tested it.
Note
Firmware version is different from macOS version. Old macOS versions may have newer firmware, e.g. macOS 15.8.2 has firmware 20457.41.3 (macOS 27 Golden Gate versions).
Note
macOS 15.8 updates ship 20xxx firmware but keep firmware-managed limits (upper and lower).
New Contributors
- @Dessalines39394 made their first contribution in #150
- @tr3mo made their first contribution in #154
- @DeLuke84 made their first contribution in #155
- @igors-m4-liberdade made their first contribution in #165
- @MandalorianY made their first contribution in #166
- @mvanhorn made their first contribution in #170
- @CHE3MZ made their first contribution in #168