Skip to content

BatteryControl 1.3.0

Choose a tag to compare

@Ednk-1312 Ednk-1312 released this 21 Sep 04:53
· 7 commits to main since this release

BatteryControl 1.3.0

Daily-use polish, a first-class uninstall, and hardening from the pre-beta audit.

Uninstall, done properly

Settings → Uninstall BatteryControl… now does the whole job. The daemon first restores normal charging and verifies it, then removes the privileged helper, the LaunchDaemon plist, root-owned state, and the CLI. Success is only reported after the helper binary, the plist, and the loaded launch job are all confirmed gone — files disappearing isn't enough, since launchd can keep a job loaded after its plist is deleted. You choose whether to keep or remove local settings and history. The CLI gets the same path: batterycontrol uninstall --confirm (add --remove-data to wipe local data; without --confirm it refuses to do anything).

Real setup guide

"Open Setup Guide" on the helper banner used to do nothing but re-select the dashboard. It now opens an actual guide: what the helper is for, the three install steps, live helper status, and the Install Helper button. No more guessing.

Chronically Plugged In preset (50%)

A new preset for Macs that spend most of their time on power: 50% upper limit, 48% lower. The battery spends far less time at high charge and voltage, which can slow long-term wear. The preset row explains the reasoning honestly — it's not a guarantee, and occasional full charging still helps the gauge stay accurate.

Less noise below the floor

The "safety floor removed" warning on the discharge panel used to show the moment you flipped the switch, even with the target safely above 20%. Now the warning appears only when the discharge target is actually below 20%, and during a session only when the battery itself drops below 20%. The red switch and its confirmation dialog are unchanged.

Hardening (from the audit)

  • All privileged install/uninstall shell commands now validate the app path and quote arguments, so an unusual install location can't become command injection.
  • The daemon's XPC authorization no longer accepts any app signed by the same team — clients must also carry an approved code identifier (com.batterycontrol.app or the standalone CLI).
  • Local history writes are serialized, so clearing history or uninstalling can't be raced by an older queued write that resurrects deleted data.
  • Support bundles now include the last daemon-confirmed status snapshot (policy, override, telemetry, verification) so a report actually shows what BatteryControl believed it was doing, and event details get path-shaped values redacted before export.

Validation status

285 tests passing, zero compiler warnings, Release build clean, package contents and SHA256SUMS verified. Physical hardware validation remains what it has always been: the M3 MacBook Air (Mac15,13, mBoot-20457.1.29, macOS 15.8) profile is the one physically verified configuration. Everything else is capability-based. The uninstall flow's privileged removal steps were code-reviewed and unit-covered in this release but full physical uninstall validation is still pending — worth doing on a test machine before relying on it.

Full changes since 1.2.0: see commit 6241ffa.