Juice Bar is a minimal macOS menu bar utility that shows your Mac’s battery time remaining directly in the menu bar.
Examples:
3h 42m1h 08m
It is intentionally small:
- no windowed UI
- no onboarding
- no analytics
- no custom UI framework
Juice Bar lives in the macOS menu bar.
Juice Bar keeps your menu bar clean by hiding itself when there is no meaningful battery timing information to display.
Clicking it opens a small native menu with:
- current time remaining
- battery percentage
- charging status
- Refresh
- Launch at Login, when supported by the current build/runtime
- Quit
The menu bar item is intentionally hidden when Juice Bar does not yet have meaningful timing information to show, such as AC/not-charging states, brief transition periods after wake/plug/unplug, or when an estimate is rejected by safety checks as implausible.
- Open the project’s GitHub Releases page.
- Download
JuiceBar.zip. - Unzip it.
- Drag
JuiceBar.apptoApplicationsif you want to keep it there. - Open
JuiceBar.app.
Current GitHub releases are unsigned test builds.
That means macOS may block the app the first time you open it. If that happens:
- Try opening the app once.
- Open
System Settings > Privacy & Security. - Scroll to the security section near the bottom.
- Click
Open Anyway. - Confirm the prompt.
After that first approval, you should be able to open Juice Bar normally.
- Juice Bar does not open a normal app window.
- It appears in the menu bar when there is useful charging or discharging time information to show.
- If you do not immediately see it, the app may be in an AC or transition state where the menu bar item is intentionally hidden until a fresh plausible estimate is available.
- Discharge fallback baselines are persisted in
UserDefaults, so valid learned discharge behavior can still be reused after app relaunch or machine restart on the same macOS account. - Implausible estimates are hidden instead of clamped. Juice Bar currently rejects discharge estimates above 24 hours and charging estimates above 12 hours.
- macOS
- Xcode
- Swift 6 toolchain from current Xcode
JuiceBar.xcodeproj: real macOS app projectJuiceBar/: app source files, plist, and assetsPackage.swift: Swift package entry for quick local testingTests/: formatter testsscripts/release.sh: release helper scriptdocs/: release and distribution docs
- Open
JuiceBar.xcodeproj. - Select the
JuiceBarscheme. - Press Run.
- Look for the menu bar item.
swift test
env CLANG_MODULE_CACHE_PATH=.build/ModuleCache swift run JuiceBarFor runtime behavior testing, prefer the real .app bundle:
cd /Users/camerongustavson/CodeProjects/juice-bar
pkill JuiceBar
xcodebuild -project JuiceBar.xcodeproj -scheme JuiceBar -configuration Debug build
open ~/Library/Developer/Xcode/DerivedData/JuiceBar-*/Build/Products/Debug/JuiceBar.app./scripts/release.sh unsignedThat produces:
dist/export/JuiceBar.appdist/JuiceBar.zip
This repo does not create a release for every merge to main.
A GitHub release is created only when the root VERSION file changes in a merge to main.
Typical flow:
- Make your code changes.
- Bump
VERSIONonly if that PR should ship. - Merge to
main. - GitHub Actions creates release
v<version>and uploadsJuiceBar.zip.
More detail:
docs/versioning-and-releases.mddocs/release-workflow.mddocs/direct-distribution.mddocs/launch-at-login.mddocs/battery-behavior.mddocs/ui-setup.md
Juice Bar is currently set up for unsigned GitHub releases for early users and testers.
That means:
- releases can be built automatically
- users can download and run the app
- users must bypass Gatekeeper once on first launch
The project is also structured so signed and notarized releases can be added later without changing the basic versioning model.