Free · v0.2.3 · signed and notarized
eaSpot
What’s left of your AI limits, right in the menu bar.
eaSpot shows how much of your Claude Code and Codex limits is left, and whether you’re on pace to run out before they reset. It never logs in to anything: your tools report to it.
- macOS 14+
- Apple silicon & Intel
- Free
- MIT licence

Set it up
Install, then connect your tools.
Install with Homebrew, or download the zip and move eaSpot to Applications; zip installs run the CLI as /Applications/eaSpot.app/Contents/Helpers/easpot print-config. Open eaSpot, print the hook snippets, add them to ~/.claude/settings.json and ~/.codex/hooks.json, and approve them in Codex with /hooks. Codex numbers appear within seconds, Claude’s within a few minutes.
brew tap x/tap https://x.vibewait.ing/x/homebrew-tap.gitbrew install --cask x/tap/easpoteaspot print-configWhat makes it different
It never calls a provider
Most quota trackers sign in to each service and poll its website or API. eaSpot turns that around: Claude Code, Codex or any other tool writes a small snapshot, and eaSpot shows what’s there. It stores no accounts, cookies or API keys.
One protocol, not endless integrations
Instead of chasing every AI provider, eaSpot defines one small JSON contract. Anything that can print JSON—a script, a CLI, or a model—can report its limits, name itself and even draw its own icon.
Small and fast on purpose
The part that stays running is plain AppKit, and the app itself makes no network requests. The menu updates about a tenth of a second after a snapshot changes, and the hooks take a few milliseconds and no model tokens.
Inversion of control
The app waits to be told.
eaSpot doesn’t integrate with providers; providers integrate with it, through one contract you can read in a minute. That keeps the app small, fast and free of your logins.
| Many quota trackers | eaSpot | |
|---|---|---|
| Where the numbers come from | The app signs in to each provider and reads its dashboard or API | Your tools write a snapshot; eaSpot reads a folder |
| Logins | Cookies, API keys or OAuth tokens kept by the app | None—eaSpot never holds a login |
| Another AI service | Wait for the app to add an integration | Publish one JSON snapshot yourself |
| Staying current | Polls on a timer | Redraws when a snapshot changes, and refreshes stale limits when you open the menu |
| Cost of checking | A request on every refresh | Hooks run outside the model: a few milliseconds, no tokens |
Our protocol
Report from anything.
A snapshot is a few lines of JSON: a source, and each limit’s usage and reset time. Pipe it to easpot publish from a script, a CLI or an agent, and it shows up in the menu with the rest.
echo '{"source":"glm","name":"GLM","windows":[ {"id":"five_hour","used_percent":12.5, "resets_at":"2026-10-01T09:00:00Z","window_minutes":300}]}' \ | easpot publishBuilt in
Where the numbers come from.
| Where you work | How eaSpot hears about it | Delay |
|---|---|---|
| Claude Code | A Stop hook starts a quick /usage check when the numbers are older than 3 minutes | Up to about 3 minutes |
| Codex | Stop and PostToolUse hooks read the latest token counts from Codex’s own logs | End of each tool call or turn |
| Anything else | easpot publish reads a snapshot on standard input | Whenever it runs |
