Skip to main content

Aggregate AI subscription/API usage and flag use-it-or-lose-it allotments

Project description

aiuse

PyPI Python Tests License: MIT

Your AI subscriptions reset unused capacity you already paid for. Claude, Codex, Copilot, Cursor, Grok, Gemini, OpenCode, and more each carve your usage into 5-hour / weekly / monthly windows — and whatever you don't burn by the reset is just gone. aiuse polls every plan you have from one terminal command and tells you, in plain language, what to use right now before it resets, and what's about to run out early so you can pace yourself.

CLI command: aiuse (stub ai → same entrypoint)

See it in action

This is real aiuse output (synthetic demo accounts, generated by docs/generate-readme-demo.py — no screenshot). It's the exact priority ladder printed by plain aiuse, read bottom → top: the pools most worth using right now sort to the bottom.

- error Groq · you@example.com · No available fetch strategy for groq.
- empty Opencode · you@example.com · OpenCode Go weekly quota: 0% left · ~lockout Thu 10:42 · pace within 4.5 days
  n/a   Deepseek · you@example.com · balance $4.15 (no expiry)
  n/a   Openrouter · you@example.com · balance $18.55 (no expiry)
  slow  Google AI / Antigravity · you@example.com · Claude/GPT weekly: 22% left · ~lockout Fri 12:42 · pace within 1.2 days
  mid   Claude Code · you@example.com · Claude Code weekly: 23% left · ok within 3.1 days
  mid   Cursor · you@example.com · Cursor included: 29% left · ok within 3.3 days
  mid   Codex · you@example.com · Codex weekly quota: 46% left · ok within 2.3 days
  mid   Grok · you@example.com · Grok usage limit: 94% left · ok within 6.6 days
  mid   Gemini · you@example.com · Gemini weekly: 84% left · ok within 4.0 days
+ use   GitHub Copilot · default · GitHub Copilot premium requests: 42% left · ~42%waste · use within ~1 day

Green (use) is capacity to burn now before it resets; red is capacity already lost (empty) or a source that failed to fetch (error); everything else is informational (n/a prepaid balances that never expire, slow windows you should pace yourself on, mid windows on track — nothing to do).

Try it in 60 seconds

pipx install aiuse
aiuse doctor   # see which data-source tools are already on your PATH
aiuse          # priority ladder for everything aiuse can see right now

No config file is required to start — aiuse doctor tells you exactly which of the optional data-source tools (below) it found, and aiuse works with however many you already have installed. See Install below for Homebrew, git-tip, and editable-dev options.

AI agents: start at AGENTS.md for a map of this repo, active priorities, Claude/cswap reliability notes (docs/cswap-reliability.md), and review-derived fixes in docs/fix-implementation-plan.md.

Data sources

Tool Purpose Authority
cswap cswap list --json Live Claude Code quota for every configured email/account Canonical multi-account Claude source; prefers cswap 0.24 display-grade JSON, with local-cache recovery for older versions
CodexBar codexbar usage --format json Live quotas and balances for enabled providers Preferred for non-Claude providers; keep its Claude source disabled on macOS until its Keychain prompting is fixed
caut caut usage --json Independent multi-provider usage (CodexBar-class probes) Cross-check peer, but leave disabled on macOS until its repeated Keychain prompting is fixed
OpenUsage.ai openusage / 127.0.0.1:6736/v1/limits Quiet macOS menu-bar companion + live limits API Cross-check peer; distinct collector key: openusage_ai
OpenUsage.sh openusage-sh export --output - --format json Terminal dashboard, local telemetry, and quota export Lowest-priority backup; distinct collector key: openusage_sh; only explicit quota metrics affect ranking
tokscale tokscale usage --json Independent live subscription quota measurement Cross-checked against peers; preferred for Copilot; fill-in when others lack a live row

This project shells out to tools already on your PATH (and optionally hits OpenUsage’s loopback API); it does not scrape billing dashboards itself. For Claude multi-account reliability (official display-grade JSON vs legacy cache), see docs/cswap-reliability.md. caut + OpenUsage setup: docs/collectors-caut-openusage.md.

macOS source policy (current)

Use cswap as the Claude source and CodexBar for every other provider. Keep CodexBar's Claude source disabled, even as a fallback. tokscale, OpenUsage.ai, OpenUsage.sh, and other available collectors are useful independent backup and cross-check sources. All collectors are enabled by default, whether installed now or prepared for later; disable any source in config.toml when it is not appropriate for your machine. On macOS, consider disabling caut and CodexBar's Claude integration if their Keychain-prompting bugs affect you.

Install

End users (pipx):

pipx install aiuse
# or from git tip:
# pipx install 'git+https://github.com/djbclark/aiuse.git'
aiuse doctor

(ai is installed as a stub that runs the same CLI.)

Homebrew (personal tap):

brew tap djbclark/aiuse
brew trust djbclark/aiuse
brew install aiuse

Developers (editable):

cd /path/to/aiuse
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"

More channels and release / OIDC publish docs: docs/packaging.md.

Ambient companions (menu bar) + one-line status: docs/companion-stack.md
Scheduled runs (macOS LaunchAgent, hourly): docs/scheduling.md (./packaging/launchd/install.sh). Snapshot history: docs/history-learning.md.

Optional config (standard location: ~/.config/aiuse/, or $XDG_CONFIG_HOME/aiuse/):

# Create the canonical config.toml (never overwrites)
aiuse --generate-config

# Or copy the example by hand:
mkdir -p "${XDG_CONFIG_HOME:-$HOME/.config}/aiuse"
cp config/config.example.toml "${XDG_CONFIG_HOME:-$HOME/.config}/aiuse/config.toml"
File Purpose
~/.config/aiuse/config.toml All user settings: collectors, plans, analysis, timeouts, and macOS options

Run aiuse --show-config-path to print the canonical path and retired YAML path. aiuse --generate-config creates missing parent dirs and writes the TOML starter without overwriting it. Legacy services.yaml is read only when config.toml is absent. If both exist, aiuse exits with a migration error: move the YAML settings into TOML, then remove services.yaml. Provider credentials stay with cswap, CodexBar, caut, OpenUsage, and tokscale — these files do not hold tokens or emails.

aiuse normally unifies source-local account names automatically when each identifying source reports exactly one account for a provider. For a genuinely multi-account provider, map a local name explicitly instead of letting aiuse guess:

[account_aliases.codex.openusage_sh]
"codex-cli" = "me@example.com"

aiuse --full prints this exact table when a multi-account source cannot be matched safely. Explicit mappings take precedence over automatic normalization.

Daily workflow

# Once: create defaults under ~/.config/aiuse/ (never overwrites)
aiuse --generate-config
aiuse doctor                 # PATH tools + config presence + timeouts
# Once per machine: install the data-source tools you intend to use
# (normally cswap, CodexBar, tokscale, and either or both distinct OpenUsage tools)
./packaging/install-deps.sh
# or: just -f ~/ops/site-djbclark/justfile install-aiuse-deps
# macOS: Keychain trust helpers (see docs/macos-keychain-trust.md)
aiuse trust setup            # caut: stable codesign + guide
aiuse trust sign-caut        # re-run after every cargo install
aiuse trust fix-codexbar-cache --dry-run   # CodexBar#679: trust CLI on cache items

# Morning / before a long coding block
aiuse                        # priority ladder on stdout (use-soon at bottom); meta on stderr
aiuse --full                 # long report: per-provider, tips, History, detailed plan
aiuse --brief                # same as default (compat alias)
aiuse --no-tui               # classic plain-text report (also used when piping)
aiuse -q                     # ladder only (no stderr meta / Collecting…)
aiuse suggest                # single best burn pool (or “nothing urgent”)
aiuse status                 # one line for shell prompts / status bars
aiuse prompt                 # synonym of status

# Scripting / cron / agents (JSON on stdout; use exit codes)
aiuse -q --json
aiuse suggest --json         # includes top-level suggestion
# exit 0 = ok, no burn/conserve alerts
# exit 1 = hard failure (collectors failed, no accounts)
# exit 2 = success with at least one burn/conserve alert
# field contract: docs/json-contract.md
# loopback HTTP for multi-step agents: aiuse serve  (docs/agent-api.md)

# Shell completion (bash or zsh)
eval "$(aiuse --print-completion bash)"
# or: source completions/ai.bash

# Tighter thresholds for “only what resets soon”
aiuse --min-remaining 50 --max-days 7

Usage

# Pretty human-readable report (default)
aiuse
aiuse --format pretty
aiuse --no-color          # plain text, no ANSI
aiuse -q / --quiet        # suppress progress on stderr

# or without install:
PYTHONPATH=src python -m ai

# Machine-readable JSON on stdout (progress on stderr unless -q)
aiuse --json
aiuse --format json
aiuse --json --alerts-only
aiuse suggest --json
aiuse --save ~/tmp/ai-snapshot.json   # also write JSON file

# Decision helpers
aiuse suggest              # single best burn pool
aiuse status               # one line for prompts / status bars
aiuse prompt               # synonym of status
aiuse serve                # loopback HTTP for agents (docs/agent-api.md)

# Faster / partial
aiuse --providers copilot,grok,codex   # query these separately
aiuse --no-tokscale
aiuse --min-remaining 50 --max-days 10

# Subprocess timeout for external tools (default 45s; also in config.toml)
aiuse --timeout 45
aiuse -t45

# Environment check (tools on PATH, config files, timeouts) — no usage collection
aiuse doctor
aiuse --doctor
Flag Effect
(none) / --format pretty Priority ladder on stdout (empty→n/a→slow→mid→use); meta on stderr; plain when piped
--full Long pretty report: per-provider, cross-checks, tips, History, detailed plan
--json / --format json Full snapshot + alerts + suggestion + history as JSON
--brief Alias of default priority-ladder pretty report
--no-tui Force classic plain-text pretty report
--no-color Disable ANSI colors in plain-text pretty mode
-q / --quiet Suppress progress messages on stderr
--alerts-only Recommendations only (respects pretty vs json)
suggest / --suggest Single best burn pool (or nothing urgent); pair with --json for structured
status / prompt / --status One-line status for shell prompts / status bars
serve / --serve Loopback HTTP API for agents (127.0.0.1; see docs/agent-api.md)
--port / --max-age Serve bind port (default 8787) and snapshot cache max age
--traditional-summary Legacy flat summary format instead of unified action plan
--print-completion bash|zsh Print shell completion script to stdout
--no-tokscale / --no-cswap / --no-codexbar / --no-caut / --no-openusage-ai / --no-openusage-sh Skip specific collectors (--no-openusage remains an alias for .ai)
--providers copilot,grok Query specific CodexBar providers (CSV, one per subprocess)
-t / --timeout SECONDS Force subprocess timeout for all external tools (default 45)
--generate-config Write default ~/.config/aiuse/config.toml; never overwrites existing
--show-config-path Print canonical config.toml and retired services.yaml paths
doctor / --doctor Check tools on PATH, config presence, effective timeouts; no collect
trust macOS: codesign status / sign caut / Keychain grant guide (docs/macos-keychain-trust.md)
--min-remaining 50 --max-days 10 Override alert thresholds
--save PATH Also write full JSON snapshot to PATH

Exit codes

Code When
0 Collect succeeded (or nothing to report) and there are no burn/conserve alerts. INFO-only notes still count as 0.
1 Hard failure: collectors reported errors and no accounts were collected. Also used by aiuse doctor when an enabled tool is missing from PATH, and by --generate-config when nothing was written / overwrite refused.
2 Collect succeeded and at least one burn or conserve alert is present. Cross-check disagreements alone do not set 2. Bad --timeout values also use 2.

aiuse doctor checks config file presence, config validation (unknown keys, bad timeouts, dead plan aliases), all six data-source tools on PATH (and OpenUsage.ai loopback HTTP when the CLI is missing), and a light version probe (cswap --version, codexbar -V, caut --version, tokscale --version). It does not call usage APIs or verify login sessions.

What “use it or lose it” means

Most subscription coding plans (Claude Pro/Max, ChatGPT Plus/Codex, Cursor, Copilot, SuperGrok, Google AI Pro, …) grant windows of usage (5-hour, weekly, monthly). When the window resets, unused capacity disappears — you still paid for the month.

This tool:

  1. Pulls remaining % and reset times from cswap (Claude multi-account), CodexBar (broad live quotas), caut, OpenUsage.ai, OpenUsage.sh (cross-check peers / fill-in), and tokscale (independent measurement; preferred for Copilot).
  2. Scores windows with pace-based logic (default): compare how far through the cycle you are vs how much you've used, then project waste or early lockout.
  3. Classifies each window as Burn (will leave capacity unused), Conserve (on track to exhaust before reset — slow down), or On pace (no alert).
  4. For shared-allotment providers (Claude, Gemini by default), scores the longest governing window only so a fresh 5-hour bar does not outrank the weekly budget it draws from.
  5. Default pretty output is a priority ladder on stdout (depleted → prepaid n/a → conserve → mid → use-soon at bottom; read bottom→top). Meta goes to stderr. Use aiuse --full for per-provider detail.
  6. On --full, keeps the trailing plan within ~23 lines × console width when possible; if the detailed plan is taller, both detailed and at a glance are printed (glance last). Forecast fragments (~lockout …, projected waste %) appear on ladder/status lines when pace can project them.
  7. Cross-checks all live sources pairwise; Claude multi-account stays canonical in cswap (preferring 0.24 display-grade JSON, with legacy cache hydrate + fallbacks).
  8. Optional surfaces: aiuse suggest (single burn winner), aiuse status / prompt (one-liner), aiuse serve (loopback ranking API for agents). Snapshot history can blend into pace when enabled (docs/history-learning.md).

This command intentionally does not report historical local-token usage or API-equivalent cost estimates (use ccusage-class tools for local burn, not plan %).

Example output

================================================================================
AI USAGE — USE IT OR LOSE IT
Collected at … · 3 accounts · 2 alerts
================================================================================

## Per-provider usage
--------------------------------------------------------------------------------
Codex · account=you@example.com · plan=plus · selected live source: CodexBar
  quota: Codex weekly quota
    [============] 100% left   0% used   resets in 6.4d (Jul 28 21:59 UTC)
    $6.90 · flex:▒ semi

## Cross-checks (informational)
--------------------------------------------------------------------------------
  Tools poll at different times; multi-account Claude is cswap-only. …

## Tips
--------------------------------------------------------------------------------
  • …

## Action plan — use these before they reset
--------------------------------------------------------------------------------
  Available capacity this cycle: $35.65 across 6 windows (5 providers).

  THIS WEEK (start now — capacity will reset or needs lead time)
  ─────────────────────────────────────────────────────────────
  .   Codex · you@example.com · Codex weekly quota: 88% left · use within 6.4 days · $6.07 at risk
      Semi-throttled — steady usage will exhaust it.
  .   OpenCode Go · default · OpenCode Go weekly quota: 98% left · use within 4.5 days · $3.37 at risk
      Burstable — one heavy session will cover it.

Project layout

src/aiuse/
  cli.py                 # entrypoint
  collectors/            # cswap, codexbar, caut, openusage, tokscale
  analysis/use_or_lose.py
  report.py
config/config.example.toml
tests/

Tests

just test
just check # tests plus deterministic lint, type, spelling, and format checks
just lint  # full check plus Bandit, Semgrep, and Gitleaks
just format

The quality suite mirrors the applicable tools from stayturgid: pytest, Ruff, mypy, yamllint, markdownlint, Prettier (including TOML support), typos, Bandit, Semgrep, Gitleaks, pre-commit, and just. Ansible, shell, JavaScript/CSS, dotenv, Caddy, and browser-page checks are omitted because this repository contains none of those corresponding inputs.

Scoring modes (analysis.scoring_mode)

Mode Meaning
pace (default) Burn / conserve / on-pace from projected waste and lockout
multi_dim Previous value + flexibility + deadline blend (escape hatch)
legacy Original deadline-heavy scorer (use_multi_dim_scoring: false still maps here)

Pace knobs (also in config.toml under [analysis.pace]):

  • waste_alert_fraction (default 0.30) — project this much unused → Burn
  • min_elapsed_fraction (default 0.15) — too early in the window → On pace unless history says otherwise
  • conserve_min_lead_hours (default 4) — exhaust this far before reset → Conserve

Shared allotment: analysis.provider_overrides.<provider>.shared_allotment: true (Claude/Gemini default) scores only the longest window per account.

Notes / limitations

  • Live quota accuracy depends on each tool's auth (browser cookies, OAuth, keychain). Errors are reported per account rather than aborting the whole run.
  • All enabled collectors (cswap, CodexBar, caut, OpenUsage.ai, OpenUsage.sh, tokscale) run concurrently; each CodexBar provider is its own subprocess. Default tool timeout is 45s (-t / config.toml [timeouts]).
  • Per-window detail still shows $ value, flexibility class, and a pace ratio when computable.
  • Duplicate live measurements are retained for cross-checking but only one copy drives recommendations.
  • Dollar values use plan monthly_price with waking-hours correction (default 16h/day).

Related reading

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aiuse-2.1.28.tar.gz (160.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

aiuse-2.1.28-py3-none-any.whl (118.7 kB view details)

Uploaded Python 3

File details

Details for the file aiuse-2.1.28.tar.gz.

File metadata

  • Download URL: aiuse-2.1.28.tar.gz
  • Upload date:
  • Size: 160.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for aiuse-2.1.28.tar.gz
Algorithm Hash digest
SHA256 322d8ad50fbb6545035e235bd3dfa5b0fb748ec4740946563698eaee20451525
MD5 58e058434a52dc68e166c1f4cd2052c4
BLAKE2b-256 c96390743cca2b287963735048a8f76d71a8c0dbf23978adf62b8584b2f2f7f1

See more details on using hashes here.

Provenance

The following attestation bundles were made for aiuse-2.1.28.tar.gz:

Publisher: publish.yml on djbclark/aiuse

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aiuse-2.1.28-py3-none-any.whl.

File metadata

  • Download URL: aiuse-2.1.28-py3-none-any.whl
  • Upload date:
  • Size: 118.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for aiuse-2.1.28-py3-none-any.whl
Algorithm Hash digest
SHA256 9df7dac3af241bc2b3473e6ccc31abbe0deaf9447bcf48c478fdc45496739db8
MD5 d6ce6584d8a48b991b44ff3388c58a49
BLAKE2b-256 402f14eb86d98b674b9060d85fef31ec9be63ce37a621f60e04ba215f8cc880e

See more details on using hashes here.

Provenance

The following attestation bundles were made for aiuse-2.1.28-py3-none-any.whl:

Publisher: publish.yml on djbclark/aiuse

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page