← Blog Accounts 27 September 2026 9 min read

The September 14 limit cut, and living across five subscriptions.

On 14 September a temporary boost to Claude Code's weekly limits ended, and heavy users lost about a sixth of their room. Limits are now a fact of daily work. Here is how Luminair reads every account's meter, decides when a limit is real, and keeps your message moving.

Fig 01  What happens when an account runs drySchematic
YOUR MESSAGE “Finish the migration.” THE PROVIDER SAYS “You're out of usage credits” Only the server's words count. IS THIS A LIMIT? Two classifiers SDK LANE · main.js SERVER_USAGE_LIMIT_RE Claude through the Agent SDK CLI LANE · failure-policy.js ACCOUNT_LIMIT_RE Every command-line engine No match: the error is shown as is. AUTO SWITCH · LIST ORDER Primary limit reached · tried Secondary limit reached · tried Third account fresh thread, conversation carried over Stops when every account on the engine has been tried. Never a loop.
A schematic of the path in desktop/main.js and desktop/engines/runner-cli.js. The quoted limit message is real wording the command-line lane was taught on 16 September. Account names are examples.

The short version

  1. A subscription is a fuel tank with a gauge you do not own. On 14 September Anthropic's temporary 50% boost to Claude Code's weekly limits ended and a permanent 25% raise took its place: about 17% less room than heavy users had all summer.
  2. Luminair shows a usage meter for every account you connect, in one shape, whether the numbers come from the provider (Claude, Kimi) or from Luminair's own tally (Meta).
  3. Luminair never decides that you hit a limit. The provider's own words do, read by two classifiers, one per lane.
  4. When a limit is real and Auto Switch is on, the turn moves to the next account on the same engine, and since 16 September it keeps going until every account has been tried.
02Built with Luminair

We hit the wall first.

Luminair is built inside Luminair, on several Claude logins at once, so every change to plan limits lands on us the same week it lands on you. Most of the code in this post exists because a turn stopped when it should not have.

The clearest case came on 16 September. Four Claude accounts were connected on one Mac. The first ran out, the turn failed, and three accounts with room sat unused. The fix from that day is in section 06. The same week, Google's Antigravity engine reported a spent five-hour bucket in words our code read as a passing server hiccup, so it retried a plan that was already empty. Both bugs were found by using the app, and both fixes carry a Claude co-author line in git.

Luminair · several sessions, several engines
Luminair desktop app in the light theme: a folder sidebar and three chat sessions side by side
Several sessions at once, each on its own model and account. Parallel work is also what drains a weekly allowance fastest. (Demo workspace.)
03The cut

A raise that was a cut.

The background, in brief. In May, Anthropic raised Claude Code's weekly limits by 50% for Pro, Max, Team and seat-based Enterprise plans, labelled temporary, then extended it several times. At the end of August the answer came: the boost would end after 13 September, replaced on the 14th by a permanent increase of 25% over the old baseline.

The arithmetic is simple. As MindStudio put it: “Today, with the temporary boost, users get 150 units a week. After September 14, they get 125. That's a 17% reduction from what heavy users have actually been working with for the past four months.” Startup Fortune quotes Anthropic's own announcement: “Starting September 14, we're permanently raising standard weekly limits in Claude Code by 25% for Pro, Max, Team, and seat-based Enterprise plans.”

MindStudio also lists what softens it. The doubled five-hour session limits from May stay. Claude Code can continue a session on its own once a limit resets. Extra usage can be bought at API rates. And Startup Fortune's advice to heavy users is practical: “Move the heaviest work earlier in the week, switch models when you don't need the most expensive one.”

Claude is not the only one. The same Startup Fortune piece points out that OpenAI publishes Codex usage per five-hour window and per week too. A developer who pays for two or three of these plans now manages several tanks, each with its own gauge, reset time and wording for “empty”.

A subscription is a tank with a gauge you do not own. The least you can ask is to see every gauge in one place.
04One meter per account

Every gauge, one shape.

Luminair counts five subscription lanes, from a small billing function in its routing code: Claude (in two lanes, SDK and command line), Codex, Gemini, Antigravity and Kimi. Others, such as Meta or an OpenAI API key, are metered per token, and local models cost nothing.

Each engine that can report usage does it in its own file, and returns the same row shape: a list of buckets, each with a label, a percentage and a reset time. The account menu draws them without knowing whose they are. What differs is where the numbers come from.

Accounts · usage
Claude subscription

from Anthropic's usage endpoint for this login

5h · resets
Week · resets
Wk Opus · resets
Kimi account subscription

GET api.kimi.com/coding/v1/usages, with the CLI's own token

Week · resets
Boosterwallet balance
Meta pay per token

Luminair's own token tally × the price in Meta's catalog

Today$ · estimate
Drawn from the labels and sources in desktop/main.js, desktop/engines/kimi.js and desktop/engines/muse.js. Bar lengths are illustrative and numbers are left blank on purpose. The dashed bar marks an estimate: there is no percentage, only a dollar figure.

Claude: every bucket the server sends

The Claude meter asks Anthropic's usage endpoint about each signed-in login. An early version read only the weekly bucket and labelled it “Week”. It showed 100% while Claude's own panel showed the weekly allowance at 60%. The code comment calls that “one bucket presented as the whole truth”, and the rule since then is to keep every bucket under the server's own key: 5h, Week, Wk Opus, Wk Sonnet and any model-scoped line such as Fable. A bucket Anthropic adds later still shows up instead of vanishing.

Kimi: the call its own CLI makes

Kimi's meter calls GET https://api.kimi.com/coding/v1/usages with the access token the Kimi command-line tool already stored, the same call its built-in usage panel makes, plus /me for the name on the row. It reads the token and never refreshes it; the next Kimi turn does that. The code is honest that it was written from the CLI's source: when it shipped, no Kimi account had been signed in on the build Mac to see a live answer.

Meta: no quota, so an estimate

Meta publishes no quota. Every usage, billing and account path Luminair tried on 15 September answered 404. What Meta does publish is a price per model, in USD per million tokens, in its launcher's catalog. So the Meta meter multiplies Luminair's own per-model token count for today by that price: one dollar row per Meta model, reset at local midnight, marked as an estimate for this computer only.

05Who decides a limit

The server says when.

A meter is a hint. It can be a few minutes old, or wrong. So the most important rule in this part of the code is a comment in main.js, dated 23 July:

desktop/main.jsthe rule
// LUMINAIR NEVER DECIDES A LIMIT. Claude's servers do.
// Luminair always sends the prompt to Anthropic and only
// reports a limit when the SERVER ITSELF says so, in its
// own words.

The reason is written right below it. An earlier version used one loose pattern for “rate limit, 429, quota, exceeded” over any error. It fired on things that were not limits at all: “Maximum number of turns (5) exceeded”, a prompt that was too long, a session id that happened to contain 429. Each false alarm switched accounts, failed again, and after two hops announced that both accounts were spent while the real meter sat at 70% and 60%.

Today there are two classifiers, because Luminair runs engines two ways. Claude through the Agent SDK goes through SERVER_USAGE_LIMIT_RE in main.js. Every command-line engine (the Claude CLI, Codex, Gemini, Antigravity, Kimi and more) goes through ACCOUNT_LIMIT_RE in engines/failure-policy.js. Both list only the phrasing providers use for a spent plan. The trouble with two lists is that one can learn a phrase the other has not.

Fig 02  Which lane calls it a limitReal data · regex run
Error textSDK lane
before 10 Sep
SDK lane
today
CLI lane
before 16 Sep
CLI lane
today
CLI verdict
You've reached your Fable limit✓✓✓✓limit
You're out of usage credits✕✓✕✓limit
Fable 5 requires usage credits✕✕✕✓limit
RESOURCE_EXHAUSTED (code 429): Individual quota reached.✕✕✕✓limit
429 Too Many Requests✕✕✕✕transient
Maximum number of turns (5) exceeded✕✕✕✕fatal
✓ read as an account limit✕ not a limitShaded: rows that changed in September
Each phrase run through the current patterns and through the versions just before commits ed3af8e1 (10 September, SDK lane) and 91ebf349 (16 September, CLI lane). The last column is the command-line lane's full classifier today, which also separates passing load (transient) from other errors.

The shaded rows tell the story. On 10 September, the SDK lane learned “out of usage credits”, because the commit message says Anthropic's credit message “doesn't say limit/reached/exceeded”, so Auto Switch never fired. The command-line lane did not get the same phrase until 16 September, along with “requires usage credits” and Google's “Individual quota reached”. For six days, the same empty account was a limit in one lane and a plain error in the other.

The last two rows matter as much. A bare 429 means the provider is busy right now, not that your plan is spent, so it is retried rather than treated as a reason to switch accounts. And a turn cap is not a usage limit at all.

06The hop

Try every account, then stop.

With two or more accounts connected, the account menu shows an Auto Switch toggle at the top. It is on by default. It does two things.

BEFORE

Steer the next message

If the active account's meter crosses 99% on a shared bucket (five-hour, weekly), the next message goes to an account below that mark. The turn already running keeps its account and finishes. Model-scoped caps such as a Fable line do not count, because another account does not relieve them. A notice in the session says which account now carries your message and why.

AFTER

Rescue the failed turn

If the server says the plan is spent mid-turn, Luminair picks a spare on the same engine, in your list order, skipping any whose meter is visibly spent. An unknown meter counts as room; the real request settles it. The turn restarts on a fresh thread with the conversation carried over, because the old thread lives in the spent account's home and cannot resume from another login.

You see a line like this in the chat: Codex hit a usage limit on “Primary”. Switched to “Secondary” and is resending. If the failure was a model that needs paid credits on that login, the message says so instead, so it does not contradict a meter sitting at 43%.

The 16 September fix is about the word every. The rescue used to be allowed once per turn. If the spare was spent too, the turn stopped with the rest of your accounts untried. Now each hop remembers every account already tried in this turn, and the picker runs until none is left. Only then does the limit message reach you. The list of accounts bounds it, with a hard ceiling of sixteen tries, so it cannot loop.

desktop/engines/runner-cli.jssince 1.0.141
// Now each hop excludes every account already tried this turn;
// the picker runs dry when all are spent, and only then does
// the message surface.
const acctTried = Array.isArray(ctx.__acctTried) ? ctx.__acctTried : [];
if ((failureKind === 'account-limit'
     || failureKind === 'account-blocked')
    && pickSpareAccount && !acctTried.includes(acc.id)
    && acctTried.length < 16 && !stopped) {

When no account has room, Luminair tries to work out when the window reopens, from the server's own timestamp where it gives one, so the session can say when it will retry rather than just “later”.

07Routing by allowance

Spend the roomy pool first.

Switching accounts rescues a turn. Picking the model is the other half. Luminair's decision models (Laya on your Mac, Jev hosted) size up each prompt, and since 27 September automatic routing can take remaining allowance into account. The setting is Consider remaining allowance, on by default, with a description that says what it cannot do: “Old or missing readings stay unknown; percentages are not token counts.”

Under the hood, a model's remaining allowance is 100 minus the fullest bucket that applies to it. A Fable or Opus bucket only counts for that model family. A reading older than three minutes, or one whose reset time has passed, counts as unknown rather than as a guess. Then the ranking adds a penalty as the pool gets tight:

Fig 03  Penalty by remaining allowanceFrom automatic.js · lower score wins
under 10%
+8
10 to 20%
+4
20 to 40%
+1
40% or more
0
unknown
0
Bar length is the penalty added to a candidate's score (8 = full width). These points sit next to others for task fit, reference price, subscription versus metered billing, and the cost of switching providers. An exhausted model is never picked; an unknown one is neither favoured nor punished.

The effect is gentle on purpose. A model with 30% left is barely touched; one with 5% left needs a clear advantage elsewhere to win. Other settings nearby, Prefer subscription models and Allow switching into paid API models (off by default), keep a tight week from quietly turning into an API bill. Every automatic choice comes with a short reason, such as the task kind, the precision level and “62% remaining (Week)”.

08Find it in the app

Three places to look.

  1. 1Open the account menu from your account button. Each connected account shows its meter rows; add a second login on the same engine to see the Auto Switch toggle at the top.
  2. 2Drag accounts into the order you want them tried. Auto Switch walks the list top to bottom.
  3. 3For allowance-aware model choice, open Settings › Models, pick the Decision segment, and check Auto switch working model and Consider remaining allowance. Turn on Show decision summary to see each choice and its reason.
09Honest limits

What this does not fix.

Worth knowing

  • More accounts means more subscriptions. Luminair does not make any plan bigger; it helps you use what you already pay for.
  • Check each provider's terms before running several logins. That is between you and them.
  • A switched turn starts a fresh thread on the new account. The conversation is carried over as text, so a very long thread arrives trimmed.
  • The Kimi meter was written from the CLI's source, and the Meta meter is an estimate from this computer's own count.
  • Classifiers only know wording they have seen. A provider that changes its message can slip past until we add it, as the six days in September show.

Sources

See every gauge at once

Connect your accounts, turn on Auto Switch, and let a spent plan hand off to one with room.

Download Luminair →