{"id":50620390,"url":"https://github.com/x0c/subswap","last_synced_at":"2026-06-12T18:00:59.230Z","repository":{"id":360969687,"uuid":"1252503696","full_name":"x0c/subswap","owner":"x0c","description":"Claude, Codex and ChatGPT account switcher with quota-aware auto-swap","archived":false,"fork":false,"pushed_at":"2026-06-06T09:37:05.000Z","size":336,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-06T11:21:45.178Z","etag":null,"topics":["account-switcher","ai-tools","anthropic","automation","chatgpt","claude-code","codex-cli","keyring","openai","quota-tracker","rust-cli"],"latest_commit_sha":null,"homepage":null,"language":"Rust","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/x0c.png","metadata":{"files":{"readme":"README.ja.md","changelog":null,"contributing":"CONTRIBUTING.md","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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-28T15:29:24.000Z","updated_at":"2026-06-06T09:37:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/x0c/subswap","commit_stats":null,"previous_names":["x0c/subswap"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/x0c/subswap","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/x0c%2Fsubswap","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/x0c%2Fsubswap/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/x0c%2Fsubswap/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/x0c%2Fsubswap/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/x0c","download_url":"https://codeload.github.com/x0c/subswap/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/x0c%2Fsubswap/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34256188,"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-12T02:00:06.859Z","response_time":109,"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-tools","anthropic","automation","chatgpt","claude-code","codex-cli","keyring","openai","quota-tracker","rust-cli"],"created_at":"2026-06-06T11:01:01.090Z","updated_at":"2026-06-12T18:00:59.182Z","avatar_url":"https://github.com/x0c.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# subswap - Claude、Codex、ChatGPT アカウント切り替えツール\n\nLanguages: [English](README.md) | [简体中文](README.zh-CN.md) | 日本語 | [한국어](README.ko.md)\n\nsubswap は、Claude Code、Anthropic Claude、OpenAI Codex CLI、ChatGPT の複数の AI サブスクリプションアカウントを管理するための Rust CLI です。ローカルのログイン状態を取り込み、認証情報を OS の keyring に保存し、クォータウィンドウを確認し、使用量が設定済みしきい値を超えたときに手動または自動でアクティブアカウントを切り替えます。\n\nClaude アカウント切り替えツール、Codex アカウント管理ツール、ChatGPT クォータトラッカー、または複数 Provider を統合するサブスクリプション切り替えツールとして利用できます。\n\n## 機能\n\n- **Claude Code と Codex CLI のマルチアカウント切り替え**：再ログインなしでアクティブアカウントを切り替えます。\n- **クォータ対応ステータス**：利用可能な場合、Claude の 5h / 7d 使用量や Codex / ChatGPT の使用データなど、Provider のクォータウィンドウを表示します。\n- **自動アカウント切り替え**：バックグラウンド daemon が、使用量が設定済みしきい値を超えたアカウントから切り替えます。\n- **ネットワークに依存しない手動切り替え**：クォータ API の失敗、token の期限切れ、ネットワーク切断があっても `subswap swap` は動作します。\n- **keyring ベースの認証情報保存**：シークレットは macOS Keychain、Windows Credential Manager、Linux secret-service に保存されます。\n- **Provider ベースのアーキテクチャ**：Claude / Anthropic と Codex / ChatGPT は別々の crate なので、core のポリシーを変えずに新しい AI Provider を追加できます。\n\n## 対応クライアント\n\n| Provider | ローカルクライアント | subswap が管理するもの |\n|---|---|---|\n| Claude / Anthropic | Claude Code (`~/.claude`) | OAuth 認証情報、アクティブアカウントファイル、5h / 7d クォータ、token keepalive |\n| Codex / ChatGPT | Codex CLI (`~/.codex`) | `auth.json` パススルー、アクティブアカウントファイル、ChatGPT 使用量検索 |\n\n## よくある用途\n\n- 複数の Claude Pro、Claude Max、ChatGPT Plus、ChatGPT Team シートを切り替える。\n- 現在のアカウントが利用上限に達したときのために、予備の AI サブスクリプションを待機させておく。\n- 長いコーディングセッションを始める前に、各アカウントの使用量を確認する。\n- Claude と ChatGPT のアカウント切り替えを 1 つの CLI にまとめる。\n\n## ステータス\n\n| マイルストーン | 範囲 | 状態 |\n|---|---|---|\n| M1 | workspace + core trait/model + minimal CLI | done |\n| M2 | Claude provider: keyring-backed swap, 5h/7d quota, best-effort token refresh | done |\n| M3 | Codex provider: opaque auth.json passthrough, atomic write, tolerant wham/usage parsing | done |\n| M4 | `subswapd` daemon: periodic poll + auto-swap + Claude token keepalive + zero-config auto-spawn | done |\n\n## なぜ必要か\n\n複数の AI サブスクリプションを利用していると、次のような状況が起こりがちです。\n\n- Claude Pro の利用枠を使い切り、再ログインせずに ChatGPT へ切り替えたい。\n- 2 つの ChatGPT シートを持っていて、1 行のコマンドでアクティブなものを切り替えたい。\n- 各アカウントのウィンドウ（5h / 7d）ごとの残りを確認したい。\n\nsubswap は各アカウントを OS の keyring（Keychain / Credential Manager / secret-service）に保存し、同じオンディスク認証情報ファイルを読むすべてのクライアントでアクティブアカウントをアトミックに切り替えます。手動切り替えはネットワークでブロックされず、クォータ検索は参考情報として扱われます。\n\n## インストール\n\nHomebrew を使う場合:\n\n```bash\nbrew install x0c/tap/subswap\n```\n\n先に tap してから名前でインストールすることもできます。\n\n```bash\nbrew tap x0c/tap\nbrew install subswap\n```\n\nソースからインストールする場合は Rust 1.80+ が必要です。\n\n```bash\ngit clone https://github.com/x0c/subswap\ncd subswap\ncargo install --path crates/cli\nsubswap --help\n```\n\nGit から直接インストールすることもできます。\n\n```bash\ncargo install --git https://github.com/x0c/subswap --path crates/cli\n```\n\n## クイックスタート\n\n```bash\n# default: sync local active accounts, fetch quotas, auto-swap if past threshold,\n# then print a one-screen status. Run this whenever you want to know what's up.\nsubswap\n\n# manually swap to a specific account (escape hatch — never depends on the network)\nsubswap swap alice@example.com\n# disambiguate when the same id exists under multiple providers:\nsubswap swap claude/alice@example.com\n\n# remove an account from the registry and the keyring\nsubswap rm alice@example.com\n\n# environment self-check (client files, keyring, config dirs)\nsubswap doctor\n```\n\nClaude Code / Codex CLI に少なくとも一度ログインしていれば、初回実行時に `~/.claude` と `~/.codex` からアカウントが自動的に取り込まれます。\n\n最初の `subswap` 実行時には、macOS 以外の Unix プラットフォームで分離されたバックグラウンド daemon（`subswapd`）も起動します。daemon はクォータをポーリングしてバックグラウンドで自動切り替えを行い、Claude OAuth token を新鮮に保つことで、長く使っていなかったアカウントへ切り替えた瞬間に 401 になることを避けます。macOS では、切り離されたプロセスの Keychain アクセスが追加の認証プロンプトを出すことがあるため明示的な opt-in が必要です。自動起動を有効にするには `SUBSWAP_AUTO_DAEMON=1` を export してください。daemon は単一インスタンス（ファイルロック）です。停止しても問題ありません：`pkill -f 'subswap __daemon'` または `pkill subswapd`。完全に無効化するには `SUBSWAP_NO_DAEMON=1` を export してください。\n\n## 設計上の不変条件\n\n貢献前に把握しておきたい重要な前提です。\n\n1. **`swap` はクォータ検索に依存しません。** API が停止している、keyring にアクセスできない、token が期限切れである場合でも、手動切り替えはアクティブアカウントの切り替えを試みる必要があります。\n2. **シークレットは OS keyring のみに保存されます。** `registry.toml`、監査ログ、スナップショットには平文の token や refresh token を含めません。\n3. **切り替えはアトミックで、ロールバック可能です。** 各 `activate` は変更前に `state_dir/snapshots/\u003cts\u003e/` にスナップショットを書き込みます。いずれかの書き込みが失敗した場合はロールバックします。\n4. **Provider を追加するには `crates/providers/\u003cid\u003e` crate を追加し、`cli/src/main.rs::AppContext::build()` に 1 行登録します。** `core` に Provider 固有ロジックは置きません。\n5. **自動切り替えしきい値は集中管理され、設定可能です。** コンパイル時のデフォルトは `crates/core/src/defaults.rs` にあり、実行時設定で上書きできます。\n\n詳細：[`docs/`](docs/)（中国語の内部コラボレーション文書）。\n\n## 比較\n\n| ツール | 主な用途 | subswap との違い |\n|---|---|---|\n| 単一 Provider のアカウント切り替えツール | 1 つの上流のみを対象 | subswap は 1 つの Provider 抽象で Claude と Codex / ChatGPT をサポート |\n| クォータダッシュボード | 使用量の可視化のみ | subswap はクォータウィンドウが埋まったときに別のローカルアカウントをアクティブ化可能 |\n| 手動ログイン/ログアウト | 一度に 1 アカウント | subswap は登録済みアカウントを keyring に保持し、ローカルファイルをアトミックに切り替え |\n\n## FAQ\n\n### `subswap swap` はクォータ API を呼びますか？\n\nいいえ。手動切り替えは避難経路であり、クォータ検索に依存しません。上流 API が停止している場合や token が期限切れの場合でも、`subswap swap claude/alice@example.com` はそのローカルアカウントのアクティブ化を試みます。\n\n### token はどこに保存されますか？\n\ntoken と refresh token は OS keyring のみに保存されます。`registry.toml`、監査ログ、スナップショットには平文シークレットを含めない設計です。\n\n### Claude 専用ですか？\n\nいいえ。最初に対応する Provider は Claude / Anthropic と Codex / ChatGPT です。core crate は Provider trait を公開しているため、将来の AI サブスクリプション Provider は別 crate として追加できます。\n\n## GitHub topics\n\n公開後に推奨するリポジトリ topics：\n\n`claude-code`, `codex-cli`, `chatgpt`, `anthropic`, `openai`, `account-switcher`, `quota-tracker`, `ai-tools`, `rust-cli`, `keyring`, `automation`\n\n## レイアウト\n\n```\ncrates/\n  core/                # data model, Provider trait, CredentialStore, paths\n  cli/                 # `subswap` binary\n  daemon/              # `subswapd` binary\n  providers/\n    claude/            # Claude / Anthropic provider\n    codex/             # Codex / ChatGPT provider\n```\n\n## コントリビューション\n\nIssues と PR を歓迎します。注意事項：\n\n- `docs/` と `AGENTS.md` の内部文書は中国語です。コードコメントは中国語です。ユーザーに見える内容（CLI テキスト、エラーメッセージ、tracing ログ、crate description）は英語です。\n- PR を開く前に `cargo check --workspace` と `cargo test --workspace` を実行してください。\n\n## License\n\nMIT — [`LICENSE`](LICENSE) を参照してください。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fx0c%2Fsubswap","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fx0c%2Fsubswap","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fx0c%2Fsubswap/lists"}