Releases: leeovery/switchboard
Releases · leeovery/switchboard
Release list
v0.1.0
✨ Added
- A redesigned dashboard: a card per account with big-digit readouts, charts and a heading summing up the router, its sessions, where new sessions go, room left and what's coming up.
- Three dashboard views, switched with
tab: Accounts, Sessions (a switchboard of cords from each session to its account, with a live log) and Runway (when each account has room, over the day or the week). - Card charts you cycle with
g— a burn-down, a burn rate or an hourglass — andwto choose which window each card features. - Flip a card (
space, orsfor all) to see its sessions, pick one out with the arrow keys and pin it to another account with a digit key. - Live request tracking in the dashboard: pulses along cords as requests go out, answers stream back with token counts, and refusals bounce back red.
- Dashboard themes: built-in
nord,tokyo-night,tokyo-night-day,amber,exchangeandterminal, a live theme picker ont, light/dark pairs chosen by the terminal's background, and support for your own.themefiles in Portal's format. - A
?help panel listing every key and what the dashboard's glyphs mean. GET /historyandGET /streamon the router, serving the usage history and a live stream of request events that feed the dashboard.- The router now keeps a list of recent events — sessions started and moved, limits, pressure, refusals, primes, restarts — shown in the dashboard and the status document.
[history] keepconfig option sets how long the readings history is kept (8d to 400d, default 14d).- Readings history files are compressed once their day ended two days ago.
- Animated demos and stills for the README, recorded from scripted scenarios with the new
capturetool.
🔧 Changed
- Reserves are now opt-in on every account, the primary's included — with none set, the router runs every account to its limit.
usageprinted once draws the full Accounts view, with its charts, in your chosen theme.- The dashboard remembers your view, featured window, chart style and theme between runs.
- The dashboard's colours are brought down to what the terminal shows, and
NO_COLORdraws it with no colour at all. - README rewritten to lead with tracking and routing usage across accounts.
🐛 Fixed
- Router restarts no longer leave a connecting launcher hanging while it stops.
- A config file caught half-saved no longer causes a refused or premature restart.
- A projection no longer reports a window running out when it only reaches its limit just as it resets.
v0.0.6
🔧 Changed
switchboard usageprints the status document as JSON when its output isn't a terminal, such as in a pipe or an agent's shell — data instead of a dashboard's boxes and bars.- The switchboard skill now points agents to
switchboard status --jsonfor usage instead of the dashboard.
✨ Added
switchboard status --refresh(-r) — has the router read every account it may first, waiting up to ten seconds, so a limit reset by hand shows up straight away.
v0.0.5
✨ Added
- Pressure awareness for the 5-hour window — the router watches each account's recent rate of use and, when one would run out before its window resets, sends new sessions to the best of the others; running sessions and pinned sessions stay put.
- Readings history — each change to an account's window readings is appended to a daily file under
history/in the state directory, kept for 14 days, so you can look back at how your accounts were used. - Recent rates survive router restarts — on startup the router reloads the last readings from the history.
statusandusageshow when an account is under pressure, with when it runs out and the rate it goes by (under pressure: runs out ~18:21).- Projections use the last 30 minutes' rate when that has a window running out sooner, labelled
(last 30 min)— a burst of use shows at once.
🔧 Changed
- Prime slots fall on ten-minute marks, matching where the API actually starts windows, so the schedule shows real resets (two accounts now prime at 04:10 and 06:40, not 04:15 and 06:45).
- Primes now go 5 seconds after their slot, so they land within the slot's ten minutes even when the Mac's clock runs slightly ahead.
- "Best next" and the router's choice of account both pass over accounts under pressure while another isn't.
- The log notes when a choice passed over an account for pressure, and the choice's reason says so.
🐛 Fixed
- A window you reset by hand on claude.ai is now recognised — its marker and projection measure from the reset rather than the window's start.
- A limit reached before a hand reset no longer sticks — the request is sent again on the same account instead of moving the session away.
- Stale readings from requests sent before a hand reset no longer put the dropped use back.
v0.0.4
✨ Added
- In-place router restarts — the router replaces itself with its new binary in the same process and hands over its listening sockets, so requests made during a restart wait a moment instead of being refused.
POST /restarton the router's control API — asks a running router to restart once its in-flight requests finish, and reports whether it will restart in place.
🔧 Changed
switchboard service restartnow asks the router to restart in place and says which way it will go (it restarts in placeorlaunchd starts it again) — older routers still stop and are restarted by launchd.- Config, upgrade and time-zone changes now trigger an in-place restart rather than an exit, so launchd no longer has to start an upgraded binary afresh, which macOS has been seen to refuse.
- A router whose binary is briefly missing during
brew upgraderetries for a couple of seconds before falling back to exiting for launchd.
🐛 Fixed
service restartnow refuses with a reason for a router run by hand or one whose config isn't valid, instead of stopping it with nothing to start it again.- A stop signal received while the router is finishing its requests to restart now stops it immediately instead of restarting.
v0.0.3
🐛 Fixed
- Removing an account no longer strands running sessions — sessions holding a removed account's token stay routed as the primary's for a week.
- A request refused by every account it went out on no longer bars accounts or moves its session — the refusal says more about the request than the accounts.
- Sessions whose request was refused now return to the account they were on before it.
- Once every account has refused a request, it isn't tried again elsewhere, and Claude Code gets a 502 giving the API's actual reason.
- Per-request refusal tracking means one request taking back its refusals no longer erases those placed by other requests.
best nextnow respects the global pin — it shows where a new session would actually go.
✨ Added
switchboard statusand the dashboard report a pending router restart — with the reason, since when, and requests in flight — e.g.restart due (config changed).switchboard service restartis now the pointed-to way to apply a pending restart immediately instead of waiting for a quiet moment.switchboard accounts removereports which account becomes primary when the primary is removed, and warns if the new primary has no usable token.
🔧 Changed
- Removed-account tokens are kept only as SHA-256 hashes, and are restored to the account if it's configured again.
- A router started by hand with
servenow tellsstatusto runserveagain to take up the restart.
v0.0.2
✨ Added
- Pin several accounts at once with
switchboard pin work side— new sessions go to the best of them until all are out, and the dashboard's1–9keys now toggle accounts in and out of the pin. switchboard usage --refresh(-r) has the router read every account it may first, so a limit you reset by hand on claude.ai is seen at once.- The router notices the Mac waking from sleep and sends requests upstream on fresh connections, so connections a sleep left dead no longer fail requests.
- The router restarts itself when the Mac's time zone changes, so the priming schedule keeps to the clock.
- Token files can be links to files kept elsewhere — switchboard writes a token through the link to where it leads.
🔧 Changed
- Accounts are primed 5 seconds after their 5-hour window resets, whether or not they were in use, so a prime always lands after the reset.
- Accounts that can take no request (limit reached, week spent, token refused) are no longer primed, and are probed instead so a manual reset is noticed.
- Account ids that differ only in case are refused, as macOS would give them one token file.
- The dashboard keeps showing the router's last view, saying since when, when the router stops answering, rather than probing every account at once.
- Usage readings off responses and repeated use of a session are saved to disk at most once a minute instead of every second or so.
claudelooks a moment later at a token file it finds empty before counting the account as having no token.claudeversion checks run with the real Claude Code's own directories first onPATH, and no longer hang on a CLI that leaves a process running.
🗑️ Removed
accounts removeno longer deletes the file a linked token file leads to — only the link goes, and the command says so.
🐛 Fixed
- A 429 without usage headers is passed straight to Claude Code instead of being treated as the account's limit, retried or replayed.
- A session is remembered only once a request of it succeeds, so
claude --resume's startup quota check no longer leaves a stray assignment. - A limit lifted early — by a manual reset or a request that then succeeds — is now noticed instead of holding the account back until its stated reset.
- A wrapper named
claudethatexecs switchboard, or another build of switchboard, no longer makes it start itself in a loop when looking for the real Claude Code. - Repeated warnings about an ignored pin are logged once per session and account rather than on every request.
- Installing the service retries when launchd is still finishing unloading the old one, avoiding spurious "Input/output error" failures.
- Request failures that predate a wake from sleep no longer count against the router's health.
- Unknown log names are redacted in the error
switchboard logsprints.