PokeTokenBar turns the AI coding tokens you're already burning — Claude Code, Codex, Gemini CLI, OpenCode, Hermes Agent, Cursor & Grok CLI — into a growing Pokémon companion in your macOS menu bar. Spend tokens, hatch an egg, evolve it through its real evolution line, graduate it into your Pokédex, and start again. Underneath the companion it's a precise usage tracker — today's spend, cost, and official 5-hour / weekly limits, read straight from your local logs.
Token usage is read directly from local Claude Code, Codex, Gemini CLI, OpenCode, Hermes Agent, Cursor, and Grok CLI data (
totalTokens= input + output + cache, local date) — no external CLI needed. Unofficial, non-commercial Pokémon fan project — see License & disclaimer.
- The usage tracker you actually enjoy opening. Your spend raises a Pokémon that hatches, evolves, graduates, and fills a Pokédex — and every shiny is a reason to check back.
- See today's token spend & cost at a glance — no dashboard, no browser tab.
- Track official 5-hour / weekly limits with reset countdowns and a burn-rate forecast for when you'll hit them.
- 🥚 Code as usual. The tokens you burn in Claude Code, Codex, Gemini CLI, OpenCode, Hermes Agent, Cursor, or Grok CLI incubate an egg — nothing extra to run.
- 🐣 Hatch. Eggs hatch into Pokémon with real evolution lines from PokéAPI — any Gen 1–5 line (329 possible starts), weighted by the official capture rate: commons hatch often, a legendary is a 1-in-129 event. It appears in your Pokédex immediately while you raise it. Every hatch rolls one of 25 natures — and once in a rare while, the egg hatches ✨ Shiny.
- ⚡ Evolve. Keep coding and it grows through its actual evolution tree (1/2/3 stages, branching), with a little flash celebration at each step.
- 🎓 Graduate & collect. Final form + threshold permanently archives it in your Pokédex — rarer takes longer (≈3 days common → ≈24 days legendary at heavy use) — and a fresh egg arrives.
- 🍬 Max out, get a candy. Fill a 5-hour or weekly usage limit and you earn Rare Candy — spend it from the Bag to grow your current Pokémon.
- 🛒 Spend at the Shop. Every token you've used is spendable currency — buy Rare Candy, a Mint that re-rolls your Pokémon's nature, a Shiny Charm that permanently raises your shiny odds, or an egg to send off your current companion and start over. Eggs come in three grades: a plain Pokémon Egg, an Uncommon Egg guaranteed to hatch Uncommon or better, and a Rare Egg guaranteed to hatch Rare or better.
- Interactive floating pet — hover for today's usage, click to open the main window, right-click for a menu; limit alerts can pop up as speech bubbles.
- Per-service tabs — when two or more of Claude Code, Codex, Gemini CLI, OpenCode, Hermes Agent, Cursor, and Grok CLI are detected, compact tabs switch between them; today's total stays combined.
- Official limits — Claude & Codex 5-hour / weekly utilization with reset countdowns, right under today's numbers.
- Burn-rate forecast — projects when the current 5h window hits 100%.
- In-app updates — one-click update check; current version shown in Settings.
| Tool | Tracked | Official limits |
|---|---|---|
| Claude Code | today · 5h block · week · month | ✅ 5h / weekly |
| Codex | today · week · month | ✅ 5h / weekly |
| Gemini CLI | today · week · month | — |
| OpenCode | today · 5h block · week · month | — |
| Hermes Agent | today · 5h block · week · month | — |
| Cursor | today · 5h block · week · month | — |
| Grok CLI | today · 5h block · week · month | — |
All read locally — no external usage CLI required. Adding a tool is one provider file (see CONTRIBUTING.md).
macOS 14+ (Apple Silicon or Intel). That's it — token usage is read directly from local Claude Code, Codex, Gemini CLI, OpenCode, Hermes Agent, Cursor, and Grok CLI data, with no external usage CLI required.
brew install --cask chattymin/tap/poke-token-barad-hoc/self-signed; the cask strips the quarantine attribute on install.
Prefer not to use Homebrew? Download PokeTokenBar.zip from the latest release, unzip it, and drag PokeTokenBar.app into /Applications.
Because the app is ad-hoc/self-signed (not notarized under an Apple Developer account), Gatekeeper shows an "unidentified developer" warning on first launch. Clear it once, either way:
- Finder: right-click (or Control-click)
PokeTokenBar.app→ Open → Open again in the dialog. - Terminal:
xattr -dr com.apple.quarantine /Applications/PokeTokenBar.app
(The Homebrew cask strips quarantine for you, so it needs no extra step.)
swift build # debug
swift test # unit tests
./scripts/build-app.sh # release → PokeTokenBar.app → /Applications| Source | Used for | Notes |
|---|---|---|
~/.claude/projects/**/*.jsonl |
Claude Code daily/blocks/weekly/monthly | read directly; deduped by message id; cached incrementally |
~/.gemini/tmp/**/chats/*.json(l) |
Gemini CLI daily/monthly | session records (tokens per message); weekly = daily sum |
~/.codex/sessions/**/*.jsonl |
Codex daily/monthly | token_count events; weekly = daily sum |
~/.local/share/opencode/opencode.db |
OpenCode daily/blocks/weekly/monthly | SQLite read-only; legacy storage/message JSON is also supported |
~/.hermes/state.db |
Hermes Agent daily/blocks/weekly/monthly | SQLite read-only; session token totals and persisted cost |
~/Library/Application Support/Cursor/User/globalStorage/state.vscdb |
Cursor daily/blocks/weekly/monthly | SQLite read-only; cursorDiskKV bubble entries with tokenCount |
~/.grok/sessions/**/updates.jsonl |
Grok CLI daily/blocks/weekly/monthly | turn_completed records (per-turn usage, server-reported cost); honours $GROK_HOME; subagent sessions are skipped because their tokens are already folded into the parent turn |
Keychain / ~/.claude/.credentials.json → api.anthropic.com |
Claude official 5h/weekly % | unofficial endpoint; the Keychain is read only when you press refresh — auto-polling never reads it |
codex app-server |
Codex official 5h/weekly % | local child process; account snapshot only, no model turn |
PokéAPI — pokeapi.co, graphql.pokeapi.co |
Pokémon species & evolution | runtime fetch; cached locally, never bundled |
raw.githubusercontent.com/PokeAPI/sprites |
Pokémon & item sprites | runtime fetch; cached under Application Support, never bundled |
status.claude.com, status.openai.com |
provider incident banner | statuspage summary; display only — turn it off in Settings |
api.github.com |
update check | latest release tag; on launch and when the popover opens |
- On-device. Token usage is read directly from local Claude Code, Codex, Gemini CLI, OpenCode, Hermes Agent, Cursor, and Grok CLI data. The app never uploads usage or runs model turns.
- Outbound requests. The app is not fully offline. It talks to seven hosts:
pokeapi.coandgraphql.pokeapi.co(species/evolution),raw.githubusercontent.com(sprites),api.anthropic.com(Claude official limits),status.claude.comandstatus.openai.com(incident banner — off switch in Settings), andapi.github.com(update check). None of them carry your usage, tokens, prompts, or project paths — only the request itself. - Keychain (optional). The Claude OAuth credential is read only when you press a refresh button (Settings, or the limits row in the popover). Automatic polling never touches the Keychain, so it never raises a password prompt; when available, the credential is taken from
~/.claude/.credentials.jsoninstead. The token is held in memory only — the app creates no Keychain item of its own. Once the token expires, limits stay visible but stale until you refresh. Turn it off in Settings — the limits section simply hides. - Pokémon assets are fetched at runtime from PokéAPI and cached only under
~/Library/Application Support/PokeTokenBar/. The app binary and its release artifacts contain no Pokémon assets.
Contributions of all sizes are welcome — see CONTRIBUTING.md for how to build, test, and open a pull request.
MIT — see LICENSE. The MIT license covers this project's original source code only; it grants no rights to any third-party trademarks, artwork, or data accessed through the app.
PokeTokenBar is an unofficial, non-commercial fan project. It is not affiliated with, endorsed, sponsored, or approved by Nintendo, Game Freak, Creatures Inc., or The Pokémon Company. "Pokémon" and all related names, characters, and imagery are trademarks and copyrights of their respective owners. This project claims no ownership of, and asserts no rights over, any Pokémon intellectual property.
- The app binary and its release artifacts bundle no Pokémon assets. Pokémon species data and sprites are fetched at runtime from the public PokéAPI and cached locally on the user's own device; sprite images served via PokéAPI remain the property of their respective owners.
- Any Pokémon imagery in this repository's documentation (screenshots/GIFs) is shown solely to illustrate the app's functionality.
- The app is provided free of charge for personal, non-commercial use only.
- If you are a rights holder with any concern about this project, please open an issue or contact the maintainer, and we will respond promptly.
Provided "as is", without warranty of any kind. This notice is not legal advice.







