Repository navigation
Interface And Keys
clauth opens on the Overview tab. ← → or tab / ⇧tab move between tabs at the top level, and ⌥1–⌥9 jump straight to a tab. While a detail pane has focus the arrows are trapped: ← returns to its selector and → does nothing there. tab / ⇧tab still switch tabs from a descended read-only detail (Usage, Tokens model, Services delegates, or Status) and do nothing in a descended editable pane. ? lists every binding for the tab you are on; q twice quits from the top level.
| Tab | Holds | You can |
|---|---|---|
| Overview | account table, live 5h / long-window bars (7d, or Alibaba's monthly quota), chain position, selectable codex and pool accounts | switch or reorder Claude Code accounts, browse codex and pool accounts, refresh or remove a pool account, pick which harness shows |
| Usage | per-account window breakdown: 5h, 7d, per-model weeks, extra-usage spend, peak-rate state | refresh one account, toggle estimates and the pace marker, edit the account's note |
| Tokens | global Claude Code token stats and API-equivalent cost | drill into models, move between dashboard cards, change the period lens, count cache tokens |
| Setup | the Overview's account list (Claude Code, codex and pool rows), then each Claude Code account's endpoint, key, env, model routing, auto-start, 5h alert | edit any of it, log in, log out, disable or delete a Claude Code account, create a claude, codex or pool account, re-login or delete a codex account, refresh or remove a pool account |
| Fallback | the auto-switch chain | reorder members, edit thresholds, flip gates, set a spend ceiling |
| Config | program-wide settings | change any of the rows in the table below |
| Status | incidents from status.claude.com with per-component health | open an incident's timeline or its page in a browser |
| Services | the shunt gateway, running delegates, the Claude Code plugin and herdr | apply fixes |
The active account is orange. A ▲ on an account's row means the provider behind it is on peak-rate hours right now — some providers charge more at set times of day (DeepSeek roughly doubles its API rate; Z.ai's GLM peak hours consume the coding plan's quota faster). The active account's ● outranks ▲ on its own row, so an active account on peak hours keeps its dot and ▲ shows on the other accounts. A red ! marks an account whose 5h alert fired, until its usage falls back below the line, and it outranks ●. The Usage tab's pricing row names the state, the countdown to the next switch, and nothing renders for flat-rate accounts. The marker follows the provider's own published rate schedule, never which models the profile pins; an account on an endpoint clauth doesn't recognize shows none. A codex account's banked usage-limit resets show as ↺ N on its Overview row while one is available — clauth limit-reset spends one (Codex). Usage numbers are cached on disk, so they stay on screen when the API is rate-limited or unreachable. Once those figures age past the refresh cadence's stale threshold, the Usage tab's status block adds a [ stale ] pill; it reads the age of the reading — an OAuth account's own fetch stamp, one it cannot date reading stale at once, or a third-party account's cache write time — not the last fetch outcome, so a [ cached ] pill and it can appear together. An amber ⋯ in place of the refresh countdown marks a cached reading clauth no longer polls. On the fallback chain panel below the accounts, ↲ ~40m beside a member names the account the chain switches to next, and roughly when. When the panel is too short to show every member, its last line reads +N more · → fallback tab: N members are off-screen, and the Fallback tab, four tabs to the right (→ or tab), lists them all.
An account's t/s column sits after live: its live speed, blank where the producer carries none, dropped whole first on a narrow terminal, before the 7d reset stamp sheds a cell, and given up to the wall-clock reset stamps when reset_display is clock or both and both do not fit. The Usage detail lists speed and rate rows under its header, each reading live · 5m · 1h · today (speed = output ÷ generation time, rate = output ÷ window length): a rate reads 0 under a fresh producer when the account spent nothing, a speed reads — when no response touches its window, and every figure reads — while no fresh producer stands behind the cache. The Tokens tab's today card carries a speed row (S t/s now · S t/s today), the TOTAL card an avg speed S t/s row once a day of speed history exists, and the trend chart a speed strip under its bars with · avg S t/s on its caption — the strip drops before the month ticks on a short card. The Services delegates detail lists S t/s among a job's facts: a running job's live speed off its own session, a finished job's own average.
Codex accounts (Codex) sit under the Claude Code rows in a section headed codex, in the same columns: name (bold, in the blue accent, when it is the active codex profile), plan, 5h and 7d, with — where nothing is cached, and a dim ↺ N after the columns while the account holds a banked usage-limit reset (Codex). The rows are selectable: ↑ and ↓ reach every codex account, including the last one in a short viewport; ⏎ does not switch a codex account, and a opens tab-wide actions without an account group. There is no live, t/s or timer cell. A codex row shows the same × marker when its chain is quarantined, and its plan cell falls back to the plan the account's login claims while no poll has cached one. The accounts panel title carries the active filter — plain ACCOUNTS unfiltered, ACCOUNTS ─ claude / ACCOUNTS ─ codex / ACCOUNTS ─ shunt filtered, the harness name in dim text (the border rule supplies the dashes) — and its right edge shows the by-harness counts (52 claude · 1 codex · 4 shunt, an empty roster's harness omitted), the first thing to go on a narrow terminal. The header's line 2 opens with [ N live ] [ R tok/s ], then holds the gauge with its speed suffix and the status dot: N live is every live session clauth can see, whatever account it runs on (dim at [ 0 live ], [ — live ] when clauth cannot read where it tracks them); R tok/s is the fleet's live token-consumption rate off the speed cache, dim at 0 and at —, the latter while no fresh producer stands behind the cache; the gauge carries the active account's live speed as (S t/s) (dim, absent when the gauge is or when the account has no fresh live speed). A narrow terminal drops the tok/s chip first, then the live chip, then the speed suffix, then the gauge's own ladder, then the status dot.
Shunt pool accounts sit after the codex rows, one shunt (<provider>) heading per provider with a row per account under it. A row shows the account name; the plan in the type column (— where the gateway reports none); the 5h and 7d bracketed bars with their reset countdowns, — where the gateway reports none; and blank live and t/s columns. Status rides cues: a red × before the name when the account needs a re-login (a spinner takes its place while a pool action runs on the row), a dimmed row while it is paused or disabled, a cooldown's remaining time in the timer slot in amber, and the bars' threshold colors as it nears its quota. The codex heading and each shunt (<provider>) heading are dim and bold, and brighten while the cursor rests on a row under one. A listing clauth cannot read shows one shunt — not read: <reason> heading and no rows; with no gateway adopted, a config without clauth's admin entry, or a missing admin token file, the section does not appear: the Services card offers f add admin table or f add admin key for a missing table or entry, and while the gateway runs it reads pool no gateway admin token for a missing file.
| Key | Action |
|---|---|
| ← → (or tab / ⇧tab) | previous / next tab at the top level; in a descended detail ← returns to the selector and → does nothing, while tab / ⇧tab still switch tabs from a read-only detail and do nothing in an editable one |
| ⌥1–⌥9 | jump straight to a tab (⌥9 is always the last); live inside an editor and a descended pane |
| ↑ ↓ | move the selection through long lists without snapping it to an edge, or scroll a detail pane |
| PageUp PageDown | move a page in a scrollable list, detail, form or dialog |
| ⏎ | act on the selected row (see below) |
| n | new account (on the Overview, the form's type is preset from the row under the cursor; a suspended form comes back as you left it) · on the usage tab: edit the account's note |
| d | open the divergence resolver, when one is pending |
| x | dismiss the oldest toast, then the footer alert; over an open dialog it dismisses the oldest toast only; while a field is open for editing, x stays with it |
| a | action menu for the current row |
| ? | keybinding help for this tab |
| esc | step back out of a sub-pane; in an open text field, put back the saved value (the footer reads esc revert), or on the new-account form keep what you typed (esc done) |
| q | step back, or arm quit at the top level; press again to confirm |
| ctrl+c | quit from anywhere |
A descended Usage or Tokens model detail scrolls one line with ↑ / ↓; esc or ← returns to its selector without changing the selected account or model. PageUp / PageDown move one page, the visible height less one line: a list or form moves its selection about a page and stops at the first or last row, and no line is passed over unseen. An open text field whose value runs past its row scrolls sideways with the caret, keeping the character you are on whole in view, and the usage tab's note editor does the same with a line wider than it. Choice dialogs and action menus follow the selected option so it remains visible; an overflowing choice shows a scrollbar. A custom-field overwrite whose consequence cannot fit in the choice dialog opens a confirmation with its full explanation scrollable (↑ / ↓ and the page keys, while ← / → pick the button) and cancel selected by default; a fitting choice acts at once. Toasts stack in the top-right corner, at most three lines each: a longer message ends its third line in …, and a failure leads with what went wrong and why.
A screen switch away from an open field on an existing account in Setup or a Fallback rotate at / weekly at / max spend field whose typed value differs from the saved one opens a WARNING dialog instead: go back is the default and keeps the edit, discard drops the edit and performs the switch.
On the Tokens dashboard, ↑ / ↓ move focus card to card in reading order (wrapping), PageUp / PageDown move about a page and stop at the ends, and the grid scrolls by whole cards when it is taller than the screen: a card that does not fit whole moves below the fold, with a scrollbar at the grid's right edge, instead of clipping its border.
| Key | Behavior |
|---|---|
| r | Usage: refresh the selected account only. Tokens / Status / Services: reload that tab's data. Everywhere else: refresh every Claude Code account |
| t | Tokens: cycle the period lens. Everywhere else: force-rotate every Claude Code account's token, after a confirm |
| ⏎ | Overview: switch to the selected Claude Code account; inert on a codex or pool row. Usage: descend into the selected account's detail to scroll its full breakdown. Tokens: open the model breakdown, then descend into the selected model's detail; a view with no model has no detail to open. Setup / Fallback: open a detail row, or commit an edit; on Setup's type and family cycle rows ⏎ mirrors space; on a Fallback card's preferred days row, open the day picker. Status / Services: open the detail (the delegates detail only while it lists a job); in a Services detail, open the confirm of a focused f line (on the shunt card also: flip a focused enabled row, open a focused check output) |
| ⇧↑ ⇧↓ | Overview: reorder Claude Code accounts; inert on a codex or pool row. Fallback (chain focus): reorder chain members |
| space | Config: cycle a value. Setup model row and the + new form's type / family rows cycle; Fallback toggle rows flip. Fallback preferred days: step never → weekdays → weekends → every day and back to never, saving each step; a custom set is one more stop after every day until you leave the card. Services shunt card: flip a focused enabled row, open a focused check output
|
| + - | Fallback detail: step rotate at or weekly at by 5; Setup: step alert at by 5 |
| e | Usage: toggle burn estimates |
| p | Usage: toggle the ideal-pace marker |
| c | Overview: cycle the harness filter (all → claude → codex → shunt → all; the accounts panel title names the active one) and return to the row last chosen with the cursor keys, or the first row when the view no longer shows it. Tokens: count cache reads and writes in the token totals |
| f | Services: move to the selected row's next f line, descending from the list onto its first and wrapping after its last; it never applies a fix, ⏎ on the focused line does |
The day picker on a Fallback card's preferred days row shows each weekday as [x] or [ ]: ← → walk the days (and do not switch tabs while it is open), space toggles the day and saves at once, ⏎, esc or q leave it, and ↑ ↓ leave it and move to the row above or below. ? and x keep working while it is open; every other key does nothing until you leave, except ⌥1–⌥9, which still jump to a tab and suspend the picker.
On macOS, t skips any account holding a live clauth start session or an unfinished background job holding the rotating login: that session's login lives in a Keychain item clauth cannot write, so rotating it would sign the session out.
The footer labels c harness on the Overview; the ? help for that tab does not list it. With the Overview showing codex rows alone, ↑ and ↓ select codex accounts and the scrollbar follows; ⇧↑, ⇧↓ and ⏎ do not change a Claude Code account, and a opens tab-wide entries alone. r and t keep working on the Claude Code accounts; n opens a fresh new-account form with type codex. Neither refresh nor rotation reaches a codex row (codex usage polls on the refresh interval alone, and a codex chain rotates only in the background). On every other tab c keeps its own meaning or none.
a opens the actions available for whatever is selected. It lists what no key already does, so on Config, Fallback and Services, where every action already has a key, it holds only the daemon and shunt entries every tab ends on. The footer only advertises a where something would open.
Entries above the rule act on the account named in the menu's title bar; entries below it act on the tab, and the daemon and shunt entries, when shown, come last.
| Tab | Account | Tab-wide |
|---|---|---|
| Overview |
refresh usage, rotate access token, disable account / enable account, open provider console
|
refresh all accounts, new account
|
| Usage |
refresh usage, rotate access token, disable account / enable account, open provider console
|
refresh all accounts, toggle estimates, toggle pace marker
|
| Tokens | none |
period: lifetime / daily / weekly / monthly, show all models / show claude models / show other models, toggle cache counting, reload stats
|
| Setup |
duplicate account, save as preset, apply preset, open provider console (none on a codex or pool row) |
none |
| Status | none |
refresh status, open in browser
|
| every tab | none |
start daemon / stop daemon, then start shunt / stop shunt, last |
On a shunt pool row the menu holds refresh (claude and antigravity accounts; shunt has no codex refresh) and remove (behind a remove <name>? confirm); a kimi row, or one whose sign-in kind clauth does not know, carries no action. One pool action runs at a time, and picking a second while one runs says to wait.
The usage tab claims n for the selected account's note: a free-form text block shown in full on the tab under notes: (press n to add notes while the account has none). ⏎ saves, esc cancels, ⌃j starts a new line. The note is stored as profiles/<name>/note.txt (see Configuration), so it follows the account on rename and goes with it on delete; everywhere else n still starts a new account.
start daemon shows while no daemon runs and, once you confirm, starts clauth daemon in the background, detached from the TUI: it keeps running after you quit the TUI or close its terminal, and writes its log to ~/.clauth/daemon.log. If a daemon came up elsewhere while the confirm was open, it starts nothing and says daemon already running. It starts the plain daemon, so it serves no REST API; for the clauth app, run clauth daemon --listen yourself (Daemon). stop daemon shows while one runs and stops it the way clauth daemon --replace does, taking the shunt gateway and every enabled proxy down with it (a daemon that takes over at once, such as a standby, runs its own). Neither shows while one of them is still working; a toast reports how it went.
stop shunt shows while the daemon runs the shunt gateway and its status is fresh. It asks first, naming how many live sessions run on an account whose base URL points at the gateway when any do and clauth can count them, then holds the gateway off until the daemon next restarts; it never changes the card's enabled setting. start shunt shows in four cases: with no gateway adopted it opens the Services tab on the shunt card, on its f adopt config line when the card offers one; with the gateway disabled it lands on the card's enabled row; with no daemon running it asks to start the daemon (hidden while a daemon start or stop is still working); and on a held gateway it lifts the hold. In any other state, and while a shunt action is still working, neither shows. A pick whose entry no longer applies, because the gateway changed since the menu opened, says so and does nothing.
The active period or model filter is omitted from the Tokens menu, so the entries you see are the ones that would change something. open provider console follows the same idea from the other direction: it appears only on an account whose endpoint clauth knows a key page for, so an OAuth account's menu is one entry shorter.
The Setup detail pane is itself a list of actions, so ⏎ on a row is the action. What the menu adds is what works on the account as a whole, from either the account list or a settings row, and none of it on a codex or pool row (its detail rows carry the actions). On the + new form there is no account to duplicate or save, so its account entry is apply preset alone, offered only while type is claude, stamping the draft's endpoint and model fields.
| Entry | Does |
|---|---|
duplicate account |
asks for a name, then copies every setting onto a new account: endpoint, api key, env, models, thresholds. The stored login stays behind, as do the chain's preferred and last resort marks, which only one account may hold |
save as preset |
stores this account's base url and models under a name you type (Configuration). An existing preset asks first; a built-in's name is refused |
apply preset |
opens the picker, built-ins first. Applying writes what the preset sets and keeps the rest, asking first before it replaces a value; when the account holds a value the preset leaves unset, the confirm offers keep them or clear them (Configuration). d deletes a saved preset |
open provider console |
opens the page this account's api key is minted on, in your browser. Only for DeepSeek, Z.ai, OpenRouter, MiniMax and Alibaba Model Studio endpoints, so it is absent on an OAuth account and on any endpoint clauth does not recognise. An Alibaba account gets its own plan's page: Token Plan and Coding Plan are separate products, on separate pages, per console; a Qwen Cloud account gets Qwen Cloud's API Keys page, one page for Individual and Team Token Plan keys |
There is no remove field because none is needed: an env row's ⏎ edits its value, and an empty value removes the key. Editing it back is the same row.
disable account from Overview or Usage asks first, since disabling drops the account from auto-switch, usage polling and status mid-flight; re-enabling is immediate. Neither runs for the active account or for one holding a live clauth start session — a Claude Code background job naming one of the profile's runtime trees (launched with clauth start <p> -- --bg) counts as a live session, a stopped one too, until claude rm <id>; the pick names whichever is in the way.
The list is the Overview's own: Claude Code rows, then a codex band, then one shunt (<provider>) band per pool provider with a row per account, and + new last; the Overview's c harness filter is ignored here. Selecting a Claude Code row opens its settings (rows below); selecting a codex or pool row opens that account's own detail pane. + new turns the pane into the create form, which opens on a type row cycling claude / codex / shunt; n presets the type from the row under the Overview cursor (a pool row → shunt, a codex row → codex, a claude row → claude; with nothing under the cursor the harness filter decides), and from any other tab it opens a claude form; a suspended form comes back exactly as you left it, so the preset applies to a fresh form only. Cycling type keeps the name you typed and asks first before it drops a staged login.
The claude form offers name, base url, api key (only once a url is typed), model, + model override, + login (only while the base url is empty, minting the OAuth login) and create account; after + login (or in its place on an api form), + capture current login stashes the login Claude Code is using now (it appears only while that login exists and no saved account owns it). create account saves every field, and a captured login from a different endpoint than the form's takes none of the form's model rows. The codex form offers name, + login (codex's own browser login, staged until create account), + capture current login (only while your own codex CLI login exists and is uncaptured; it stages that login) and create account; create account with nothing staged refuses on its own └ line, and + login and + capture current login refuse a name either roster already holds on the name row, while create account refuses a name held by then with a create failed toast. The shunt form offers family (claude / codex / antigravity), name and + login, which is the create: the login modal opens, then the browser opens shunt's authorize URL; once it has, r opens it again, c copies it, and p opens a field where you paste the code the page shows (claude), or the address of the localhost page that fails to load (codex, antigravity); it goes to shunt as typed. + login is disabled, with its reason on its own └ line, and ignores ⏎ while no gateway is adopted, the gateway is not running, the config cannot be read or holds no clauth admin key, or no admin token file exists, except while its own add runs: then ⏎ on it reopens the login modal. While another login runs, ⏎ on an enabled + login names that login in a toast and starts nothing; a name outside a-z 0-9 - refuses on the name row.
A codex account's detail shows type codex, its plan, a login [ needs re-login ] pill only while the chain is quarantined, then re-login (codex's browser login, as + login; the modal offers r open again and c copy link, no paste) and delete account (press twice). A pool account's detail shows type shunt, its family, its provider (·-joined when several providers serve it), its plan, one status pill (needs re-login, paused, disabled or cooldown; none while the account is available), then refresh (claude and antigravity accounts) and remove (press twice; every routed family). A kimi or unknown-mode account shows the facts only.
A saved Claude Code account's rows:
| Row | Sets |
|---|---|
status |
read-only, and present only while the account is disabled |
type |
on a saved account, read-only api or oauth, off the base-url row and tracking what you type into it; on + new it is the claude / codex / shunt cycle that picks the form |
email |
read-only: the address of the account's Claude login, on an oauth account once clauth has read it with the plan tier (re-read hourly); hidden after a log out |
provider |
read-only, present only for an endpoint clauth recognises: which provider it typed the account as |
token |
read-only state of a stored long-lived setup token, above the editable rows, in one of eight states. Static: long-lived · ~Nd left, expires in ~Nd inside a month, long-lived · no recorded expiry, and expired. Rolling: rolling · re-stamps in ~Nh, rolling · re-stamp due inside the last hour, rolling · no recorded expiry, and rolling token stalled once nothing re-stamped it in time. mis-filled is neither: the sidecar holds a rotating pair the split cannot use. The charged states carry the fix beneath them (Configuration) |
name |
the profile name; a rename is refused while the account has a live session, a background job counting as one (see disable account above) |
auto-start |
whether clauth opens the 5h window with a 1-token ping (Configuration) |
alert at |
the 5h % at which this account's alert fires: the TUI toast, and the daemon's bell_command (Configuration); +/- step it by 5, starting at 95% from off; ⏎ types a value from 0 to 100, and an empty one turns it off |
base url |
the API endpoint; blank means an OAuth account |
api key |
the key for that endpoint |
model |
the account's default model; space cycles default, fable, opus, sonnet, haiku, opusplan; ⏎ types a full id |
+ model override |
expands to fable, opus, sonnet, haiku, subagent id overrides; a set one always shows, and one you empty keeps its row until you leave the pane or apply a preset |
| env entries | extra environment variables merged into settings.json while this account is active; ⏎ edits a value, and an empty one removes the key |
+ login / re-login
|
what it runs depends on the account, the same three-way split clauth login has: an OAuth account mints a browser login, an api-key account re-enters its base url and key inline, and a Model Studio account opens the Alibaba console to capture the usage session its api key cannot stand in for (Configuration). That last one replaces the session and nothing else, since the endpoint and api key keep their own rows. A browser login onto an account that already has an endpoint and a working key leaves both standing too, and replaces the subscription login alone. While a browser login runs its modal offers r to open the browser again, c to copy the sign-in link for another device to your local clipboard through the terminal (OSC 52: kitty, WezTerm, Windows Terminal, tmux with set-clipboard on, and iTerm2 once General > Selection > Applications in terminal may access clipboard is on), and p to turn that row into a code field: type or paste the code the link's page shows, ⏎ submits, esc brings the row back; a bad paste clears the field and says why |
log out |
drops the stored credentials, keeps the profile |
clear long-lived token |
drops that token so the account's own OAuth login installs again, or signs Claude Code out when the account has only an api key behind it; the row's hint names which. Appears while ANY long-lived piece exists — the token, the preserved mint backup, or a set rolling_token flag — arms on the first press, clears on the second (the full exit: flag, sidecar, and backup together). Faint and inert when clearing would strip the account's last credential; a flag-only account disarms regardless, since no credential is touched |
disable account / enable account
|
hides the account from auto-switch and polling, keeping its files |
delete account |
removes the profile; arms on the first press, deletes on the second |
| Row | Options | Default |
|---|---|---|
theme |
full, compatible
|
auto-detected |
reset display |
relative, clock, both
|
relative |
clock |
24h, 12h
|
24h |
home tab |
overview, usage, tokens, setup, fallback, config, status, services
|
overview |
on mismatch |
ask, overwrite, new, discard
|
ask |
non-login keys |
keep a /design-login with the account it was made on |
on |
refresh |
15 / 30 / 60 / 90 / 120 / 300 s, or a typed value from 10 s to 1 h | 90s |
refresh spent |
keep polling accounts already at 100% | on |
context nudge |
off / 300k / 400k / 600k / 900k, or a typed value from 50k to 2M tokens | off |
auto-start queue |
space auto_start accounts' 5h window opens 5h / N apart |
off |
rotation |
lazy, preemptive
|
preemptive |
auto-update |
checks for updates at launch, unless CLAUTH_NO_UPDATE=1
|
on |
weekly limit |
chain-wide 7d exhaustion line (a monthly-only account's 30d quota gates on it instead), 50-100% | 98% |
switch mode |
static, burn-aware
|
static |
burn floor |
earliest projected-switch point: 97 / 98 / 99 / 100% | 98% |
burn horizon |
how far ahead burn-aware projects | 60s |
walk order |
chain, soonest weekly reset, most weekly headroom
|
chain |
quota spent |
stay on active, switch off all
|
stay on active |
allow extra usage |
off, pay-as-you-go
|
off |
extra usage spent |
stay on active, switch off all
|
switch off all |
clock is inert unless reset display shows one. burn floor and burn horizon are inert unless switch mode is burn-aware. extra usage spent is inert unless allow extra usage is on. auto-start queue is inert until some account has auto_start on. What each of the auto-switch rows does: Auto-switch.
Four rows: shunt, delegates, plugin, and herdr (shown once herdr resolves; the tab probes for it in the background the first time you open it, and r probes again). A row's dot carries its health; the full readout lives in the detail pane. ⏎ descends into the selected row's detail (the delegates detail descends only while it lists a job). A fixable problem shows an f <verb> line under the problem it fixes (the f in the blue accent, the verb dim), and its row in the list ends in a blue f. f moves to the selected row's next f line (from the list it descends onto the first, and it wraps after the last); ⏎ on the focused f line opens that fix's confirm, and the footer shows ↵ <verb> while it is focused. In the plugin detail ↑/↓ walk the problems too, the focused one highlighted. In the plugin and herdr details PageUp/PageDown scroll diagnostic lines by a page; while reading them, a hidden fix or option cannot act, and an arrow restores action focus. In the shunt detail ↑/↓ walk the card's action lines, PageUp/PageDown scroll it a page and select the first action line in view, ⏎ on a focused f line opens its confirm, and on the focused enabled row space or ⏎ flips it. When shunt check refuses an admin fix or a config save clauth made, the card shows a check output line: ⏎ or space on it opens the check's output with secrets masked: every value of 8 bytes or more the config could pull in from your environment or from files, then any long key-shaped token still showing.
shunt reports the managed gateway (the daemon's live verdict when it runs the gateway, else the gateway record's own) and carries its controls. It names the binary, config and version it resolved, the state and its reason, then the pid and port. With no gateway adopted the state reads not adopted, followed by the config shunt would load from where the dashboard runs and a shunt already answering on the address that config sets, each only when there is one; while the card shows that answering shunt, the card checks it again every 5 seconds and drops the line once it stops answering. With no config found the check asks shunt's default address; SHUNT_SERVER__BIND moves either, as it moves shunt's own, read from the environment the adopt reads: the running daemon's, else the dashboard's. A daemon that recorded no environment shows the running daemon recorded no environment; restart it and offers no adopt. When clauth cannot read the address (a YAML config, a ${...} reference, port 0, an empty value), a bind not read (...) line says why and the check falls back to shunt's default address; when SHUNT_SERVER__BIND hides that the config itself is YAML (a shunt.toml linked onto a YAML file counts as YAML), unreadable or not valid TOML, a config not read (...) line says so, and the adopt itself refuses a config that does not parse. A found TOML config that clauth read, with a bind it read, adds an f adopt config line: confirming it takes the config over (a standalone shunt answering on that address refuses the adopt), plans the store move, and writes ~/.clauth/gateway.toml: with nothing to move and no refusal it adopts enabled and a running daemon starts it at once, otherwise it stays off until the move lands or you turn enabled on. Once adopted, the card adds the enabled toggle, the admin fix, and the codex pool note: f add admin key sits under admin clauth's key is not in [server.admin] when the config has that table but not clauth's key, f add admin table sits under admin no [server.admin] table when it has none (a running gateway restarts once to load it, Daemon), and codex provider <name> needs its own pool login names each provider with no pool login while the gateway runs healthy with clauth's key (a failed read shows a pool <error> line instead). While the gateway is off and the plan moves a file or refuses, a MOVE PLAN section lists moves / stays rows above f move stores in, which moves the stores in and turns the gateway on, or a single refused row saying why no move can run. Descended, ↑/↓ walk the lines a key acts on, landing on each as it scrolls into view; on the focused enabled row space or ⏎ flips it, f moves to the next f line, and ⏎ on a focused f line opens its confirm. Every fix confirms first.
Below its other lines the card lists the adopted config under SERVER, UPSTREAMS, MODELS, ROUTES and CLIENT TOKENS. SERVER holds bind and default_provider; each upstream, model and route is a ▶ row with a dim summary (an upstream's auth mode and account count, a model's upstream count, a route's <position> <model> → <provider>): space or ⏎ expands its fields in place and folds them again, and esc on one of its fields folds it back. A key the file leaves unset reads —, never shunt's default. On a typed field ⏎ or space opens the editor, ⏎ saves and esc restores the saved value; an emptied field removes its key (name and id excepted). On a field with a known set of values (an upstream's provider, kind, auth mode and auth header, and service_tier) space moves the pick without writing, ⏎ saves the pick, and ⏎ with no pick pending types any other value. A save runs shunt check on the edited copy before it writes: the row shows a spinner and checking, then a ✓ (on the new entry's row after an add), and one save runs at a time. clauth's own refusal (a ${...} bind, a comment the edit cannot place) shows on a red └ line under the row while you are on it, else as a toast; a refused shunt check toasts save failed and fills the check output line. Saving bind on a running gateway asks restart shunt? first, since shunt reads it only at start; renaming an upstream or model that other entries name asks first and renames those references in the same write. While the gateway's environment sets SHUNT_SERVER__BIND, or its env file cannot be read, the bind row is read-only and says why; a legacy [providers.*] config lists its providers read-only. Each group ends on + add upstream, + add model or + add route (no + add upstream on a legacy config): it opens blank fields under it and a save <kind> row, and nothing is written until that row saves (esc drops the form). Each expanded entry ends on remove <kind>, which asks first (none on an upstream or model whose name another entry shares); removing an upstream that other entries still name is refused by shunt check.
The CLIENT TOKENS group lists the stored tokens: one row per token (the profile's name and a remove chip), the env file's and the daemon env's own client names after them, faint, read-only and labelled env file / daemon env, then + add token. A failed token-store read shows a faint tokens not read line instead of the rows, a failed read of the unmanaged names keeps the stored rows and shows other clients not read, and an unparsed value shows <variable> not parsed; the first two put the reason on a faint └ line under them. ⏎ on + add token opens the ADD TOKEN picker: + new profile first, then every claude profile (one already holding a token ends in a dim has a token). Picking a profile opens point <name> at the shunt gateway? naming what the overwrite replaces — it replaces <base> and its current api key., it replaces <base>., or, for a subscription login (no base url), it stops using its subscription login, which stays stored; clear its base url in Setup to go back. — and overwrite mints the token, points the profile at the gateway, and the gateway restarts once. + new profile opens the new-account form with the gateway's base url filled and the api key row read-only (minted on save, hint clauth mints a client token for this profile): create account mints the token under the typed name; capturing a login, editing the url away or cycling type off claude disarms the mint, and a cancelled form mints nothing. ⏎ on a token row confirms remove <name>'s client token? / <name> keeps its api key, which stops working once the gateway restarts.. With no [server.auth] the gateway runs open and the card offers f require client tokens: with any client token (one stored, a client the env file or the daemon env names, or a tokens value clauth cannot read) it confirms require client tokens? / every consumer that sends no token is refused from then on., naming the profiles using the gateway; with none anywhere it opens the picker first, then the card reads require client tokens waiting for the gateway to restart and adds [server.auth] once the status feed shows a healthy gateway pid other than the one running at the mint.
delegates lists the clauth mcp job store in its detail. The row's dot reads green while a job runs and dim when none; a recent delegate rate-limit warning names the accounts in its detail. Descended, ↑/↓ walk the jobs (wrapping), PageUp/PageDown page the list, and the selected job expands under itself into its full facts and run directory; a job's facts include its live S t/s while it runs, off its own session, and its own average speed once finished. esc or ← ascends, → is inert, and tab / ⇧tab ascend and switch tabs. The detail binds no stop key: a delegate is stopped through the plugin's monitor tool (Claude Code plugin).
plugin folds the Claude Code wiring checks into one detail: the plugin install record first, then the mcpServers entry (mcp entry registered or not, mcp server ok or won't start, mcp source), then the claude version, whether clauth is on PATH, and the clauth data dir. Its health is the worst of the four, and two fixes can apply, in this order:
| Verb | When it appears |
|---|---|
install plugin |
the plugin reads not installed, installed for this project only, or installed at a version older than this clauth (its version line then names both, 0.16.0 (this clauth is 0.17.0)); installs at user scope, which updates an older install, and turns the plugin on |
wire mcp server |
the mcpServers entry is missing, project-local only, or drifted off the current launch line; writes the clauth entry into ~/.claude.json
|
To install the plugin: select the plugin row, press f, then ⏎, and confirm.
The herdr row's detail takes focus: ⏎ on the row descends, ↑/↓ walk the options rows, space or ⏎ activates one (toggle, cycle, or open the tag-refresh editor), +/- step the refresh, esc closes the editor and then ascends. delegate row text opens a confirm that defaults to cancel. When the herdr plugin is installed and its key is unbound or its sidebar row is untemplated, an f heal herdr config line sits above the options: ↑/↓ walk it with them, f jumps to it, and ⏎ on it opens the heal's confirm.
Start here
Reference
Headless
Help