{"id":50947241,"url":"https://github.com/japananh/aimonitor","last_synced_at":"2026-06-17T21:30:58.393Z","repository":{"id":357561941,"uuid":"1237268769","full_name":"japananh/aimonitor","owner":"japananh","description":"Multi-account Claude Code usage monitor \u0026 silent account switcher, plus a Slack/ClickUp MCP server — macOS menu bar + CLI. Local-first, no telemetry.","archived":false,"fork":false,"pushed_at":"2026-06-17T04:47:24.000Z","size":1155,"stargazers_count":3,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-17T06:18:53.048Z","etag":null,"topics":["account-switcher","ai","anthropic","claude","claude-code","cli","clickup","golang","keychain","macos","mcp","mcp-server","menu-bar","menubar","oauth","rate-limit","slack","swift","swiftui","usage-monitor"],"latest_commit_sha":null,"homepage":"","language":"Go","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/japananh.png","metadata":{"files":{"readme":"README-vi.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"docs/security.md","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-05-13T03:04:51.000Z","updated_at":"2026-06-15T07:44:56.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/japananh/aimonitor","commit_stats":null,"previous_names":["japananh/aimonitor"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/japananh/aimonitor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/japananh%2Faimonitor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/japananh%2Faimonitor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/japananh%2Faimonitor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/japananh%2Faimonitor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/japananh","download_url":"https://codeload.github.com/japananh/aimonitor/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/japananh%2Faimonitor/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34466928,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-17T02:00:05.408Z","response_time":127,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["account-switcher","ai","anthropic","claude","claude-code","cli","clickup","golang","keychain","macos","mcp","mcp-server","menu-bar","menubar","oauth","rate-limit","slack","swift","swiftui","usage-monitor"],"created_at":"2026-06-17T21:30:56.886Z","updated_at":"2026-06-17T21:30:58.382Z","avatar_url":"https://github.com/japananh.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# aimonitor\n\n**Giám sát usage \u0026 tự động đổi tài khoản Claude Code (nhiều account) cho macOS và Linux.**\n\n[![CI](https://github.com/japananh/aimonitor/actions/workflows/ci.yml/badge.svg)](https://github.com/japananh/aimonitor/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![Latest release](https://img.shields.io/github/v/release/japananh/aimonitor?sort=semver)](https://github.com/japananh/aimonitor/releases)\n\n\u003e [English](README.md) | [简体中文](README-zh.md) | [繁體中文](README-zh-TW.md) | **Tiếng Việt**\n\n\u003cimg src=\"docs/popover.png\" alt=\"Popover trên menu bar: thanh usage 5h/7d theo từng account\" width=\"340\"\u003e\n\n\u003c/div\u003e\n\n## Tính năng\n\n- 🔍 **Thanh usage 5h + 7d theo từng account** — đọc từ `/api/oauth/usage` của Anthropic (không tốn token), kèm đường xu hướng (`↗ +21% in 45m`).\n- 🔀 **Đổi account âm thầm** — `aimonitor switch \u003clabel\u003e` refresh token OAuth rồi thay credential live. Không cần `claude /login`, không phải mở terminal.\n- 🤖 **Auto-swap** khi chạm ngưỡng 5h *hoặc* 7d (mặc định 80 %) — chọn account còn nhiều headroom nhất (cân cả 2 cửa sổ), bỏ qua account đã cạn/đang bị rate-limit, và đổi ngay nếu account active chạm 100 %. Session `claude` đang chạy tự theo account mới.\n- 🔔 **Thông báo khi gần ngưỡng** (khi auto-swap tắt).\n- 💾 **Export / import** settings, hoặc chuyển account sang máy khác — credential là tùy chọn, mã hóa bằng passphrase (Argon2id + AES-256-GCM).\n- 🔌 **MCP server** — 30 tool Slack + ClickUp cho Claude Code qua stdio, có chế độ read-only theo từng dịch vụ.\n- 🔐 **Lưu trong OS keyring** (macOS Keychain, Linux libsecret). SQLite chỉ giữ tham chiếu; token không rời keyring. Không telemetry.\n\n## Cài đặt\n\n```sh\n# macOS (Sonoma 14+) — một lệnh: tap, trust, cài, gỡ Gatekeeper\ncurl -fsSL https://raw.githubusercontent.com/japananh/aimonitor/main/packaging/macos/install.sh | bash\n\n# Linux (Ubuntu 22.04+) — chỉ CLI\ncurl -fsSL https://raw.githubusercontent.com/japananh/aimonitor/main/packaging/linux/install.sh | sh\n\n# Mọi nền tảng, chỉ CLI\ngo install github.com/japananh/aimonitor/cmd/aimonitor@latest\n```\n\n\u003e **Thích dùng Homebrew trực tiếp?** `brew trust japananh/tap \u0026\u0026 brew install --cask japananh/tap/aimonitor`, rồi gỡ Gatekeeper lần đầu: `xattr -dr com.apple.quarantine /Applications/AIMonitor.app` (hoặc chuột phải → Open). Script một dòng ở trên làm sẵn cả hai. Xem [`docs/unsigned-app.md`](docs/unsigned-app.md).\n\n### Nâng cấp\n\n```sh\nbrew upgrade --cask aimonitor   # macOS\naimonitor update check          # CLI: có bản mới chưa?\naimonitor update install        # CLI: nâng cấp chạy nền\n```\n\nApp trên menu bar cũng tự kiểm tra GitHub khi mở và mời cập nhật ở **Preferences → Check for updates**. Bản pre-release không bao giờ được phục vụ tự động — `brew upgrade` luôn giữ bạn ở bản stable mới nhất.\n\n## Bắt đầu nhanh\n\n```sh\naimonitor add --adopt-current --label personal   # đăng ký login Claude hiện tại\naimonitor add --label work                        # thêm account khác (chạy claude /login, poll keychain)\naimonitor switch work                             # đổi âm thầm\naimonitor list                                    # xem usage 5h / 7d từng account\naimonitor doctor                                  # health check\n```\n\nĐang dùng switcher khác? `aimonitor import` kéo account của nó về một lần. Auto-swap bật sẵn ở 80 % — trường hợp thường không cần chỉnh gì thêm.\n\n## Cấu hình\n\n```sh\naimonitor config set auto_swap.enabled true        # mặc định true\naimonitor config set auto_swap.threshold_pct 80    # ngưỡng 5h\naimonitor config set auto_swap.threshold_7d_pct 80 # ngưỡng 7d\naimonitor config set autostart true                # daemon chạy khi đăng nhập\n```\n\nSao lưu hoặc chuyển sang máy khác:\n\n```sh\naimonitor config export --out backup.json                                          # chỉ settings (không secret)\nAIMONITOR_PASSPHRASE=… aimonitor config export --include-tokens --out full.json     # + credential mã hóa\nAIMONITOR_PASSPHRASE=… aimonitor config import full.json                            # khôi phục ở máy khác\n```\n\n`--include-tokens` đóng gói login đã mã hóa bằng passphrase — khôi phục xong là `claude` chạy được ở máy kia mà không cần login lại, nên hãy giữ file đó như mật khẩu. Cùng thao tác có trong Preferences → Backup.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eTất cả config key\u003c/b\u003e\u003c/summary\u003e\n\n| Key | Mặc định | Mô tả |\n|---|---|---|\n| `auto_swap.enabled` | `true` | Bật/tắt auto-swap |\n| `auto_swap.threshold_pct` | `80` | Ngưỡng usage 5h (%) để auto-swap |\n| `auto_swap.threshold_7d_pct` | `80` | Ngưỡng usage 7d (%) để auto-swap |\n| `auto_swap.grace_sec` | `60` | Trễ giữa thông báo \"sắp đổi\" và lúc đổi thật (`0` = đổi ngay) |\n| `notify.enabled` | `true` | Cảnh báo khi account active gần ngưỡng (chỉ khi auto-swap tắt) |\n| `notify.warn_pct` / `notify.crit_pct` | `80` / `95` | Mức cảnh báo / nghiêm trọng |\n| `auto_update.enabled` | `true` | Kiểm tra release mới trên GitHub khi mở (không tự cài) |\n| `autostart` | `false` | Chạy daemon khi đăng nhập |\n| `mcp.slack.enabled` / `mcp.clickup.enabled` | `true` | Bật tool MCP của dịch vụ đó |\n| `mcp.slack.read_only` / `mcp.clickup.read_only` | `false` | Ẩn các tool ghi của dịch vụ |\n| `mcp.disabled_tools` | (rỗng) | Tên tool cần ẩn, ngăn cách bằng dấu phẩy |\n\n\u003c/details\u003e\n\n## Cơ chế\n\nDaemon poll `/api/oauth/usage` (~5 phút ± jitter, không tốn token). Khi account active vượt ngưỡng 5h **hoặc** 7d, nó chọn account còn nhiều headroom nhất, refresh token OAuth của account đó (`POST .../v1/oauth/token`) rồi ghi vào slot Keychain live. Session `claude` đang chạy và mở mới đều dùng account mới — không cần `/login`, không restart.\n\nChi tiết: [`docs/architecture.md`](docs/architecture.md) và [`docs/thresholds.md`](docs/thresholds.md).\n\n## MCP server (Slack + ClickUp cho Claude Code)\n\nMột tiến trình stdio phục vụ 30 tool — không cần runtime phụ.\n\n```sh\naimonitor mcp connect slack     # lưu Slack user token (xoxp-…)\naimonitor mcp connect clickup   # lưu ClickUp token (pk_…)\naimonitor mcp register          # thêm server vào Claude Code\n```\n\n- **Slack:** post vào channel/thread (mrkdwn, code block), upload, search, history, permalink.\n- **ClickUp:** cây workspace, task, comment, Docs (đọc \u0026 ghi).\n- **An toàn:** prompt xin-quyền theo từng tool của Claude Code là lớp duyệt; thêm công tắc Enabled / Read-only theo dịch vụ và danh sách ẩn từng tool. Token được verify trực tiếp rồi lưu OS keyring — không vào SQLite hay log.\n\n## Quyền riêng tư \u0026 bảo mật\n\n- Không telemetry, không phone-home. Token OAuth chỉ nằm trong OS keyring; SQLite giữ tham chiếu. Không bao giờ log token.\n- Lưu lượng ra ngoài chỉ gồm: `GET /api/oauth/usage` (introspection, không tốn token), `POST /v1/oauth/token` (refresh token âm thầm), và kiểm tra release GitHub. Không gửi thông tin gì về bạn.\n\nXem [`docs/security.md`](docs/security.md) cho mô hình mối đe dọa.\n\n## Xử lý sự cố\n\n```sh\naimonitor doctor   # kiểm tra sức khỏe: config, SQLite, keyring, account\n```\n\n- **\"Daemon not running\" / usage có vẻ cũ.** Khởi động (hoặc khởi động lại) daemon nền bằng `aimonitor config set autostart true`, hoặc bấm **Start daemon** trong popover — nó đăng ký một LaunchAgent tự chạy lại khi đăng nhập.\n- **App không mở được lần đầu** (chưa ký). Gỡ Gatekeeper một lần: `xattr -dr com.apple.quarantine /Applications/AIMonitor.app`.\n- **Log.** Daemon ghi vào `~/Library/Logs/aimonitor/aimonitor.daemon.log` (INFO/WARN/ERROR — không bao giờ ghi token); nâng cấp chạy nền ghi vào `update.log` bên cạnh.\n- **Lịch sử đổi account.** `aimonitor log` in nhật ký audit các lần switch.\n\n## Gỡ cài đặt\n\n```sh\n# Gỡ app + daemon, giữ nguyên account\nbrew uninstall --cask aimonitor\n\n# Xoá sạch, gồm cả login đã lưu trong Keychain. Phải chạy purge trước vì\n# Homebrew không với tới các keychain stash — và purge cần binary còn cài\n# thì mới xoá được chúng.\naimonitor uninstall --purge \u0026\u0026 brew uninstall --cask aimonitor\n```\n\n`--purge` chỉ xoá Keychain **của riêng aimonitor** (các stash `aimonitor-\u003cuuid\u003e`), **không** đụng slot `Claude Code-credentials` của Claude. Nên tài khoản ấy đang đăng nhập vẫn chạy bình thường trong `claude`, **không phải login lại** — chỉ mất các bản sao mà aimonitor lưu cho những account *khác*.\n\n## Build từ source\n\nCần Go 1.25+. Thuần Go (`CGO_ENABLED=0` chạy được cả trên macOS; truy cập keychain qua `/usr/bin/security`).\n\n```sh\nmake build              # binary CLI\nmake test               # unit test\nmake widget             # AIMonitor.app (macOS; cần Swift toolchain)\nmake release-snapshot   # chạy thử goreleaser\n```\n\n## Giấy phép\n\n[MIT](LICENSE) © [@japananh](https://github.com/japananh)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjapananh%2Faimonitor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjapananh%2Faimonitor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjapananh%2Faimonitor/lists"}