
Research
Supply Chain Attack on Axios Pulls Malicious Dependency from npm
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.
codex-quota
Advanced tools
Multi-account manager for OpenAI Codex CLI and OpenCode with OAuth browser authentication
Multi-account manager for OpenAI Codex CLI and OpenCode. Add, switch, list, and remove accounts with OAuth browser authentication. Seamlessly switch between both tools with shared credentials.
Zero dependencies - uses Node.js built-ins only.
npm install -g codex-quota
Or with bun:
bun add -g codex-quota
After installation, both codex-quota and cq commands are available.
# Add a new account (opens browser for OAuth)
codex-quota codex add personal
# Add a Claude credential (interactive)
codex-quota claude add work
# Check quota for all accounts
codex-quota
# Switch active Codex account
codex-quota codex switch personal
# Switch Claude credentials
codex-quota claude switch work
# List accounts
codex-quota codex list
codex-quota claude list
# Remove an account
codex-quota codex remove old-account
codex-quota claude remove old-account
Run codex-quota with no namespace to check combined Codex + Claude usage.
Check usage quota for Codex accounts.
codex-quota codex quota # All Codex accounts
codex-quota codex quota personal # Specific account
codex-quota codex quota --json # JSON output
Check usage quota for Claude accounts.
codex-quota claude quota # All Claude accounts
codex-quota claude quota work # Specific credential
codex-quota claude quota --json # JSON output
Add a new Codex account via OAuth browser authentication.
codex-quota codex add # Label derived from email
codex-quota codex add work # With explicit label
codex-quota codex add --no-browser # Print URL (for SSH/headless)
Add a Claude credential interactively.
codex-quota claude add # Prompt for label + credentials
codex-quota claude add work # With explicit label
codex-quota claude add work --json # JSON output
Switch the active account for Codex CLI, OpenCode, and pi.
codex-quota codex switch personal
When you run codex switch:
~/.codex/auth.json with the selected account tokens~/.local/share/opencode/auth.json exists, updates the openai provider entry~/.pi/agent/auth.json exists, updates the openai-codex provider entrySwitch Claude Code, OpenCode, and pi to a stored Claude credential.
codex-quota claude switch work
List all Codex accounts from all sources with status indicators.
codex-quota codex list
codex-quota codex list --json
Output shows:
* = active account (matches ~/.codex/auth.json)List Claude credentials from CLAUDE_ACCOUNTS or ~/.claude-accounts.json.
codex-quota claude list
codex-quota claude list --json
Remove a Codex account from storage.
codex-quota codex remove old-account
Note: Accounts from CODEX_ACCOUNTS env var cannot be removed via CLI.
Remove a Claude credential from storage.
codex-quota claude remove old-account
Note: Accounts from CLAUDE_ACCOUNTS env var cannot be removed via CLI.
| Option | Description |
|---|---|
--json | Output in JSON format |
--no-browser | Print auth URL instead of opening browser |
--no-color | Disable colored output |
--version, -v | Show version number |
--help, -h | Show help |
Accounts are loaded from these locations (in order). Read/write indicates whether the CLI reads from or writes to each path.
| Source | Purpose | Read | Write |
|---|---|---|---|
CODEX_ACCOUNTS env var | JSON array of accounts | Yes | No |
~/.codex-accounts.json | Primary multi-account file (shared with OpenCode) | Yes | Yes (add, remove) |
~/.opencode/openai-codex-auth-accounts.json | OpenCode accounts | Yes | No |
~/.codex/auth.json | Codex CLI single-account (label codex-cli) | Yes | Yes (switch) |
~/.local/share/opencode/auth.json | OpenCode auth file (openai provider) | No | Yes (switch if it exists) |
New accounts added via codex-quota codex add are saved to ~/.codex-accounts.json, which is
shared with OpenCode.
File: ~/.codex-accounts.json
{
"accounts": [
{
"label": "personal",
"accountId": "chatgpt-account-uuid",
"access": "access-token",
"refresh": "refresh-token",
"idToken": "id-token-or-null",
"expires": 1234567890000
}
]
}
| Field | Type | Description |
|---|---|---|
label | string | Unique identifier for the account |
accountId | string | ChatGPT account UUID |
access | string | OAuth access token |
refresh | string | OAuth refresh token |
idToken | string|null | OAuth ID token (optional, for email extraction) |
expires | number | Token expiry timestamp in milliseconds |
Note: The idToken field was added in v1.0.0. Older files without this field are still supported.
The codex add command uses OAuth 2.0 with PKCE for secure browser authentication:
http://127.0.0.1:1455~/.codex-accounts.jsonIn SSH sessions or headless environments (detected via SSH_CLIENT, SSH_TTY, or missing DISPLAY), the auth URL is printed instead of opening a browser:
codex-quota codex add --no-browser
# Prints: Open this URL in your browser: https://auth.openai.com/authorize?...
Copy the URL to a browser on another machine, complete authentication, and the callback will be received by the local server.
Error: Port 1455 is in use. Close other codex-quota instances and retry.
Another process is using port 1455. Check for:
codex-quota codex add commands runningFind and kill the process:
lsof -i :1455
kill <pid>
If browser doesn't open in SSH session:
--no-browser flag: codex-quota codex add --no-browserIf token refresh fails:
Error: Failed to refresh token. Re-authenticate with 'codex-quota codex add'.
The refresh token may have expired. Add the account again:
codex-quota codex remove expired-account
codex-quota codex add new-label
Accounts from CODEX_ACCOUNTS env var cannot be removed via CLI:
Error: Cannot remove account from CODEX_ACCOUNTS env var. Modify the env var directly.
Edit your shell configuration to remove the account from the env var.
All commands support --json for scripting:
# Quota (combined)
codex-quota --json
# {"codex":[{"label":"personal","email":"user@example.com","usage":{...}}],"claude":[...]}
# List (Codex)
codex-quota codex list --json
# {"accounts":[{"label":"personal","isActive":true,"email":"...","source":"..."}]}
# Add (Codex, success)
codex-quota codex add work --json
# {"success":true,"label":"work","email":"user@example.com","accountId":"...","source":"~/.codex-accounts.json"}
# Switch (Codex)
codex-quota codex switch personal --json
# {"success":true,"label":"personal","email":"...","authPath":"~/.codex/auth.json"}
# Errors include structured data
codex-quota codex switch nonexistent --json
# {"success":false,"error":"Account not found","availableLabels":["personal","work"]}
Use the claude namespace to check Claude usage alongside OpenAI quotas:
codex-quota claude quota
If multiple Claude accounts are configured, each account is fetched and displayed separately.
To add a Claude credential interactively:
codex-quota claude add
This uses your local Claude session to call:
https://claude.ai/api/organizationshttps://claude.ai/api/organizations/{orgId}/usagehttps://claude.ai/api/organizations/{orgId}/overage_spend_limithttps://claude.ai/api/accountAuthentication sources (in order):
CLAUDE_ACCOUNTS env var (JSON array or { accounts: [...] })~/.claude-accounts.json (multi-account format)sessionKey and lastActiveOrg~/.claude/.credentials.json OAuth accessTokenMulti-account format (Claude):
{
"accounts": [
{
"label": "personal",
"sessionKey": "sk-ant-oat...",
"cfClearance": "cf_clearance...",
"oauthToken": "claude-ai-access-token",
"orgId": "org_uuid_optional"
}
]
}
Notes:
label plus one of sessionKey or oauthToken is required.cfClearance, orgId, and cookies are optional.Environment overrides:
CLAUDE_ACCOUNTS to supply multi-account JSON directlyCLAUDE_CREDENTIALS_PATH to point to a different credentials fileCLAUDE_COOKIE_DB_PATH to point to a specific Chromium/Chrome Cookies DBNotes:
sqlite3 and secret-tool (libsecret) to decrypt cookies.claude.ai logged in within your Chromium/Chrome profile.bun test and bun run preflight before publishing.bun pm version patch|minor|major.bun run release:pack.bun run release:publish (local publish, no provenance).MIT
FAQs
Multi-account manager for OpenAI Codex CLI and OpenCode with OAuth browser authentication
We found that codex-quota demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.

Research
Malicious versions of the Telnyx Python SDK on PyPI delivered credential-stealing malware via a multi-stage supply chain attack.

Security News
TeamPCP is partnering with ransomware group Vect to turn open source supply chain attacks on tools like Trivy and LiteLLM into large-scale ransomware operations.