Repository navigation
Releases: MattJackson/usagio
Releases · MattJackson/usagio
Release list
v0.10.4
v0.10.3
usagio 0.10.3
Fixed
- A manual switch sticks until the trigger. Switching by hand to an
account under the trigger no longer flips back to another account (e.g.
one with a sooner weekly reset) five minutes later; it stays until it
reaches the trigger, then auto-swaps as usual. A switch to an account
already at/over the trigger still stays until it's exhausted.
v0.10.2
usagio 0.10.2
Added
- Add an account by signing in from usagio. Sign in to a new Claude
account… (above "Capture current login") opens usagio's own sign-in
window on a blank session; sign in as the new account (email code, then
Authorize) and it's added — without switching to it, and without logging
out ofclaudefirst. Its sign-in is remembered, so later renewals are one
click. From a terminal:usagio login(uses your browser). Capturing a
claudelogin still works as before.
v0.10.1
usagio 0.10.1
Fixed
- Paste works in the sign-in window. ⌘V (and ⌘C/⌘X/⌘A/⌘Z) did nothing
in "Renew login…", so the emailed code had to be typed by hand.
Removed
- "Launch client" in the account menu. It never opened anything from the
menu bar.usagio start/usagio continuestill launchclaudefrom a
terminal.
v0.10.0
usagio 0.10.0
Added
- Renew a login from usagio. When an account's login is about to expire,
its row showsrenew · 2dand you get one notification; an expired one
shows⚠ renew. Renew login… opens usagio's own small sign-in window
for that account, which keeps that account's claude.ai session separate
from your browser, so it's usually one Authorize click. The new login
is saved for that account, never changes which account is active, and goes
live immediately if the account is the active one. From a terminal:
usagio renew <email>(opens your browser). Built as one login engine for
every provider; Claude is the first.
Fixed
- No more false "login expires in N days" in Claude. usagio now records
the refresh token's real expiry on every refresh, so the login Claude Code
sees after a switch carries the right date. - No more false "re-login required". Two refreshes of the same account
could race and the loser flagged a healthy account as needing a re-login.
Refreshes are now serialized and the second one reuses the first's result. - A Free account shows "Free", not a re-login warning.
v0.9.0
usagio 0.9.0
Added
-
Account details show what the provider itself reports beyond your
limits, and only when there's something to show:- Credits / extra-usage spend, e.g. "Credits · $12.34 used of $50.00",
"Credits · 120 left" (Codex credits), or "Credits · limit reached". - Where this week's usage went, when it's split across more than one
product, e.g. "This week · Claude Code 82% · Chats 18%". - Per-model weekly limits once they're in use, e.g. "Fable 7d · 42% ·
resets in 2d 3h".
These are the provider's own numbers, never estimates. A provider that
changes or drops these fields never breaks the usage reading itself. - Credits / extra-usage spend, e.g. "Credits · $12.34 used of $50.00",
v0.8.9
usagio 0.8.9
Fixed
- A manual switch under your threshold auto-swaps as usual. In 0.8.8 any
manual switch held, so an account picked at 79% rode past the threshold and
sat at 99% without swapping. Now only a switch to an account already at or
over the threshold holds (you're acking it's over); it still swaps off once
it is exhausted (100%). - A lapsed account's menu is one line. An account with no subscription
now shows justNo subscription · Free planinstead of two extra lines
about paused checks.
Tests
- About 300 new tests close gaps found by a full mutation-testing sweep
(2,871 mutants): the auto-swap decision core, usage refresh policy,
credentials, state backups, history logs, burn-rate forecasts and the menu.
No behaviour changes beyond the fix above.
v0.8.8
usagio 0.8.8
Fixed
- Switching to an account yourself sticks. Picking an account past your
auto-swap threshold from the menu used to get undone within a second, and
usagio switch <acct>got undone at the next poll. A manual switch (menu or
CLI) is now recorded instate.json, and auto-swap stays on that account
until it is exhausted or its subscription lapses, or you pick another. - Auto-swap no longer thrashes around an account near the trigger. An
account within 5 points of the trigger was still a valid swap target, but a
single 429 there counts as reaching the trigger — so auto-swap kept flipping
back to it and getting forced out again (about 30 swaps in 3 hours around an
account at 82–85% of an 85% trigger). Targets must now be more than 5 points
under the trigger; the active account still rides up to it. - No "Where is use_default?" dialog after an upgrade. Right after
brew upgrade, macOS didn't know the new usagio.app yet, so notification setup
failed and fell back to a placeholder app. usagio now registers its own
bundle first. usagio switchnames the matches for an ambiguous prefix.usagio switch devwith severaldev…accounts said "no account matches" instead of
listing them.- Codex accounts auto-swap too. Every switchable provider now runs
through the same swap logic as Claude: swap at the trigger, on a 429 near
it, fresh-reading checks on targets, cooldown only on optional swaps. Each
provider has its own cooldown, no-return window and poll backoff, so one
provider's 429 never slows another's polling. - Codex polling follows the same request budget rules as Claude. The
active account is fetched on its cadence tier, inactive accounts at most
every 10 minutes with their own failure backoff, and a 429 on the active
account pauses that provider's other fetches for the cycle. Previously
every Codex account was fetched on every wake. - No more staying on a full account when everything else is nearly full.
If every other account is past the trigger, auto-swap moves to the one with
the most room left (at least 5 points more than the active one) instead of
staying put. usagio watchbehaves exactly like the menu-bar app. It now runs the
same loop: it uses the trigger and auto-swap setting from the menu
(--triggerstill overrides), wakes right after usage resets, and notices
the machine waking from sleep. It used to ignore the menu settings, miss
most resets, and stay blind for up to 20 minutes after a resume.
v0.8.7
usagio 0.8.7
Fixed
- No more running out after a 429 near the limit. One HTTP 429 from the
usage endpoint on the active account at 93% (trigger 95%) used to stretch the
poll interval from 30s to 6 minutes and wait for a second 429 before
swapping, so the account ran out unobserved. Now a 429 on the active account
within 5 points of the trigger counts as reaching it and swaps immediately,
and a 429 backoff doubles the current interval (30s → 60s) instead of
jumping to twice the base interval. A switch also restarts the backoff from
30s rather than from the base interval. - Leaving an account at its limit is never delayed. The 5-minute swap
cooldown now only applies to optional swaps (flip-backs and all-blocked
preparation). It used to hold you on a just-landed account even after it
hit the trigger. - Swap targets use the full allowance up to your trigger. An account is a
target while its session and weekly are both under your trigger, instead of
a fixed 85% session cap that ignored the trigger you set (it stranded the
last ~10% of every session, and with a trigger under 85% it could pick an
account already past it). - Swap targets must have a current reading. A target last read more than
two minutes ago is re-checked right before the swap and skipped if it's now
at the trigger. If the re-check fails, an urgent swap only uses it when its
last reading had at least 10 points of room. An account usagio moved you off
isn't returned to until a reading taken after leaving it says it has room,
and accounts excluded only for stale data are re-checked when the active
account needs to be left, even while it's being rate-limited. - The active account is polled even if it was flagged for re-login, so its
reading (and auto-swap) no longer freezes after you switch to it manually. - Account details no longer make a healthy limit look locked. A locked window
reads "Session locked · unlocks in 28m" in red (matching the red countdown
on the account row); a healthy one reads "Weekly renews in 6d 22h". Detail
lines are plain text and no longer highlight on hover. - Every provider's header in the menu is now the same plain label row with
its icon. A provider used to turn into a dropdown (and lose its icon)
whenever its active account was blocked or an environment override was set;
the env-override notice now shows inline in the header instead.
Removed
- Dollar cost estimates: the "~$X this cycle (est)" menu row,
usagio report --verdictandusagio report --pricing. No provider reports
what a subscription's usage costs, so these multiplied the usage percentage
by a guessed token cap and API list prices — numbers that looked precise but
weren't.
v0.8.6
usagio 0.8.6
Added
- Accounts whose subscription has lapsed are now detected and shown, for every
provider. A lapsed account's row shows a red "-" instead of a stale reset
countdown, its submenu says "No subscription · Free plan" instead of old
usage and cost, "Switch to this account" and "Launch client" are hidden, it
always sorts to the bottom (alphabetically), and you get a notification when
a plan lapses or comes back.usagio listshows the same. - The account submenu shows the plan when known (Max 20x, Pro, Plus, …).
Fixed
- A lapsed account no longer calls the usage endpoint every cycle. Those calls
only returned 403/429 and spent the request budget the other accounts need.
It now gets a plan check every 30 minutes (or onusagio list --refresh)
and resumes normal polling as soon as a plan is back. - Auto-swap never picks a lapsed account, and moves off the active account if
its plan lapses.