{"id":43031280,"url":"https://github.com/letsur-dev/claude-peak","last_synced_at":"2026-04-07T01:03:28.117Z","repository":{"id":335251125,"uuid":"1144872890","full_name":"letsur-dev/claude-peak","owner":"letsur-dev","description":"Claude Max usage monitor for macOS menu bar","archived":false,"fork":false,"pushed_at":"2026-03-31T09:23:49.000Z","size":6629,"stargazers_count":16,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-31T11:33:52.159Z","etag":null,"topics":["anthropic","claude","claude-ai","claude-code","macos","macos-app","menubar","swift","swiftui","usage-monitor"],"latest_commit_sha":null,"homepage":null,"language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/letsur-dev.png","metadata":{"files":{"readme":"README.ko.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-29T06:25:48.000Z","updated_at":"2026-03-31T09:23:56.000Z","dependencies_parsed_at":"2026-01-31T08:01:07.059Z","dependency_job_id":null,"html_url":"https://github.com/letsur-dev/claude-peak","commit_stats":null,"previous_names":["letsur-dev/claude-peak"],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/letsur-dev/claude-peak","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/letsur-dev%2Fclaude-peak","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/letsur-dev%2Fclaude-peak/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/letsur-dev%2Fclaude-peak/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/letsur-dev%2Fclaude-peak/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/letsur-dev","download_url":"https://codeload.github.com/letsur-dev/claude-peak/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/letsur-dev%2Fclaude-peak/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31495471,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-06T17:22:55.647Z","status":"ssl_error","status_checked_at":"2026-04-06T17:22:54.741Z","response_time":112,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["anthropic","claude","claude-ai","claude-code","macos","macos-app","menubar","swift","swiftui","usage-monitor"],"created_at":"2026-01-31T08:00:21.257Z","updated_at":"2026-04-07T01:03:28.057Z","avatar_url":"https://github.com/letsur-dev.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"[English](README.md)\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/icon.png\" alt=\"Claude Peak\" width=\"128\" style=\"border-radius: 22%;\"\u003e\n\u003c/p\u003e\n\n# Claude Peak\n\nClaude Max 사용량 한도를 모니터링하는 macOS 메뉴바 앱 — 토큰을 소모할수록 더 뜨겁게 타오르는 실시간 불꽃 애니메이션.\n\n## Screenshots\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/demo.gif\" alt=\"Claude Peak demo\" width=\"300\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/screenshot-usage.png\" alt=\"Claude Peak usage\" width=\"300\"\u003e\n  \u003cimg src=\"assets/screenshot-settings.png\" alt=\"Claude Peak settings\" width=\"300\"\u003e\n\u003c/p\u003e\n\n메뉴바에 현재 5-hour 사용률(%)과 reset 남은 시간이 표시되며, 클릭하면 상세 사용량을 확인할 수 있다.\n토큰을 사용 중이면 불꽃 아이콘이 활동량에 따라 애니메이션된다.\n\n## Why Claude Peak?\n\n| | |\n|---|---|\n| 🔥 **실시간 불꽃 애니메이션** | JSONL 토큰 로그를 실시간 모니터링하는 유일한 앱 — tps가 올라갈수록 불꽃이 거세짐 |\n| 🎮 **MADMAX 모드** | *\"Pathetic\"* 부터 *\"WITNESS ME\"* 까지 — 게이미피케이션 챌린지 |\n| 🔐 **원클릭 OAuth** | 세션키 복사 불필요, DevTools 불필요 — 브라우저 로그인만으로 완료 |\n| ⚡ **Pure Swift** | Electron 없음, 외부 의존성 zero, SPM으로 8개 소스 파일 |\n\n## MADMAX Challenge\n\nMADMAX 모드를 켜고 토큰 처리량의 한계를 밀어봐. 불꽃 단계마다 새로운 도전 메시지가 해금된다:\n\n| 불꽃 | tps | EN | 한국어 |\n|------|-----|----|--------|\n| 🔥 × 0 | 0 | *Light it up. If you can.* | *불 좀 붙혀봐. 춥다야.* |\n| 🔥 × 1–2 | 1 – 19,999 | *That's it? Pathetic.* | *겨우 이거?* |\n| 🔥 × 3–4 | 20,000 – 39,999 | *Warming up...* | *슬슬 가볼까* |\n| 🔥 × 5–6 | 40,000 – 59,999 | *Now we're cooking.* | *제법인데?* |\n| 🔥 × 7–8 | 60,000 – 79,999 | *FEEL THE BURN* | *미쳤다!!!* |\n| 🔥 × 9 | 80,000 – 89,999 | *ONE MORE. DO IT.* | *거의 다 왔다!!!* |\n| 🔥 × 10 | 90,000+ | ***WITNESS ME*** | ***나를 기억해!!!*** |\n\n\u003e **불꽃 10개 찍을 수 있어?** 대부분은 *\"겨우 이거?\"* 에서 멈춘다.\n\n### 주간 페이스\n\n7일 중 경과 시간 대비 사용률로 페이스를 계산:\n\n`페이스 = 실제 사용률 / (경과일 ÷ 7 × 100)`\n\n| 페이스 | EN | 한국어 |\n|--------|----|--------|\n| \u003c 0.3 | *Go absolutely wild* | *마구 난사해도 됨* |\n| \u003c 0.6 | *Plenty of room* | *여유 넘침* |\n| \u003c 0.85 | *Cruising nicely* | *적당히 쓰는 중* |\n| \u003c 1.1 | *Right on pace* | *딱 맞는 페이스* |\n| \u003c 1.4 | *Getting warm* | *슬슬 걱정된다잉* |\n| \u003c 1.7 | *Burning hot* | *이러다 거덜남* |\n| ≥ 1.7 | *Hit the brakes!* | *거덜직전* |\n\n페이스 메시지는 3초마다 **행동 제안**과 번갈아 표시됩니다:\n\n| 상황 | EN | 한국어 |\n|------|----|----|\n| 여유 | *Today up to X% is fine* | *오늘 X%까지 OK* |\n| 적당 | *Keep this pace* | *이 페이스 유지하면 딱* |\n| 위험 | *Stay under X% today* | *오늘은 X% 이하로* |\n| 거덜 | *Maybe take a break today...* | *오늘은 쉬는 게...* |\n| 리셋 24시간 내, 20%↑ 남음 | *X% left, resets tomorrow. Use it!* | *내일 리셋인데 X% 남음. 써!* |\n| 리셋 6시간 내, 10%↑ 남음 | *X% left, reset soon! Burn it* | *X% 남았는데 곧 리셋! 태워라* |\n| 리셋 1시간 내, 5%↑ 남음 | *X% wasted! Use it NOW!* | *X% 버린다! 지금 당장!* |\n\n### 불꽃 모드\n\n설정에서 네 가지 모드 선택 가능:\n\n- **Off** — 불꽃 아이콘 없음\n- **1** — 고정 1개, 토큰 활동 시 애니메이션만\n- **3** (기본) — tps에 따라 1~3개 유동\n- **MADMAX** — tps에 따라 1~10개 유동 (10,000 tps당 불꽃 1개)\n\n\u003cdetails\u003e\n\u003csummary\u003eDynamic (3) 모드 — 애니메이션 속도 테이블\u003c/summary\u003e\n\n| tps | 불꽃 | 애니메이션 속도 |\n|-----|------|----------------|\n| 0 | 🔥 (작은 불씨, 정적) | 없음 |\n| 0 – 30,000 | 🔥 × 1 | 0.50초 → 0.20초 |\n| 30,000 – 60,000 | 🔥 × 2 | 0.30초 → 0.15초 |\n| 60,000+ | 🔥 × 3 | 0.20초 → 0.08초 |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eMADMAX 모드 — 애니메이션 속도 테이블\u003c/summary\u003e\n\n| tps | 불꽃 | 애니메이션 속도 |\n|-----|------|----------------|\n| 0 | 🔥 (작은 불씨, 정적) | 없음 |\n| 1 – 9,999 | 🔥 × 1 | 0.40초 |\n| 10,000 – 19,999 | 🔥 × 2 | ↓ |\n| ... | ... | ↓ |\n| 90,000+ | 🔥 × 10 | 0.06초 |\n\n\u003c/details\u003e\n\n## 기능\n\n- **실시간 불꽃 애니메이션** — `~/.claude/projects/` JSONL 로그를 감시, 토큰 처리량에 따라 불꽃 애니메이션\n- **원격 서버 모니터링** — 원격 머신(예: Tailscale)의 토큰 활동을 합산하여 하나의 불꽃으로 표시\n- **메뉴바 표시** — 5-hour utilization %, reset 남은 시간 (설정 가능)\n- **상세 Popover** — 5-hour, 7-day(All models), 7-day(Sonnet) 사용량 + reset 타이머\n- **주간 페이스 표시** — 사용량 페이스가 적당한지, 여유 있는지, 위험한지 알려줌\n- **한영 메시지 전환** — 설정에서 메시지 언어 변경 가능\n- **설정** — 표시 형식, 갱신 주기 (1/5/10분), 불꽃 모드, 메시지 언어, 원격 서버\n- **OAuth PKCE** — 브라우저 기반 인증, 자동 토큰 갱신\n\n\u003e **참고:** Extra Usage 표시는 v1.4.5에서 UI 간소화를 위해 제거되었습니다. 필요하시면 [이슈를 열어주세요](https://github.com/letsur-dev/claude-peak/issues).\n\n## 설치\n\n### Homebrew (추천)\n\nPre-built bottle 제공 — Xcode 설치 불필요.\n\n```bash\nbrew tap letsur-dev/claude-peak https://github.com/letsur-dev/claude-peak.git\nbrew install claude-peak\n\n# 실행 (첫 실행 시 ~/Applications에 자동 링크)\nclaude-peak\n```\n\n**업데이트:**\n\n```bash\nbrew update\nbrew upgrade claude-peak\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e문제 해결\u003c/summary\u003e\n\n`undefined local variable` 또는 tap 관련 에러 발생 시:\n\n```bash\nbrew untap letsur-dev/claude-peak\nbrew tap letsur-dev/claude-peak https://github.com/letsur-dev/claude-peak.git\nbrew reinstall claude-peak\n```\n\n\u003e **참고:** repo 이름이 `homebrew-claude-peak`이 아닌 `claude-peak`이라 URL을 명시해야 합니다.\n\n\u003c/details\u003e\n\n### 소스에서 빌드\n\nXcode 또는 전체 Xcode가 포함된 Command Line Tools 필요.\n\n```bash\ngit clone https://github.com/letsur-dev/claude-peak.git\ncd claude-peak\n./build.sh\n\n# 실행\nopen ~/Applications/Claude\\ Peak.app\n```\n\n## 원격 서버\n\n원격 머신에서 돌아가는 Claude Code 세션을 모니터링한다. HTTP로 토큰 활동을 가져와서 로컬과 합산 — 불꽃이 총 처리량을 반영한다.\n\n### 설정\n\n**원격 머신에서 (Node.js 18+ 필요):**\n\n```bash\nnpx claude-peak-server          # 백그라운드로 실행\nnpx claude-peak-server status   # 상태 확인\nnpx claude-peak-server down     # 종료\n```\n\n서버는 `~/.claude/projects/**/*.jsonl`을 2초마다 스캔하고 다음 엔드포인트를 노출한다:\n- `GET /api/activity` → `{ tokensPerSecond, recentTokens: [{date, tokens}] }`\n- `GET /health` → `{ ok: true }`\n\n기본 포트: `3200` (`PORT` 환경변수로 변경 가능).\n\n**Mac에서:**\n\nSettings → Remote Server → 토글 ON → host와 port 입력 → 🟢 = 연결됨.\n\n**HTTP**로 직접 연결 (Tailscale, LAN, VPN 등 네트워크 접근 필요).\n\n\u003cdetails\u003e\n\u003csummary\u003eSSH만 되는 환경\u003c/summary\u003e\n\nSSH 포트포워딩으로 우회:\n\n```bash\nssh -L 3200:localhost:3200 your-server\n```\n\nSettings에서 host를 `localhost`로 설정하면 끝.\n\n\u003c/details\u003e\n\n## Tech Details\n\n\u003cdetails\u003e\n\u003csummary\u003e인증 플로우\u003c/summary\u003e\n\n첫 실행 시 \"Login with Claude\" 버튼 → 브라우저에서 Claude 계정 로그인 → 자동 토큰 저장.\n\n1. 앱이 로컬 HTTP 서버 시작 (랜덤 포트, IPv6)\n2. 브라우저로 `claude.ai/oauth/authorize` 열기 (PKCE code_challenge 포함)\n3. 사용자 인증 후 `http://localhost:PORT/callback?code=xxx`로 리다이렉트\n4. 앱이 code를 받아 `platform.claude.com/v1/oauth/token`에서 토큰 교환\n5. `~/.config/claude-peak/tokens.json`에 저장 (0600 권한)\n\n**토큰 갱신:**\n- access token 만료 5분 전 자동 refresh\n- refresh 실패 시 재로그인 안내\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eAPI\u003c/summary\u003e\n\n### Usage 조회\n\n```\nGET https://api.anthropic.com/api/oauth/usage\nHeaders:\n  Authorization: Bearer {access_token}\n  anthropic-beta: oauth-2025-04-20\n  User-Agent: claude-code/2.0.32\n```\n\n응답 예시:\n\n```json\n{\n  \"five_hour\": { \"utilization\": 2.0, \"resets_at\": \"2026-01-29T09:59:59Z\" },\n  \"seven_day\": { \"utilization\": 63.0, \"resets_at\": \"2026-01-29T23:59:59Z\" },\n  \"seven_day_sonnet\": { \"utilization\": 0.0, \"resets_at\": null },\n  \"extra_usage\": { \"is_enabled\": false }\n}\n```\n\n- `utilization`: 0~100 (퍼센트)\n- `resets_at`: ISO 8601 타임스탬프 또는 null\n\n### Token Refresh\n\n```\nPOST https://platform.claude.com/v1/oauth/token\nContent-Type: application/json\n\n{\n  \"grant_type\": \"refresh_token\",\n  \"refresh_token\": \"...\",\n  \"client_id\": \"9d1c250a-e61b-44d9-88ed-5944d1962f5e\",\n  \"scope\": \"user:profile user:inference\"\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e개발 과정에서 발견한 것들\u003c/summary\u003e\n\n- **Keychain 토큰 만료 문제**: Claude Code는 매 세션마다 브라우저 OAuth로 재인증하며, Keychain의 refresh token이 무효화될 수 있다. 따라서 앱 자체 OAuth 플로우가 필요.\n- **`claude setup-token`의 한계**: inference-only 토큰(`user:inference` scope만)을 발급하므로 usage API(`user:profile` 필요)에 사용 불가.\n- **OAuth redirect URI**: 반드시 `http://localhost:PORT/callback` 형식이어야 함. `127.0.0.1`이나 `/oauth/callback` 경로는 거부됨.\n- **IPv6**: macOS에서 `localhost`는 `::1`(IPv6)로 해석될 수 있으므로 IPv6 소켓 필요.\n- **Token exchange**: `state` 파라미터가 authorize와 token exchange 양쪽에 필요.\n- **utilization 값**: API 응답의 utilization은 0~100 정수 (0~1 소수가 아님).\n- **필드명**: API 응답은 `resets_at` (복수형 s).\n- **JSONL 토큰 로그**: Claude Code는 `~/.claude/projects/` 아래에 세션별 JSONL 파일을 생성하며, 각 라인의 `message.usage`에 토큰 사용량이 기록됨.\n\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fletsur-dev%2Fclaude-peak","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fletsur-dev%2Fclaude-peak","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fletsur-dev%2Fclaude-peak/lists"}