← All projects

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-config

What 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.

How eaSpot compares with many quota trackers
Many quota trackerseaSpot
Where the numbers come fromThe app signs in to each provider and reads its dashboard or APIYour tools write a snapshot; eaSpot reads a folder
LoginsCookies, API keys or OAuth tokens kept by the appNone—eaSpot never holds a login
Another AI serviceWait for the app to add an integrationPublish one JSON snapshot yourself
Staying currentPolls on a timerRedraws when a snapshot changes, and refreshes stale limits when you open the menu
Cost of checkingA request on every refreshHooks 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 publish

Built in

Where the numbers come from.

How eaSpot hears about each tool
Where you workHow eaSpot hears about itDelay
Claude CodeA Stop hook starts a quick /usage check when the numbers are older than 3 minutesUp to about 3 minutes
CodexStop and PostToolUse hooks read the latest token counts from Codex’s own logsEnd of each tool call or turn
Anything elseeaspot publish reads a snapshot on standard inputWhenever it runs