See how fast you're burning Cursor spend — without opening the dashboard.
A lightweight macOS menu bar app that shows your Cursor usage in real time, breaks it down by model, session, skill, and prompt, and notifies you when spend spikes.
Cursor's usage dashboard lives in the browser and always feels one tab too far away. Burnrate sits in your menu bar with a flame and a dollar amount — click it and you get the full picture: what you spent, on which models, in which chats, and whether you're in the middle of a spike.
- At-a-glance total — spend for your selected window, right in the menu bar
- Spike alerts — a macOS notification when spend crosses your threshold (default $10 / 10 min)
- Zero setup — uses your signed-in Cursor IDE session; nothing to paste, nothing stored
- Privacy-minded — no analytics by default, no model calls (it won't bump your AI usage); optional Community tab shares anonymous 24h aggregates only if you opt in
Download the latest Burnrate-*.zip from
Releases, unzip, and move
Burnrate.app to /Applications.
Or build from source (requires local maintainer scripts/ — not shipped in the
public repo):
git clone https://github.com/tomyweiss/Burnrate.git
cd Burnrate
bash scripts/package.sh --install --openThis builds a release binary, installs Burnrate.app to /Applications, and launches it.
Note
First launch: the app isn't Apple-notarized. If Gatekeeper blocks it, right-click the app → Open, or run:
xattr -dr com.apple.quarantine /Applications/Burnrate.app
open /Applications/Burnrate.appVerify it can reach your usage data:
/Applications/Burnrate.app/Contents/MacOS/Tokens --status
# OK $12.40 today (67 events)- macOS 26 or later
- Cursor installed and signed in on the same Mac
- Xcode 26 (or Command Line Tools with the macOS 26 SDK) to build from source
| You see | It means |
|---|---|
Flame + $12.40 |
Spend for your selected window; click for the panel |
| Filled flame | Recent-window spend ≥ your spike threshold |
| Warning triangle | Auth or API problem (last known amount still shown when possible) |
The header shows the window total, a burn pill with spend in your rolling alert window (e.g. last 10 minutes), and an hourly/daily sparkline for the shape of spend across the active window. A timeline picker switches between Today, Last 24h, Last 7d, and This billing (configurable billing day and timezone).
Below that, six tabs slice the same window:
| Tab | What it shows |
|---|---|
| Models | Cost share per model; expand for token detail and per-session rows |
| Sessions | Chats across models, with titles and workspace names from local Cursor data; drill into a session for its prompts, subagents, and local conversation log path when available |
| Skills | Cost per slash command, with total / average / median views |
| Community | Opt-in anonymous 24h spend rank vs other sharers (share-to-view) |
| Feed | Every prompt with its attributed cost, tokens, duration, and models |
| Bench | Scatter chart comparing models, skills, or sessions on cost, speed, and volume — top-right is best |
Timeline window, billing day, timezone, poll interval, spike threshold / window / cooldown, launch at login, hide the menu bar amount, blur sensitive content (for demos and screen shares), test notification, and updates.
- Loads your local Cursor session from
~/Library/Application Support/Cursor/User/globalStorage/state.vscdb - Polls
POST https://cursor.com/api/dashboard/get-filtered-usage-eventsfor events in the selected window - Sums Cursor's
chargedCentsfor totals, sparkline buckets, models, sessions, skills, and prompts - Resolves chat titles and workspaces from local composer metadata when available
Costs are Cursor-reported charges from usage events, not a hand-rolled price estimate. Full behavior: CAPABILITIES.md.
- Reads
cursorAuth/accessTokenfrom Cursor's local SQLite DB on each refresh — never written to Burnrate's own storage or Keychain - Fetches usage over HTTPS from Cursor's dashboard endpoints using that session
- Session names and workspace folders come from local Cursor composer metadata (and cloud agent cache for
bc-*sessions) - No analytics; no model/API calls that consume Cursor usage
- Community (opt-in): uploads anonymous rolling 24h spend + per-model costs to the Burnrate community API when you enable sharing; never session titles, prompts, or Cursor identity. Turning sharing off deletes your server row. You only see cohort data if you share.
- Self-updates require a minisign signature matching the embedded public key (not only a SHA-256 checksum from the same release)
Burnrate can update itself from GitHub Releases without an Apple Developer ID:
- Checks
releases/latestfor a newer version tag - Downloads
Burnrate-x.y.z.zip, verifiesBurnrate-x.y.z.sha256, then verifies the minisign signature (Burnrate-x.y.z.zip.minisig) against the embedded public key - Quits, replaces the running
.app, strips quarantine, relaunches
Use ⋯ → Check for Updates… or Settings → Updates. You confirm before
install. Builds are not notarized; if macOS blocks a new build,
right-click → Open or run xattr -dr com.apple.quarantine on the app.
- Relies on Cursor's undocumented dashboard API — it can change or break without notice
- Individual / personal session only (the account signed into Cursor on this Mac)
- Longer windows (7d, billing cycle) may hit the API pagination cap (~4000 events) for heavy users
- Not an official Cursor product; totals may differ slightly from the website
- Not notarized for distribution outside building from source
swift build
bash scripts/package.sh --openSide-by-side contributor build (does not overwrite /Applications/Burnrate.app):
bash scripts/package.sh --dev --install --open
# or: make install-devThis installs Burnrate-dev.app with bundle id com.tomyweiss.burnrate.dev.
The menu bar keeps the normal $ amount and adds a small gray dot next to the
flame; the panel shows an orange DEV badge. Self-updates are disabled.
Version defaults to the latest git tag (override with VERSION=…).
Hot reload: rebuilds and relaunches Burnrate-dev whenever Swift sources
change (debug build for speed). Ctrl-C stops the watcher.
make watch-dev
# or: bash scripts/dev-watch.shOne-shot debug install: bash scripts/package.sh --dev --debug --install --open.
Package layout: Swift package target Tokens (internal name), shipped as Burnrate.app.
Cutting a release (maintainers)
Maintainer packaging/release helpers live in a local scripts/ directory (not
in the public repo). Keep your own copy beside the checkout.
Requires minisign and the release
signing secret key at ~/.config/burnrate/burnrate.key (or set
MINISIGN_SECRET_KEY). The matching public key is committed as
burnrate.pub and embedded in the app.
-
Before opening your feature PR, check the next version:
bash scripts/release.sh --next-version # or: bash scripts/release.sh --dry-run -
Add a changelog section at the top of
Sources/Tokens/Resources/CHANGELOG.mdin the same PR:## 0.0.41 - Your user-facing change description (optional commit hash)
-
Merge the feature PR to
main. -
Tag and publish (no separate changelog PR):
bash scripts/release.sh --yes
This tags main, builds, signs, and uploads:
Burnrate-x.y.z.zipBurnrate-x.y.z.sha256Burnrate-x.y.z.zip.minisig
Release notes on GitHub and in the in-app change log come from the merged CHANGELOG.md section for that version.
--dry-run previews the next version and whether the changelog is already on
main. Without --yes, the script can still draft a changelog and open a
fallback PR if the section was not merged in the feature PR.
Manual override (hotfix or re-release to an existing version):
VERSION=0.0.7 bash scripts/package.sh --releaseVERSION=v0.0.7 works the same (leading v is stripped). Requires gh auth
and the minisign secret key. The zip must contain Burnrate.app at the top
level. Updates without a valid .minisig are rejected.
Issues and PRs are welcome. Please keep changes focused; this is intentionally a small menu bar utility.
MIT © Tom Weiss