
Free macOS menu bar app
UsageBar
Your AI usage and limits, live in the macOS menu bar
See Claude, Cursor, and ChatGPT usage at a glance from the menu bar — without opening another dashboard.
v2.2.1 · 26.0 MB · macOS · Apple silicon · free for personal and public use
What it does
AI usage at a glance
- Menu bar glanceable usage
- Stay aware without opening dashboards
- Free for personal and public use
Version history
UsageBar release notes
Every published version, newest first.
v2.2.1
Current9 Nov 2026Fixed
- The " · " between pinned metrics follows the menu bar's color — with two or more metrics pinned, the separator was drawn in the app's light or dark color, not the menu bar's, so on a dark menu bar in Light mode (or the reverse) it was nearly invisible. It now changes with the menu bar like the rest of the title.
- A value above 150 looks the same in the menu as in the menu bar — the menu bar shows such a value bare and untinted, as it isn't a percentage; its menu row showed it as one, with a red dot. The row now shows it gray, like the bar.
v2.2.0
8 Nov 2026Changed
- A menu bar icon drawn from the UsageBar logo — the gauge inside the ring, as on entelxcore.com, instead of a generic system symbol, tinted by usage as before.
- A clearer menu — each provider is a section with a small header (the app's logo on the first), and each metric one row: a half dot toned by usage (teal up to 49%, orange up to 74%, red above, the same bands as the menu bar), the metric, and its value in a right-aligned column, such as `42% · resets in 2h 10m · on pace for 100% in 1d 4h`. A sign-in the service turned down shows a red dot and `403 · sign-in rejected`; a check that could not be made, an orange one and `check failed`.
- The new teal logo — the app's icon is now the teal UsageBar logo from entelxcore.com.
Fixed
- The icon and its text no longer vanish on a light menu bar — before any usage was known, and for the tags between pinned metrics, they were drawn white. They now take the menu bar's own color, light or dark.
v2.1.0
8 Nov 2026Added
- Usage alerts at 80% and 95% — a pinned metric that reaches 80% of its limit posts one notification, e.g. “Claude AI: Current Session at 82% — resets 15:40”, and one more at 95%; when that window resets, a last one says so (“Current Session reset — now at 3%”). UsageBar saves what it announced with the window's reset time in `state.json`, so a relaunch, or a value going back and forth around 80%, does not repeat it; a metric without a reset time (Cursor credits) counts as reset once it falls below 70%. Failed fetches and “?” never alert. On by default: Settings… → Notify at 80% and 95%. Turning it off also forgets what was announced.
- Pace in the dropdown — a metric on track to reach 100% before its window resets says when, at its rate so far: `Current Session — 60% · resets in 3h 00m · on pace for 100% in 1h 20m`. It covers Claude's 5-hour session and weekly limits, ChatGPT's 5-hour and weekly windows, and Cursor's plan, auto, API and on-demand usage over the billing cycle when Cursor reports when the cycle started. Nothing is projected in the first 5% of a window, where one burst would read as a runaway pace, nor for metrics already at 100% or more; rows on track to stay under 100% are left as they were, so the menu does not get wider.
v2.0.3
7 Nov 2026Fixed
- `CURL_CFFI_IMPERSONATE` in `.env` now works — the README, `.env.example` and the Claude 403 message tell you to set it, but Claude read it once when UsageBar started, before `.env` was loaded, so it never applied. It is now read on every request, and `.env` is loaded again when you save Settings or run Auto-Import, so a value you add or change takes effect without restarting.
- Auto-Import no longer saves the wrong browser's session or reports a rejected one as working — it always tried Chrome first and counted expired cookies, so a Chrome profile with an old, logged-out session won over the browser you had just logged in with, and “Import Successful” appeared whatever happened next. It now tries your default browser first, then Chrome, Safari, Firefox, Brave and Edge; skips expired cookies and cookies of other sites whose name merely contains the domain; and checks the imported cookie with the service before saying anything. If the service turns it down, it says so and names the browser the cookies came from.
- The dropdown keeps its values when an update is found — when the background check found a new version, the menu was rebuilt with bare rows (“Current Session”) until the next refresh, up to a minute later. Saving Settings and Auto-Import had the same gap. The values are now drawn into the rebuilt rows right away.
- Logs no longer grow without limit — every failed refresh printed its errors again, so a Claude 403 added several lines every minute, and launchd never trims `ai_usage.out.log` / `ai_usage.err.log`. A provider's messages are now printed once until they change, with one line when it works again, and at launch a log over 1 MB is cut to its last 256 KB.
v2.0.2
7 Nov 2026Fixed
- No more “ClS ?” that cannot be removed — with nothing pinned yet, the menu bar showed Claude's current session even when only Cursor or ChatGPT was set up. Claude then had no items in the menu, so the pin could never be removed, and pinning a Cursor metric gave “ClS ? · Cu 42%” for good. The default is now the first metric of the first provider you have set up, and pins of providers that are not set up are dropped, so every pin can be removed.
- Cursor On-Demand mixed your spend with your team's — the percent took the limit, the spend and the amount remaining from different scopes: a $50 personal limit with $300 of team spend showed 600% ($300/$50), and a team limit with nothing spent showed 100%. All three now come from one scope: your personal limit when you have one, otherwise the team's.
- A failed update no longer leaves UsageBar closed — when installing failed after UsageBar had quit, for example on a broken download or a disk error, the app stayed closed. The installer (zip and legacy disk image) now reopens whatever is installed: the new version, or the old one it put back. Before downloading, UsageBar also checks that it can replace itself: opened straight from Downloads (where macOS runs it from a temporary copy) or from a folder this Mac user cannot write to, it now says what to do instead of quitting and failing.
- Slow update downloads are no longer cancelled — the update was cancelled 150 seconds after it started, even while it was still downloading. Now only 150 seconds without any download progress cancel it, and a cancelled update can no longer install and restart the app later when its download finally finishes.
- Launch at login no longer starts a second copy or quits UsageBar — turning it on started a second UsageBar right away, and turning it off quit UsageBar when it had been started at login. The setting now only adds or removes the login item, which takes effect at the next login.
Security
- Credentials file readable only by you — `.env`, which holds your session cookies, was created readable by every user of the Mac, and was emptied before being rewritten, so a failed save lost every cookie. It is now written to a temporary file only you can read and then swapped in, so a failed save leaves it as it was, and an existing `.env` is made private (0600) when UsageBar loads or saves it. `state.json` is written the same way.
- An update must contain exactly one UsageBar.app — a downloaded zip or disk image with more than one UsageBar.app is refused, so the installer cannot install a different copy than the one whose signature was checked.
v2.0.1
7 Nov 2026Fixed
- The menu bar no longer freezes while usage is fetched — every minute UsageBar called Claude, Cursor and ChatGPT on the main thread, one after another with 15-second timeouts, so on a slow network the menu could not open and Quit did not respond, and at login the icon appeared only once all three had answered. Fetching now runs in the background and the menu stays responsive. One fetch runs at a time; saving new credentials during a fetch refreshes again right after it.
v2.0.0
7 Nov 2026Changed
- Signed with Developer ID and notarized by Apple — UsageBar was ad-hoc signed, so macOS blocked the first launch until quarantine was cleared in Terminal or the app was opened with right-click → Open. It is now signed with ENTELXCORE's Developer ID Application certificate, with the hardened runtime, and notarized and stapled by Apple: it opens with a double-click like any other app. Because the signature now stays the same from version to version, access you grant it under Privacy & Security carries over to updates instead of being lost with each new build.
- Opens on macOS 13 and later — release builds were made with Homebrew's Python, which is built for the Mac's own macOS, so 0.3.9 needed macOS 27 to open at all. Releases are now built with Python from python.org, the app declares macOS 13 as its minimum, and `release.sh` checks every bundled binary against it before publishing.
Security
- Updates must be signed by the UsageBar developer — Check for Updates… now checks, before UsageBar quits, that the app inside the downloaded zip (or legacy disk image) is signed with ENTELXCORE's Developer ID. A tampered or broken download ends in an “Update failed” alert and the current version keeps running.
v0.3.9
9 Oct 2026Fixed
- Update notice never seen — When the background check finds a new version, the “Update available” dialog (Install & restart… / Not now) now opens by itself, in front of other windows, once per version. Until now it only posted a notification, which macOS never showed.
- Notifications never shown — Notifications go through Apple's current API (UNUserNotificationCenter). rumps used the deprecated NSUserNotificationCenter, whose notifications current macOS drops without an error. macOS only shows them for Developer ID signed apps; this ad-hoc build logs the reason to its error log instead.
- Update check failed without Homebrew — Update checks and downloads work on Macs without Homebrew: the bundled OpenSSL only looked for certificates in Homebrew's folder. macOS's own `/etc/ssl/cert.pem` is now trusted as well.
v0.3.8
9 Oct 2026Changed
- Python 3.14 — the app now bundles Python 3.14.8 (was 3.13.7).
- Current dependencies — `curl_cffi` 0.16.3, `requests` 2.34.2, `urllib3` 2.8.0, `certifi` 2026.7.22, PyObjC 12.2.2, `python-dotenv` 1.2.4, `pycryptodomex` 3.24.0, PyInstaller 6.22.3.
- Quieter build — dropped leftover hidden imports (`Crypto`, `keyring`, `secretstorage`, `jeepney`) from `ai_usage.spec`, so the build no longer logs `Hidden import … not found`. browser-cookie3 uses `Cryptodome`, which is still bundled.
v0.3.7
16 Sep 2026Changed
- Auto update check every 6 hours (was 12). A failed check — offline right after login, server error — is retried up to 3 times, 10 minutes apart, instead of waiting for the next interval.
- Python 3.10+ for source installs — `install.sh` skips Apple's bundled Python 3.9 and rebuilds a virtualenv that was created with it; the bundled .app is unaffected.
Fixed
- Auto update check ran at launch, twice — rumps timers fire as soon as they start, so the “first check about a minute after launch” happened immediately (often before Wi-Fi was up) and the periodic timer fired once more right behind it. The first check now really waits a minute.
v0.3.6
12 Sep 2026Added
- Auto update check — every 12 hours (first check about a minute after launch). A purple dot on the menu-bar icon plus a notification when a new version is ready; Check for Updates… becomes “Update x.y.z available…”.
v0.3.5
12 Sep 2026Fixed
- Quit after login — Launch at login used `KeepAlive`, so the next login would make Quit reopen UsageBar. Match RunBar: `KeepAlive` off, unload the login item on Quit (plist stays for the next login).
v0.3.4
9 Sep 2026Added
- Pin several metrics — click more than one row to keep them on the menu bar at once (click again to unpin; at least one stays). Example: Claude weekly + Cursor plan total shows `ClW 42% · Cu 67%`. Tags: ClS / ClW / ClSn / ClO / ClF, Cu / CuA / CuAPI / CuCr / CuOD, G5h / GW. Each percentage keeps its own green / yellow / red tint; the gauge follows the highest.
v0.3.3
9 Sep 2026Added
- Claude Fable — Weekly (Fable) usage from the `limits[]` payload (Max per-model windows)
Changed
- Claude org id — resolve from `lastActiveOrg` / `/api/organizations` instead of a hard-coded uuid (403 after Max upgrade)
- Claude Auto-Import — skip browsers that have cookies but no `sessionKey`
v0.3.2
27 Aug 2026Changed
- Menu chrome — Settings… (providers + Launch at login), Check for Updates…, Version, then Quit. Refresh now is now Refresh.
Fixed
- Duplicate menu bar icon after update — after `open` of the new app, do not reload the LaunchAgent. KeepAlive would start a second copy. The plist stays on disk, so Launch at login is unchanged at the next login.
v0.3.0
22 Aug 2026Added
- Cursor credits and on-demand — remaining credit grants (plus Stripe prepaid) and on-demand spend/limit from the dashboard APIs
Changed
- Claude free plan — a 404 from the usage API shows “Free · limits not available on free plan” instead of an error code
Fixed
- ChatGPT weekly — classify 5-hour vs weekly by window length so a weekly-only `primary_window` is not left as `?`
v0.2.15
14 Aug 2026Fixed
- Self-update with launch at login — start the installer script before parking the KeepAlive LaunchAgent, then relaunch with `open`
- Unpack the free-tools zip with `ditto` and skip `__MACOSX/*.app` stubs
v0.2.14
13 Aug 2026Fixed
- Relaunch after update — open the new `.app` with LaunchServices instead of treating LaunchAgent bootstrap as a successful start
v0.2.13
13 Aug 2026Fixed
- Update progress window — briefly become a regular app so the percent panel stays visible on a menu-bar-only process
- Double reopen after update — park the LaunchAgent before replacing the app so KeepAlive plus `open -n` cannot start both the old and new copies
v0.2.12
13 Aug 2026Changed
- `install.sh` picks the newest Python 3 from Homebrew or Xcode / CLT (no longer hard-coded to 3.12)
v0.2.11
9 Aug 2026Fixed
- Check for Updates zlib Error -3 — fetch manifest/zip via stdlib urllib instead of requests/urllib3 so a CDN that wrongly sets `Content-Encoding: gzip` no longer breaks the update check
v0.2.10
18 Jul 2026Changed
- Patch release for ENTELXCORE Free Tools
v0.2.9
18 Jul 2026Changed
- Menu bar icon is now `gauge.with.needle` (Bars family; matches website UsageBar mark)
- Badge styling aligned with CommitBar / RunBar (size, weight, tint)
- App bundle renamed to `UsageBar.app`; logo aligned with ENTELXCORE free-tools product mark
Fixed
- `release.sh` always rebuilds before zipping so the published version matches the binary (fixes endless “update available”)
v0.2.8
18 Jul 2026Added
- ChatGPT provider — 5-hour and weekly usage via chatgpt.com session cookie
Changed
- Release artifact is now `UsageBar-{version}-macos-arm64.zip` (same install flow as CommitBar / RunBar)
- In-app update check uses `https://entelxcore.com/downloads/usagebar/release-macos.json`
- “Open download page” opens `https://entelxcore.com/free-tools#tools`
- Self-update installs from zip; older DMG manifests still apply until they roll off
v0.2.7
18 Jul 2026Added
- Production packaging: `build.sh`, `release.sh`, `install_app.sh`, `run.sh`
- Dev app wrapper with custom icon (`scripts/make_dev_app.sh`)
- Launch at login via `launch_login.py` (dev + installed `.app`)
- `pyproject.toml`, pinned build requirements, CI workflow
- MIT license and changelog
Changed
- `build_dmg.sh` delegates to `build.sh` + `release.sh`
- Version in `ai_usage.spec` synced from `ai_usage.version`
- `release.sh` publishes DMG to `ai-usage-website` and ENTELXCORE free-tools




