Your battery, watched properly.
VoltGuard sits in the menu bar and tells you before the battery gets too low — or before it sits at 100% all afternoon, quietly wearing itself out.
What it actually does
Every ten minutes — and instantly whenever you plug in or unplug — VoltGuard reads the battery, compares it against the rules you set, and alerts you if one matches. That is the whole product.
It is deliberately small. There is no dashboard to keep open, no account, and no window unless you ask for one. It reads the battery through IOKit rather than shelling out to pmset on a timer, so it costs about 12 MB of memory and rounds to 0% CPU while idle.
Two things make it more useful than the low-battery warning macOS already gives you: it also warns on the high side, which is what actually extends battery lifespan, and it understands whether you are plugged in, so 20% on mains does not nag you.
Install
-
Download and drag
Open VoltGuard.dmg and drag VoltGuard into Applications.
-
Get past Gatekeeper, once
The first launch is blocked with “Apple could not verify VoltGuard is free of malware.” Nothing was scanned and nothing was found — that message means Apple has not seen this developer before, because notarization needs a paid Apple Developer account.
Dismiss it with Done, open System Settings → Privacy & Security, scroll to Security, and click Open Anyway. Right-click → Open stopped working in macOS 15.
Or skip it from the terminal:
xattr -dr com.apple.quarantine /Applications/VoltGuard.app -
Answer five questions
Setup asks for your thresholds, how you want to be alerted, how often to check, and whether to start at login. Skip it and you get sensible defaults: critical at 15% and low at 25% on battery, a charging warning at 80%, and a note when it reaches 100%.
Prefer to build it yourself? git clone, then make bundle. A locally built copy is signed on your machine and never shows the Gatekeeper prompt.
Alert rules
There is no fixed “low setting” and “high setting”. You get a list of named rules, and you can add, rename, retune or delete any of them.
Four ship enabled by default:
| Rule | Fires when | Default |
|---|---|---|
| Critical | at or below 15%, on battery | On, repeats every 5 min |
| Low | at or below 25%, on battery | On |
| Charging Warning | at or above 80%, plugged in | On |
| Full | at 100%, plugged in | On, once per charge |
Each rule has five knobs
- Threshold and direction
- A percentage, and whether it is a low or a high rule. Exactly at the threshold counts — 20% fires a 20% rule.
- Power condition
- Only on battery, only while plugged in, or either. This is what stops a 20% warning nagging you while you are charging.
- Channels
- Notification, sound, voice, dialog — chosen per rule, in any combination.
- Repeat
- Once, every 5/10/15/30/60 minutes, or continuously until the condition clears.
- Release margin
- How far the battery must recover past the threshold before the rule can fire again. Defaults to 3%.
Why alerts don’t spam you
A rule latches when it first matches, and alerts once. While it stays latched it only repeats if you asked it to. It unlatches when the battery clears the threshold by the release margin — so a 20% rule arms at 20% and only resets at 23%.
Without that margin, a battery hovering at 19/20/19/20 would unlatch and re-latch repeatedly and alert every time. Re-entering a threshold is supposed to alert you again; oscillating on the boundary is not.
How you get told
- Notification
- A standard macOS notification. Critical low rules are sent as time-sensitive so they break through a Focus.
- Sound
- Any built-in alert sound, or your own audio file. If both notification and sound are on, the sound rides on the notification — you hear one sound, not two.
- Voice
- Speaks the message aloud using any installed system voice, with adjustable rate, volume and tone. Each rule has a Listen button so you can hear its message before it ever fires.
- Dialog
- A modal alert for things you must not miss. Only one appears at a time, and it never blocks monitoring.
Messages are yours to write, with {battery}, {threshold}, {status}, {power_source} and {time} filled in. Every message has Reset to Default.
If you deny notification permission, VoltGuard says so in its menu and keeps the other three channels working. A missing sound file falls back to the default; an uninstalled voice falls back to the system voice. A broken channel never takes the alert down with it.
Schedules
By default VoltGuard is always active. You can instead restrict it to windows — weekdays 09:00–18:00, or 22:00–07:00 overnight, or several at once.
Overnight windows that cross midnight work correctly and belong to the day they started on: a Friday 22:00–07:00 window is active at 03:00 on Saturday, but not at 23:00 on Saturday. Outside every window the menu bar says so and nothing fires.
History, statistics and export
Every reading is written to a local SQLite database — but only when something changed, or after 30 minutes of nothing happening, so it stays at a few hundred rows a day.
- History
- Battery level over 24 hours, 7, 30 or 90 days.
- Statistics
- Average, minimum and maximum, time spent charging and discharging, and how many low and high alerts fired.
- Charging sessions
- Every time you plugged in: when, from what percentage to what, and the peak reached.
- Alerts
- Which rule fired, when, at what level, through which channels, and whether it was actually delivered.
- Export
- CSV, JSON or plain text, for everything or a date range you pick.
- Retention
- 7, 30, 90, 365 days or forever. Defaults to 30. Export Before Deleting only deletes once the export file exists.
Paused stretches are recorded as paused, so a gap in the chart is honestly a gap rather than a flat line. Time asleep is capped when computing durations, so a laptop shut for three days does not register three days of discharging.
Settings
Eight tabs, reachable with ⌘,. Every control has Reset to Default, and Advanced has Reset All Settings — which leaves your history alone.
| General | Monitoring on/off, check interval, launch at login, current battery status |
| Alerts | The rule list and the editor for the selected rule |
| Schedule | Active windows and the days they apply to |
| Voice & Sound | Default sound, custom sound file, voice, speech rate, volume, previews |
| History | Retention, export, and the delete actions |
| Appearance | System / Light / Dark, accent colour, battery percentage in the menu bar |
| Advanced | Debug logging, open and clear logs, diagnostics, reset |
| About | Version, update channel and checks, links to source and issues |
Updates
VoltGuard updates itself through Sparkle. Every build is signed with an EdDSA key, and the public half is compiled into the app — so even if someone took over the update feed, an update they signed would be refused.
Checks run daily in the background, or on demand from About. There are two channels: stable, and beta if you opt in. Installs are atomic, so a failed update leaves the version you are running untouched.
Privacy
The update check is the only network request VoltGuard ever makes.
No account, no analytics, no telemetry, no crash reporting service. Battery history stays in ~/Library/Application Support/VoltGuard/ on your Mac. The diagnostic report for bug reports is shown to you to read first, and is never submitted automatically.
That is a claim you can check rather than trust: the source is public, and there is exactly one file in it that opens a socket.
When something looks wrong
- macOS says VoltGuard can’t be verified
- Expected — the build is signed but not notarized. See Install, step two.
- No notifications arrive
- Check System Settings → Notifications → VoltGuard. When permission is denied VoltGuard shows a row in its menu that takes you there, and other channels keep working.
- The menu bar says “Unavailable”
- A battery read failed. VoltGuard retries with a growing delay and recovers by itself; Advanced → Export Diagnostics shows the underlying error.
- It says this Mac has no battery
- Correct on a desktop Mac, where VoltGuard stops polling entirely. On a laptop, export diagnostics and open an issue.
- Alerts arrive too often
- Raise the rule’s repeat interval, or its release margin if the battery is hovering right on the threshold.
- Nothing alerted after waking
- By design. VoltGuard does not replay an alert you already dismissed. A genuinely critical level after waking still alerts.