# shusub2 Terminal UI for the token-safe Sub2API account feed exposed by `cliproxy-codex-quota`. ## Quick Start Run once from a public Git repo with `uvx`: ```bash uvx --from git+https://gitea.shujk.top/shujakuin/shusub2.git shusub2 \ --api-url https://codex.server2.shujk.top/1232131231313123/api/tui/accounts ``` Install as a user command: ```bash uv tool install git+https://gitea.shujk.top/shujakuin/shusub2.git shusub2 --api-url https://codex.server2.shujk.top/1232131231313123/api/tui/accounts ``` Configure the default public API URL for `shusub2`: ```bash mkdir -p ~/.config/shusub2 chmod 700 ~/.config/shusub2 printf '%s\n' 'https://codex.server2.shujk.top/1232131231313123/api/tui/accounts' > ~/.config/shusub2/api-url chmod 600 ~/.config/shusub2/api-url shusub2 ``` Environment variables override the config file: - `SHUSUB2_API_URL` - `SUB2API_QUOTA_TUI_API_URL` - `SHUSUB2_API_URL_FILE` - `SHUSUB2_STATUS_URL` - `SHUSUB2_STATUS_URL_FILE` - `SHUSUB2_VERSION_CHECK_URL` - `SHUSUB2_VERSION_CHECK_TIMEOUT` - `SHUSUB2_NO_VERSION_CHECK` ## Local Development ```bash cd apps/sub2api-quota-tui uv run shusub2 ``` Run inside zellij: ```bash zellij action new-pane --name sub2api-quota -- \ bash -lc 'cd /home/shujakuin/infra/apps/sub2api-quota-tui && uv run shusub2' ``` Configuration: - `--api-url` / `SUB2API_QUOTA_TUI_API_URL` - `--status-url` / `SHUSUB2_STATUS_URL` - `--refresh-seconds` / `SUB2API_QUOTA_TUI_REFRESH_SECONDS` - `--timeout` / `SUB2API_QUOTA_TUI_TIMEOUT` The TUI reads `/api/tui/accounts` and can optionally read `sub2api-status` `/api/status` for channel monitor health. It does not need SSH, database access, API keys, OAuth credentials, or plaintext env files. When `--status-url` is omitted, `shusub2` infers a sibling `/api/status` URL from account URLs ending in `/api/tui/accounts`, so the public Codex endpoint automatically enables monitor availability. On startup it also checks the public Gitea repo for a newer package version and prints a short upgrade hint when one is available. Columns are ordered for scanning inside zellij: ```text Name | Provider | Group | Daily | Today | Tokens | Req | Kind | 5h | 7d | Reset | Status | Availability ``` `Provider` distinguishes `openai` and `anthropic` accounts from the public `platform` field returned by the API. `Daily` is shown as `used/limit` when Sub2API has `quota_daily_*` fields in `accounts.extra`; otherwise it is `-`. `Group` is the derived Sub2API tier alias group. Higher tiers win when multiple aliases exist: `id < slow < fast < sfast`. The table shows `sfast` first, then `fast`, `slow`, `id`, and ungrouped accounts. When `--status-url` is configured, the status line shows channel monitor health, and the selected account detail shows the matching monitor status when one exists. Monitor binding first uses the shared `base_url_hash` emitted by the account API and `sub2api-status`; name-token matching remains only as a fallback for older status payloads. `Availability` is derived from the bound channel monitor. Accounts without a matching monitor show `-`.