Skip to content
Release notes

What’s new.

Ampere ships small and often. This page tracks every release — the current version is 0.0.70, and the app offers updates right in the panel (or brew upgrade --cask ampere). Downloads and SHA-256 checksums live on GitHub Releases.

0.0.70

Latest
  • FixedAmpere says so when macOS charges the battery to full to calibrate it. Every few weeks while a charge limit is in use, macOS charges the battery to 100% once, to keep its state-of-charge estimate accurate, and ignores the limit until that charge is over. On firmware without CHTE that limit is the only thing Ampere has to hold the battery with, so the battery charged past the bound while the panel said holding, the estimate counted down to the upper bound, and the health check passed on a limit macOS had registered and was not enforcing. Ampere now sees the calibration charge begin: the status line says Auto: overridden — macOS is charging to full to calibrate the battery, the estimate aims at full, the About panel explains, and the health check reads suspended until the charge is over. Once the battery is full the status line changes to Auto: overridden — calibration charge done, macOS lifts the override within about 12 hours, and the About panel explains the wait: macOS lifts the override by the clock, at its next policy check about 12 hours after the charge began, not when the battery fills, and nothing ends it sooner, a restart included. The hold keeps following the level up, so when macOS hands the limit back the battery holds where it is, normally at full, as it does after Charge to Full; Discharge to Upper Bound brings it back to the bound. The charge itself cannot be stopped: Apple documents it, and it happens with the built-in charge limit too. See macOS’s calibration charge.
  • FixedA Mac on AC could be drawn as running on its battery for the minute after it woke. macOS rewrites the battery’s registry entry about once a minute, and the first snapshot after a wake can carry adapter figures the SMC has not sampled yet: 0 W in, 0 V on the input, while the battery supplies nothing either. No running Mac can do that, but Ampere took the zeros at face value. The Adapter Load, Adapter Voltage, Adapter Current and System Load cards read zero, and the power-flow diagram, which treats a plugged-in adapter measuring exactly 0 W as a dead one, showed the Mac on battery until the next snapshot arrived. Ampere now recognizes that snapshot as a reading that was never taken: those four cards show a dash until the next one, and the diagram keeps the plug. A dead adapter, 0 W in with the battery draining, as with a broken cable or a brick unplugged at the wall, still shows the Mac on battery. The charge hold was never affected; the status line and the hold come from macOS’s power-source state, not from these figures. See readouts right after a wake.
  • FixedCancelling Charge to Full holds the charge where it is. When the full charge had been started on top of a charge to the upper bound, whether Ampere armed that charge itself at a plug-in below the lower bound or you toggled it on, turning Charge to Full off stopped charging for a moment and then let it resume toward the upper bound: the earlier intent stayed armed underneath, and its row was hidden by the full charge, so nothing showed it and nothing could turn it off. On Macs held through the macOS charge limit the same cancel settled on the upper bound rather than a hold. Cancelling now clears that intent too, so the battery holds at its current level; below the lower bound the charge still continues to the upper bound, as the rules say. See Charge to Full.
  • FixedThe cleanup job waits for a copy of Ampere deleted while it was running. The job uninstalls once the bundle has been gone for two minutes and no copy of Ampere is running; a running copy ended the run, since a copy that runs on after its bundle vanished was taken to have been moved. A copy deleted from under itself (rm -rf, or an uninstaller that does not quit it first; Finder refuses to trash a running app, and Homebrew quits it) was read the same way, and quitting it later changes no watched path, so the helper, its sudoers rule, and every account’s preferences stayed until the next boot. The job now asks the kernel where each running copy’s executable is: a copy that still exists elsewhere on disk was moved and keeps everything, as before; one whose executable is gone, or sits in a Trash folder, is waited for, and everything is removed two minutes after it quits. See Clean uninstall.
  • FixedA late registration check cannot end a registration made again to the same email. Ampere checks its registration with the license server about once a day and whenever the registration window opens, and a “no longer valid” answer ends it. An answer counted as long as this Mac was registered to the email it had been asked about. Deregister this Mac while a check was still on the wire, register again to the same email, and an answer the server produced in between, after the deregistration, could land on the new registration: Ampere would have reported it lapsed and reset the charge bounds to the default range. Each answer is now tied to the registration it was asked about and applies to no other.
  • FixedA read the SMC refuses is no longer taken for a reading. 0.0.68 taught the helper to check the SMC’s own status on every write, not only whether the kernel accepted the call. Ampere’s own reads, the health check’s CHTE and CHIE and the battery temperature on macOS 27, still checked the kernel alone, so a read the SMC refused handed back zeros, which read as charging allowed with no discharge: the health check could pass on a state nobody had read, or fail and repair a key that had never drifted, and the temperature could read 0 °C. Both answers are now checked, and a refused read is skipped like an unanswered one. See Health checks.

0.0.69

  • ImprovedKeep Display On asks for Touch ID. Turning it on now takes the account owner’s authentication after the warning: Touch ID where a sensor is reachable, otherwise your account password (a Mac without a sensor, or a MacBook closed in clamshell mode), or Apple Watch where that is set up. It is the one switch on the panel that changes who can use the Mac, so whoever happens to be at an unlocked Mac can no longer flip it. The prompt is the system’s and Ampere stores nothing from it; cancelling it, or a prompt that fails, leaves the option off. Turning it off asks nothing, and a session resumed after a restart keeps the option without asking again. See Keep Awake.

0.0.68

  • FixedCancelling Charge to Full on macOS 27 no longer leaves the 100% limit in place. On Macs that Ampere holds through the macOS charge limit, a cancel that arrived while Ampere was still handing macOS the 100% target was recorded but not acted on: the panel showed the charge paused while macOS kept charging to full until the next poll, up to a minute later, and through sleep if the Mac slept first. The cancel is now applied the moment the hand-over finishes, and before sleep Ampere waits for a hand-over in progress and settles the target against what you asked for. See Firmware without CHTE.
  • FixedOn macOS 27 the health check warns, repairs, and releases as intended. On the same Macs, the check re-issues a target that macOS is not enforcing, silently the first time and with the mismatch warning if the limit still does not stick. Two things went wrong after a mismatch. The warning never appeared: each accepted hand-over counted as a successful repair, so the check started over every time; only a check that passes counts now. And the check forgot the target so the next poll would set it again, but nothing remembered passed for nothing in force: if Auto Charge was turned off before that poll, the release was skipped and the panel reported an unpaused, healthy Mac while the old limit stayed, and a limit left by a crashed session whose release had failed at launch survived the same way. Ampere now keeps “not confirmed” apart from “released” and writes the release regardless. See Firmware without CHTE.
  • FixedA crash watchdog that failed to start is retried, and nothing is held without one. The watchdog is what restores charging and sleep if Ampere dies. If it had failed to start at launch, everything went ahead without it and nothing warned: the mid-charge sleep hold, which keeps a lid-closed Mac awake for a charge that started below the lower bound, was applied anyway, so a crash would have left sleep disabled until the next launch, and an inhibit, an allow, or a macOS charge-limit target was written with no safety net behind it. Ampere now starts the watchdog again before the first hold and skips the hold until one is running, the rule the discharge command has always followed. Every other charge-control write retries the spawn first but still goes ahead without one rather than refusing charge control, since the next launch restores whatever it set; the status line and the menu bar icon warn while the safety net is missing. See The watchdog daemon.
  • FixedAn update cannot stall on a tool that writes a lot of diagnostics. While installing an update Ampere runs a few system tools and read their output one stream at a time, so a tool that filled its error stream before finishing would wait forever, and the update with it, stuck at Installing. Both streams are now read at the same time. None of the tools involved has been seen to do this.
  • FixedAn SMC that rejects a write or does not answer is no longer taken at its word. Three decisions trusted the wrong answer. The helper checked whether the kernel accepted a write to the SMC, not the status the SMC itself returns, so a write the SMC rejected could count as done, and the crash watchdog could retire itself before charging was really restored. The helper’s restore treats a missing CHTE key as nothing to restore, so Macs whose firmware dropped the key do not fail every restore, but it took any failed answer for “missing”: an SMC that momentarily did not answer (a bus collision, a timeout) had the restore skip the write, report success with charging still inhibited, and retire the watchdog on the strength of it. And Ampere itself, deciding once at launch whether to hold the charge through CHTE or the macOS charge limit, read a failed CHTE probe as “no such key”, so a Mac that has the key could have run the whole session on the macOS charge limit. Now both answers are checked on every write; only the SMC’s own not-found status counts as a missing key, and the write is attempted first; and an unanswered probe at launch is repeated, then, if the SMC keeps not answering, charge control goes on hold (controls hidden, nothing written, no password asked, the status line says why) and Ampere asks again at every poll until it answers. See Firmware without CHTE.
  • FixedThe cleanup job cannot purge a Mac that is only being upgraded. The job waited two minutes from whenever launchd started it, at boot included, then looked for the bundle once. brew upgrade quits Ampere and leaves the path empty for a few seconds between removing one bundle and placing the next; a wait that happened to end inside that gap would have uninstalled the helper and removed every account’s preferences and registration. The job now looks for the bundle first, every five seconds, and counts the two minutes from the moment it is first seen missing; any sighting ends the run. See Uninstall.
  • FixedA restore that fails at launch is retried, and the panel says so. After a crash or a forced shutdown mid-override, the next launch restores charging, discharge, and the sleep settings. If that restore failed, pmset not answering right at login for instance, Ampere logged it and carried on: sleep could stay disabled for the whole session, with the health check passing and no warning anywhere, until quit. Ampere now retries every two minutes until the restore lands, and the status line and the menu bar icon warn in the meantime.

0.0.67

  • ImprovedKeep Awake and Keep Display On now act as one session. Unplugging the power adapter ends a running session: both switches turn off, and plugging back in starts nothing until you turn Keep Awake on again; a session used to keep its intent on battery and re-engage on reconnect. Both switches are now disabled on battery rather than hidden. Keep Display On is an option of the running session: it can only be turned on while Keep Awake is on, and turning Keep Awake off, or the session expiring, turns it off too, so it is never left on without a session. See Keep Awake.

0.0.66

  • NewKeep Awake can keep the display on. A button with a display symbol beside Keep Awake’s duration menu, shown only while a power adapter is connected, makes a session keep the display on as well, so the Mac does not lock on its own while the session runs on power. It is off by default and asks before it turns on, because it changes who can use the Mac: anyone at it can, until you lock it or the session ends. A screen saver that is set to start may still start and lock the screen, and closing the lid, a hot corner, a manual lock, and a lock your organization manages all work as before. On battery the display sleeps normally. Like the rest of Keep Awake it changes no setting and cannot outlive the app. See Keep Awake.
  • ImprovedAmpere checks what can hold a charge before it takes control. It has always looked for the firmware’s CHTE key; now, when that key is missing, it also checks that this macOS actually has the charge limit it would hand a target to, by looking for the system component behind System Settings › Battery › Charge Limit rather than by reading the macOS version. A Mac with neither, firmware that lost the key under a macOS that predates the charge limit, used to get a hold that nothing enforced, while the battery charged to full and the helper’s cleanup could never finish. Such a Mac now monitors only: no admin prompt, nothing written, the controls hidden, and the status line and About panel say why. See Firmware without CHTE.
  • ImprovedA hold on the macOS charge limit no longer drains the overshoot. macOS takes up to a minute to apply a target, and a battery could climb a percent or two in the meantime; the firmware then drained it back down to the original number. The hold now follows the level to where it landed and stays there, so nothing is drained. Discharge to Upper Bound is unaffected: above the upper bound with that switch on, the firmware still drains to the bound.
  • ImprovedmacOS 15 Sequoia is supported again. 0.0.65 made the Homebrew cask and the in-app updater refuse macOS 14 and 15; both accept macOS 15 again, and the app asks for macOS 15 or later. Charge control on macOS 15 depends on the firmware: with the CHTE key it works as on any other Mac, but the firmware that later macOS 15 security updates install has no such key, and macOS 15 has no charge limit for Ampere to fall back on, so on that combination Ampere monitors only and says so (the check described above). macOS 14 stays unsupported: a copy of 0.0.65 or earlier already installed there still opens and is left as it is.
  • NewOne key, several Macs. A license key now registers several Macs at once, keys bought earlier included, and the registration window shows how many are in use (“Macs in use: 2 of 5”). A new Mac joins the others; once the key is full, deregister a Mac or release one under My Licenses at azcode.dev. The window also keeps the reason a registration ended, and a key sold for another app is now refused.

0.0.65

  • ImprovedAmpere now asks for macOS 26 Tahoe or later. It has only ever been built and tested on macOS 26 and 27, and on macOS 14 and 15 charge control depends on which firmware a security update happened to install, with no macOS charge limit to fall back on. The Homebrew cask now says so, and says Apple Silicon too, so brew install refuses an Intel Mac or an older macOS instead of installing an app that cannot control charging there. A copy already installed on macOS 14 or 15 still opens and is left as it is; from this release on it is offered no further updates.
  • ImprovedUpdates check the macOS they need. An update is offered only when this Mac runs the macOS the release asks for, and the downloaded app’s own minimum is verified before it is swapped in, so an update can never replace a working copy with one that will not open. On an older macOS, Check for Updates answers Needs macOS 26 and the installed version stays.
  • ImprovedRegistered copies report their macOS version. Registration and the daily license check now send the macOS version along with the app version, so we can see which systems registered Macs run and decide what Ampere has to keep supporting. Unregistered copies still contact no server at all. The fine print lists everything the license server keeps.

0.0.64

  • FixedBattery Served is back on macOS 27. The card is computed from the battery gauge’s count of hours in operation, and macOS 27 moved that count to a different place in the system registry, so the card showed a dash. The 0.0.63 notes said macOS 27 has no source for it; it does, and Ampere now reads the count from where macOS 27 keeps it. The years view also no longer shows a twelfth month in the last days before a full year.
  • FixedA panel dragged off the menu bar can be moved again on macOS 27. Dragging the panel away from the menu bar icon turns it into a floating window, but on macOS 27 that window then could not be dragged anywhere, because macOS 27 stopped treating the panel’s content as draggable window background. The detached panel now moves by any spot that is not a button, a switch, or a slider handle.

0.0.63

  • NewCharge control on macOS 27. The firmware that ships with macOS 27, and with the macOS 26.7 update, no longer exposes the key Ampere used to stop a charge. On that firmware Ampere now holds the battery through macOS’s own charge limit, the feature behind System Settings › Battery › Charge Limit: your bounds and toggles keep their meaning, Ampere hands macOS the target it needs, and the firmware enforces it, including during sleep and across a restart. Discharge to Upper Bound lets the firmware drain the battery down to the bound, with no sleep override; the firmware decides when to start, usually within a few minutes. The About panel names the mechanism in force. Macs whose firmware still has the key are unaffected.
  • FixedOn macOS 27 the health check stayed pending, Discharge to Upper Bound cycled between the bound and one percent above it, and with discharge off the panel showed charging paused while the battery charged to full. All three came from that missing key; the health check now verifies the limit macOS is enforcing.
  • FixedOn macOS 27 the Health card showed 100%, Temperature showed 32 °F, and Raw Charge fell back to the plain percentage, because macOS 27 moved those readings. They are read from where macOS 27 keeps them now. Battery age has no source on macOS 27 and shows a dash.
  • FixedQuitting on macOS 27 left the crash watchdog retrying every two seconds for as long as the Mac stayed up, because restoring the missing key failed. Every restore path now treats a key the firmware does not have as nothing to restore.
  • ImprovedReadable diagnostics. Everything the app, the helper, and the watchdog log now goes to the unified log under the subsystem com.az-code-lab.ampere, since macOS 27 redacts the old NSLog output. The watchdog also logs when a restore keeps failing and when it succeeds. Read it with log show --last 1h --predicate 'subsystem == "com.az-code-lab.ampere"'.
  • ImprovedIf the menu bar icon was hidden through System Settings › Menu Bar, relaunching Ampere shows it again, and the launch log says when the icon starts hidden.
  • ImprovedThe build hands the linker the SDK explicitly. Under Xcode 27 a bare swift build records the app as built against the macOS 14 SDK, which makes macOS run it in compatibility mode; on macOS 27 that opened an empty “Ampere Settings” window at launch. 0.0.63 is the first release built with Xcode 27, and it carries the right SDK version.

0.0.62

  • FixedReinstalling after an uninstall could still show the app as registered. Uninstall deleted the preferences file, but each logged-in account’s preferences daemon (cfprefsd) kept the old values cached and wrote them back, so a fresh install read the previous registration. Uninstall now clears them through cfprefsd, so a reinstall starts clean.

0.0.61

  • NewDeleting Ampere now removes its helper too. Once your account can run the helper, Ampere registers a root launchd job, listed under Ampere in System Settings › Login Items & Extensions, that watches the installed Ampere.app. When the app has been gone for two minutes, whether dragged to the Trash or removed with brew uninstall, the job has the helper restore charging and sleep settings and remove the helper, the sudoers rule, the state directory, itself, and every account’s preferences and caches, as if Ampere had never been installed. Upgrades and the in-app updater are unaffected, since the bundle is back within seconds.
  • ImprovedTwo helper commands replace the old manual removal steps: sudo /Library/PrivilegedHelperTools/az-ampere-smc purge restores and then removes everything at once, and uninstall does the same while keeping preferences, which is what Revoke uses. Neither removes anything if the restore fails. The cask no longer has a zap stanza; brew uninstall ampere alone is the complete removal.
  • ImprovedSeveral accounts on one Mac can keep charge control at the same time. The sudoers file now holds one line per account that has granted access, so a second account is asked for its password once and both stay authorized, instead of each switch between them evicting the other. An upgrade refreshes every line, so only the first account to launch the new version is prompted. Revoke removes only your own line and deletes the helper once no account remains.
  • ImprovedOnly one running copy of Ampere manages charge control at a time. With fast user switching, a copy launched while another account’s copy is already running shows battery information but stands by, saying which account holds control, and takes over automatically once that copy quits.

0.0.60

  • ImprovedThe root helper moved to /Library/PrivilegedHelperTools, a directory only root can write to, from /usr/local/bin. Before trusting the helper, Ampere now checks that it and every directory above it are owned by root, carry no write bits for other users, grant no write access through ACLs, and involve no symlinks; the crash watchdog is only ever launched from that checked path. Upgrading migrates the helper inside the usual single password prompt, restores the previous session’s charging and sleep state, and retires the old helper and its watchdogs. Preferences, bounds, and registration stay put.
  • ImprovedStartup now verifies that your account can run the helper without a password, not just that the helper is present. The sudoers rule names one account at a time, so if someone else on the same Mac grants access, you are asked for your password once on your next launch instead of every charge action failing quietly.
  • ImprovedQuit, Revoke, and the upgrade migration restore charging and sleep settings in one helper transaction, and the crash watchdog now retries until every step has succeeded instead of giving up after one attempt. Revoke removes the helper only after that restore succeeds; if it fails, the files and the watchdog stay and the panel says so.
  • Improvedbrew uninstall --zap ampere now quits the app, restores charging and sleep settings, and removes the helper from both its current and its former location. No need to quit Ampere first.

0.0.59

  • NewCustom charge bounds are now the licensed feature. An unregistered copy keeps every other feature and holds the battery in the default 40 to 60% range; its slider shows the bounds, but the draggers are locked, with a Register to change link right beneath them. Registering unlocks the draggers on the spot. If a registration lapses (deregistered, moved to another Mac, or found revoked by the daily check), the range returns to the default immediately and stays there across restarts. Network trouble never counts as a lapse.
  • ImprovedThe disk image is now signed, notarized, and stapled, the same treatment the app inside it already had. macOS can vouch for the download itself, not only for the app you drag out of it.
  • ImprovedThe repository now carries the full MIT license text, not just the one-line notice in the README.

0.0.58

  • NewKeep Awake — a switch on the panel that stops your Mac from going to idle sleep while a power adapter is connected. Pick a duration from 15 minutes to 8 hours (the session shows its end time and switches off by itself) or hold forever; a running countdown survives an app restart. On battery Ampere steps aside so the Mac sleeps normally, and plugging back in re-engages the hold. Built on a standard macOS power assertion, the same mechanism as caffeinate: no admin rights involved, the display still sleeps on its own schedule, and quitting the app (or a crash) releases it instantly.
  • ImprovedIn the power-flow diagram, the plug now faces outward, so its cord reads as feeding the flow toward your Mac instead of the prongs pointing at it.

0.0.57

  • ImprovedPlugging in or unplugging registers within about a second — polls now fire on macOS power-source notifications, not just the timer. A short unplug reliably cancels Charge to Full and stops an active discharge.
  • ImprovedThe health check now repairs what it finds. Firmware or a USB‑C power renegotiation can quietly reset the charge limit; Ampere re-applies the expected setting on the next poll instead of only reporting it, so a charge no longer runs past your upper bound (or stalls short of it) until the next sleep and wake. The orange warning now appears only if a repair fails to stick.
  • ImprovedIn-app updates swap the new version into place in one atomic exchange, so the app is never missing from disk mid-update, and a failed install cleans up after itself.
  • NewUpdate downloads show a cancel button in the panel footer.
  • FixedAmpere now shares the system-wide keep-awake switch with other apps that use it, such as Lidless. Finishing a mid-charge sleep hold no longer cancels their hold and puts a lid-closed Mac to sleep, and if one of them releases the switch while Ampere still needs it, the hold is re-applied on the next poll.
  • FixedAn edge case where a failed capture of your sleep settings could later restore a default display-sleep value instead of your own.

0.0.56

  • FixedCharging could run past the upper bound while the Mac slept — close the lid charging to 50%, come back to 65%. Charges no longer overshoot during sleep.
  • NewSleep-safe charging — a charge between the bounds pauses just before the Mac sleeps and resumes on wake, finishing exactly at the upper bound.
  • NewA charge that starts below the lower bound keeps the Mac awake until it completes, with the same warning discharge shows. Your sleep settings are always restored afterwards — even after a crash. Charge to Full still charges (and sleeps) through the night.

0.0.55

  • NewThe About panel links to this changelog.
  • FixedThe charge-bound sliders could stop responding to drag right after an in-app update; they now work immediately, with no restart needed.

0.0.54

  • ImprovedThe charge and discharge toggles appear only while a power adapter is connected; on battery they had no effect.
  • FixedA rare case where auto charge stopped at the lower bound instead of continuing on to the upper bound.
  • FixedTooltips in the panel.

0.0.53

  • ImprovedUI polish across the panel.

0.0.52

  • NewUpdate badge — a small blue dot appears on the menu-bar icon when a new version is ready; hover to see which one.

0.0.51

  • NewCharge to Full — a one-shot charge to 100% for days you need the whole battery. Your bounds stay untouched, and the toggle clears itself when the charge completes.

0.0.50

  • NewSetting to show or hide the battery percentage next to the menu-bar icon.
  • ImprovedUI refinements throughout.
  • FixedAssorted bugs.

0.0.49

  • NewAutomatic update checks against the Homebrew cask — a few minutes after launch and about once a day.

0.0.48

  • NewLicense registration in the panel — register a key, deregister, or move a seat to another Mac.
  • NewVerified in-app updates — every download is checked against the Homebrew cask’s SHA-256 and Apple’s code signature before install.

0.0.1 – 0.0.47

The foundation, laid across 47 releases: live power telemetry, charge bounds with micro-charge prevention, charge & discharge on demand, the SHA-256-pinned root helper, the watchdog daemon that undoes everything if the app dies, health checks, and state that survives restarts. The engineering story behind all of it is on the tech page.

Live telemetry Charge bounds Micro-charge prevention Discharge on demand Watchdog daemon Health checks

Running an older version?