Giting.
낮의 Giting

· Swift · 데스크톱 · Claude Code · 신생 프로젝트

PokeTokenBar 대표 이미지 56a3547
분석 리포트실측 정보적용점원문 README

구조와 기능

PokeTokenBar는 Claude Code·Codex·Gemini CLI 같은 AI 코딩 도구의 토큰 사용량을 "포켓몬을 부화·진화·수집하는" 게임으로 바꿔 보여주는 macOS 메뉴바 앱이다(검수 보강: GitHub 메타데이터 확인 — macOS 14+·Swift 6·Homebrew cask 배포, 검수 시점 스타 371). 초안 생성 단계에선 격리 정책상 리포 본문에 접근하지 못해 실측 JSON만으로 작성됐고, 제품 정체는 검수 단계에서 확인해 보강했다.

전체 저장소는 텍스트 기준 37,719줄, 159개 파일로 구성돼 있고 이 중 94개 파일(34,967줄)이 Swift다. 텍스트 전체 라인의 대부분을 Swift가 차지한다는 뜻이며, 저장소에 .icns 아이콘 파일이 포함돼 있다는 점을 함께 보면 macOS 네이티브 앱 형태로 짐작된다. 셸 스크립트는 8개(638줄)로 빌드나 배포 자동화용으로 보이고, jsonl 파일 7개(56줄)는 테스트 픽스처나 설정 데이터 성격으로 추정된다(추정).

이력을 보면 첫 커밋이 2026-06-15, 가장 최근 커밋이 조사 시점인 2026-09-03이며, 지난 90일 커밋 333건이 곧 전체 커밋 수와 같다. 즉 저장소 전체 이력이 약 80일에 불과한 신생 프로젝트이고, 그 짧은 기간 안에 333회 커밋과 29개의 원격 태그가 쌓였다. 저자는 29명이 실측됐고 상위 기여자로 Patrick.Park, Boris, Justin Jeong, Seong SeungHyeon, 신현호가 확인된다. 개인 프로젝트 규모를 넘어 여러 명이 동시에 커밋을 쌓아온 흐름이다.

CI 워크플로는 1개가 확인됐으며, 라이선스는 MIT다. 의존성 매니페스트는 이번 실측에서 deps: null로 잡혀 별도 서드파티 의존성 목록을 확인할 수 없었다. 저장소에는 에이전트용 문서(hasAgentDocs: true)가 포함돼 있다는 것도 실측됐는데, 구체적으로 어떤 내용을 담고 있는지는 JSON 범위 밖이라 언급하지 않는다.

하이라이트

가장 눈에 띄는 지점은 저장소 전체에서 가장 큰 단일 파일이 소스 코드가 아니라 테스트 파일이라는 것이다. Tests/PokeTokenBarTests/CompanionTests.swift가 1,800줄로 최대 파일이고, 테스트 파일 수는 전체 159개 파일 중 56개에 달한다. Swift 소스 파일이 94개인 것과 겹쳐 보면, 소스 대비 테스트 비중이 상당히 두껍게 잡혀 있는 저장소다. "Companion"이라는 이름이 붙은 영역에 특히 큰 테스트가 붙어 있다는 것은, 해당 로직이 저장소 안에서 무게중심 역할을 하고 있다는 신호로 읽을 수 있다.

두 번째로 볼 만한 것은 릴리스 리듬이다. 333커밋과 29개 태그가 전부 약 80일 구간 안에 들어와 있다. 태그 하나당 평균 11~12커밋 꼴로 짧은 주기로 버전을 태깅해온 흐름이며, 신생 저장소치고는 릴리스 케이던스가 촘촘하다. 다인원(29명) 저자 구성과 맞물려, 여러 사람이 짧은 주기로 합류·기여해온 프로젝트라는 정황이 커밋·태그 수치만으로도 드러난다.

세 번째는 hasAgentDocs가 true로 잡혔다는 점이다. 저장소가 AI 코딩 에이전트를 염두에 둔 문서를 갖추고 있다는 사실 자체는 실측됐지만, 문서의 내용이나 실제 활용 방식은 이번 조사 범위에서 확인되지 않았다.

주의점

deps가 null로 잡힌 것이 가장 먼저 짚을 부분이다. 의존성이 실제로 거의 없는 저장소인지, 아니면 실측 도구가 매니페스트 위치를 인식하지 못한 것인지는 이번 실측만으로 구분할 수 없다. 외부 라이브러리를 끌어오는 프로젝트라면 이 공백을 먼저 채워야 한다.

이력 자체가 80일 남짓으로 매우 짧다는 점도 고려해야 한다. 333커밋·29태그라는 활동량은 인상적이지만, 장기 유지보수 실적이라 부를 만한 기간은 아직 쌓이지 않았다. 이번 조사에서는 README나 소스 코드 본문에 직접 접근하지 못해, 배지나 문서상의 주장을 실측과 대조하는 절차도 진행하지 못했다. 라이선스는 MIT License로 확인된다.

실측 정보

헤드 커밋
56a3547
전체 커밋 수
333건 (2026-06-15 ~ 2026-09-03)
저자 수
29명
원격 태그
29개
총 파일 / 텍스트 라인
159개 / 37,719줄
Swift 비중
94파일, 34,967줄
테스트 파일 / 최대 파일
56개 / Tests/PokeTokenBarTests/CompanionTests.swift (1,800줄)

적용점

  • P1 · 비용 낮음largestFile이 소스가 아니라 테스트 파일(CompanionTests.swift, 1,800줄)이라는 사실은, 새 기능을 얹기 전에 테스트부터 두껍게 쌓는 습관의 방증으로 참고할 만하다.
  • P2 · 비용 낮음29개 태그와 333커밋이 80일 안에 몰려 있는 릴리스 리듬은, 소규모 다인원 팀이 태그 기반 버저닝을 얼마나 촘촘히 가져갈 수 있는지 보여주는 사례로 볼 수 있다.
  • P1 · 비용 중간deps가 null로 잡힌 이유(의존성이 실제로 거의 없는지, 실측 도구가 매니페스트를 못 찾은 것인지)는 저장소를 직접 열어 확인하지 않고는 판단할 수 없다.
◇ 관망

이력 전체가 약 80일(2026-06-15~2026-09-03)에 몰려 있고 그 안에 333커밋, 29개 태그가 쌓였다. 짧은 기간에 태그 기반 릴리스를 촘촘히 이어온 활동량과, 저장소 최대 파일이 소스가 아니라 테스트 파일이라는 점은 눈에 띄는 신호다. 다만 실측 JSON에는 deps가 null로 잡혀 있어 서드파티 의존성 범위를 확인할 수 없고, 이번 조사에서는 소스 코드 본문을 직접 확인하지 못해 아키텍처나 README의 구체 주장을 실측과 대조할 수 없었다. 활동 밀도는 긍정적이지만 검증 가능한 근거가 파일·커밋 통계 수준에 머물러 있어 지금 단계에서는 도입 후보나 참고 구현으로 단정하기보다 관망이 맞다.

원문 README

아래는 chattymin/PokeTokenBar 저장소의 README 원문입니다(GitHub 렌더, 수집 시점 기준). 저작권은 원 프로젝트에 있으며 원 저장소의 라이선스를 따릅니다. GitHub에서 보기

README 전문 펼치기
PokeTokenBar icon

PokeTokenBar

Your AI coding tokens, hatched into Pokémon — right in your menu bar.

Release macOS Swift Homebrew License Sponsor

chattymin%2FPokeTokenBar | Trendshift chattymin%2FPokeTokenBar | Trendshift

English · 한국어 · 日本語

PokeTokenBar turns the AI coding tokens you're already burning — Claude Code, Codex, Gemini CLI, Antigravity, OpenCode, Hermes Agent, Cursor, Grok CLI, Copilot CLI, Kiro CLI, Pi Agent & omp — 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, Antigravity, OpenCode, Hermes Agent, Cursor, Grok CLI, Copilot CLI, Kiro CLI, Pi Agent, and omp data (totalTokens = input + output + cache, local date) — no external CLI needed. Unofficial, non-commercial Pokémon fan project — see License & disclaimer.

Why

  • 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.
Popover home — companion, today's tokens, official limits

How it works

  1. 🥚 Code as usual. The tokens you burn in Claude Code, Codex, Gemini CLI, Antigravity, OpenCode, Hermes Agent, Cursor, Grok CLI, Copilot CLI, Kiro CLI, Pi Agent, or omp incubate an egg — nothing extra to run.
  2. 🐣 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.
  3. Evolve. Keep coding and it grows through its actual evolution tree (1/2/3 stages, branching), with a little flash celebration at each step.
  4. 🎓 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.
  5. 🍬 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.
  6. 🛒 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.

Tour

Floating desktop pet with a hover callout and right-click menu

🐾 Let it live on your desktop

Move your companion out of the menu bar and onto the desktop, at any size from 48 to 192px. Hover it for today's usage, click to open the popover, right-click for a menu, drag it wherever you like — and limit alerts can appear as a speech bubble above it.

In your menu bar

An animated Gen-V sprite lives next to today's total tokens (compact, e.g. 200.7M). Add today's cost ($) or official limit % — or turn everything off for a character-only bar.
Menu bar
Normal vs shiny

✨ Once in a rare while — Shiny

Shiny hatches keep their distinct colors through every evolution — menu bar, home card, evolution line. In the Pokédex a ✨ sits next to the dex number, and tapping the cell swaps in the shiny colors. A dedicated notification makes sure you don't miss the moment.

A Pokédex worth filling

The Pokédex folds every species you've owned into one cell — 24 per page in dex-number order, and a ✨ on the ones you own shiny. The Catch log keeps the individuals: newest first, each with its full evolution line, rarity, nature, and capture date.
Pokédex — one cell per species

Catch log — one row per Pokémon raised
Settings

Tune it your way

Menu-bar items, refresh interval (1–15 min or manual), launch at login, a Keychain opt-out that just hides the limits section, limit alerts with warning/critical thresholds, and companion event notifications. Full KO / EN / JA / ES / FR / PT UI and Pokémon names.

🍬 Fill a limit, earn a Rare Candy

Max out a 5-hour or weekly usage limit and you're handed a Rare Candy — one per 5-hour cap, five per weekly. Spend it from the new Bag tab to grow your current Pokémon: the moment you're rate-limited becomes the moment you level up.
Rare Candy and Mint in the Bag
Token Shop — Mint, Rare Candy, Pokémon Egg, Uncommon Egg, Shiny Charm, Rare Egg

🛒 A shop that runs on your usage

The tokens you've already used are your currency. Spend them in the new Shop tab on Rare Candy to grow your current Pokémon, a Mint to re-roll its nature, a Shiny Charm that permanently raises your shiny hatch odds, or an egg to send off your companion and start over. Eggs come in three grades — a plain Pokémon Egg, an Uncommon Egg that always hatches Uncommon or better, and a Rare Egg that always hatches Rare or better. Legendaries stay in the pool for both graded eggs, so a guaranteed hatch can still surprise you.

📊 Official limits, now for Antigravity too

Antigravity 2.0 and the IDE report real quota, not an estimate. Gemini models and Claude & GPT models each get their own 5-hour and weekly buckets with reset countdowns, alongside Claude Code and Codex. Read quietly in the background — no Keychain prompt, and the session refreshes itself.
Antigravity official limits — 5-hour and weekly buckets per model group
Additional scan folders in Settings → Advanced

📁 Logs somewhere unusual? Point at them

If a tool keeps its sessions outside the built-in paths, add your own roots under Settings → Advanced — comma or newline separated, * wildcards, with a live count of how many extra folders currently match. Every provider keeps its own list, so one tool's folders are never handed to another tool's parser, and your custom roots are added to the built-in ones rather than replacing them.

🔑 Official limits without the Keychain

If the cached limit token expires, official Claude limits used to freeze until a refresh — and that press could raise a Keychain password prompt. Paste a claude.ai session key under Settings → Advanced instead: limits then come straight from claude.ai with no Keychain access at all, auto-polling keeps them fresh, and the key is validated the moment you save it.
claude.ai session key in Settings → Advanced
Per-model token breakdown for Pi

🧮 One session log, several models

Pi and its forks (like omp) can route more than one model through a single session log. Usage is now attributed to the real model id instead of a flat "pi", and when a day spans several models the popover breaks today's tokens down per model, biggest first.

Also in the box

  • Representative Pokémon — pin any owned Pokédex species to the menu bar and optional floating pet, independently of the companion you're raising. While pinned, the menu bar stops following egg, hatch, and evolution changes; raising progress remains visible on Home.
  • Animation quality — pick how smoothly the menu bar sprite and the floating pet animate (Power saver / Balanced / Smooth). Both always-visible surfaces share the setting. Power saver is the default and keeps the frame rate the app used before this setting existed; Balanced and Smooth trade battery for smoothness (measured idle CPU ~1.8% and ~5.1%).
  • Interactive floating pet — hover for today's usage, click to open the main window, right-click for a menu, and show limit alerts as speech bubbles.
  • Per-service tabs — when two or more of Claude Code, Codex, Gemini CLI, Antigravity, OpenCode, Hermes Agent, Cursor, Grok CLI, Copilot CLI, Kiro CLI, Pi Agent, and omp are detected, compact tabs switch between them; today's total stays combined.
  • Official limits — Claude, Codex & Antigravity 5-hour / weekly utilization with reset countdowns, right under today's numbers.
  • Additional scan folders — per-provider extra scan roots for logs kept outside the built-in paths (Settings → Advanced).
  • Burn-rate forecast — projects when the current 5h window hits 100%.
  • In-app updates — one-click update check; current version shown in Settings.

Works with

Tool Tracked Official limits
Claude Code today · 5h block · week · month ✅ 5h / weekly
Codex today · week · month ✅ 5h / weekly
Gemini CLI today · week · month
Antigravity today · 5h block · week · month ✅ 5h / weekly
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
Copilot CLI today · 5h block · week · month
Kiro CLI today · 5h block · week · month — (estimated)
Pi Agent today · 5h block · week · month
omp (oh-my-pi) today · 5h block · week · month

All read locally — no external usage CLI required. Adding a tool is one provider file (see CONTRIBUTING.md).

Install

Requirements

macOS 14+ (Apple Silicon or Intel). That's it — token usage is read directly from local Claude Code, Codex, Gemini CLI, Antigravity, OpenCode, Hermes Agent, Cursor, Grok CLI, Copilot CLI, Kiro CLI, Pi Agent, and omp data, with no external usage CLI required.

Homebrew

brew install --cask chattymin/tap/poke-token-bar

ad-hoc/self-signed; the cask strips the quarantine attribute on install.

Manual install (without Homebrew)

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.appOpenOpen 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.)

Build from source

swift build                  # debug
swift test                   # unit tests
./scripts/build-app.sh       # release → PokeTokenBar.app → /Applications

Data sources

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
~/.gemini/antigravity/conversations/*.db
~/.gemini/antigravity-cli/conversations/*.db
~/.gemini/antigravity-ide/conversations/*.db
Antigravity daily/blocks/weekly/monthly SQLite read-only; per-call usage from the Cascade protobuf blob; supports Antigravity 2.0/Core, CLI & IDE; its own provider, not folded into Gemini; a subscription, so no cost is estimated
~/.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 fallback (cursorDiskKV bubble tokenCount); when signed in, primary source is cursor.com dashboard API (see Privacy)
cursor.com (dashboard API) Cursor daily/blocks/weekly/monthly unofficial JSON endpoint (get-filtered-usage-events); session from cursorAuth/accessToken in state.vscdb or CURSOR_SESSION_TOKEN; refetches when the provider reloads; on network error falls back to an account-scoped disk cache up to 6 h old; disable with CURSOR_USAGE_API=0
~/.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
~/.copilot/session-store.db Copilot CLI daily/blocks/weekly/monthly SQLite read-only; one assistant_usage_events row per API call; honours $COPILOT_HOME; input_tokens already contains the cached prompt, so cache reads/writes are subtracted; premium-request billing, so no cost is estimated
~/Library/Application Support/kiro-cli/data.sqlite3
~/.kiro/sessions/cli/*.jsonl
~/.kiro/sessions/<ws>/<session>/messages.jsonl
Kiro CLI daily/blocks/weekly/monthly Pre-2.20 SQLite plus 2.20+ / --v3 JSONL; neither store records real token counts, so input is a bytes÷4 estimate of accumulated conversation text resent on every turn; usage_summary credits are not converted to USD; a /cleard SQLite conversation's already-counted tokens stay counted until the app restarts; honours $KIRO_CLI_HOME and $KIRO_HOME
~/.pi/agent/sessions/**/*.jsonl Pi Agent daily/blocks/weekly/monthly Direct persisted usage from all projects; $PI_CODING_AGENT_DIR and $PI_CODING_AGENT_SESSION_DIR overrides supported; output already includes reasoning (not counted twice); forked history deduplicated by entry ID; no cost is reported
~/.omp/agent/sessions/**/*.jsonl omp (oh-my-pi) daily/blocks/weekly/monthly pi-format session JSONL; every assistant usage event is summed (rewound branches are already billed) and subagent session files count too, since their tokens are not folded into the parent; honours $OMP_CODING_AGENT_DIR; per-event cost is trusted when reported; bridge/ conversion copies are skipped because their originals are already counted at the source
Keychain / ~/.claude/.credentials.jsonapi.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éAPIpokeapi.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

If a provider's logs live outside those built-in paths, add the folder in Settings → Advanced → Additional scan folders. Pick the provider first — each folder is parsed only by that provider, so pointing a Gemini field at Claude logs would mis-attribute tokens. Extra folders are added to the built-in locations; they never replace them.

Privacy & permissions

  • On-device first. Token usage is read directly from local Claude Code, Codex, Gemini CLI, Antigravity, OpenCode, Hermes Agent, Cursor, Grok CLI, Copilot CLI, Kiro CLI, Pi Agent, and omp data. The app never uploads usage or runs model turns.
  • Outbound requests. The app is not fully offline. It talks to twelve hosts: pokeapi.co and graphql.pokeapi.co (species/evolution), raw.githubusercontent.com (sprites), api.anthropic.com (Claude official limits), claude.ai (Claude official limits when you save an optional claude.ai session key in Settings — the key only, no prompts or project paths), cursor.com (Cursor usage summary when you are signed into Cursor locally — session credential only, no prompts or project paths), cloudcode-pa.googleapis.com and daily-cloudcode-pa.googleapis.com (Antigravity official limits) plus oauth2.googleapis.com (their token refresh), status.claude.com and status.openai.com (incident banner — off switch in Settings), and api.github.com (update check). None of them carry your usage logs, prompts, or project paths — only the request itself (Cursor sends your session cookie to fetch your own usage rows, same as the web dashboard).
  • 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 ~/.claude/.credentials.json is present, each poll re-reads it, so an in-place /login to another account is picked up without pressing refresh. The token is held in memory only — the app creates no Keychain item of its own. If there is no credentials file, limits stay on the cached token until it expires or 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.

Contributors

Contributions of all sizes are welcome — see CONTRIBUTING.md for how to build, test, and open a pull request.

Contributors

License & disclaimer

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.

의견

판정에 대한 반론, 도입 경험, 정정 제보를 환영합니다. GitHub 계정으로 참여합니다.

이것도 재봤습니다

전체 리포트 →

이번 주 실측, 메일로 받기

매주 금요일, 그 주의 리포트와 매거진을 보내드립니다. 광고 없이 실측만.