Skip to content

Changelog

October 2026

0.14.0

Added

  • Pitboard switches Claude Desktop accounts on macOS with pitboard use desktop/<label>, while Claude is closed.
  • pitboard enroll desktop/<label> adds the account Claude is signed in to.
  • pitboard enroll desktop/<label> --sign-in parks the account Claude is signed in to and adds the one you sign in to inside Claude.
  • The app adds, switches and signs in again to Claude Desktop accounts, and asks before it quits Claude.
  • pitboard status says when Pitboard last read a Claude Desktop account in use, and when a parked one's sign-in may lapse.
  • pitboard doctor checks Claude Desktop under a heading of its own.
  • pitboard abandon gives up an interrupted Claude Desktop move.
  • pitboard repair gives a Claude Desktop account back its parked login.
  • pitboard adopt sets aside a Claude Desktop login parked on another Mac.
  • Copy Link in the sign-in dialog copies the sign-in page's address, to paste into another browser or browser profile.

Changed

  • Breaking: The public API of pitboard-core changes; its documentation shows the new one.
  • The account index is schema 8, which earlier versions cannot read, so update the command line and the app together.
  • pitboard uninstall refuses while Claude is signed out and a Claude Desktop login is parked or set aside.
  • With no account enrolled, pitboard status says it found no Claude Code login, not that nothing is signed in.
  • With no account enrolled, pitboard status says how to enrol a Codex account and, on macOS, a Claude Desktop one.
  • A switch that quits the ChatGPT app waits until the codex running inside it has quit too.
  • Open Sign-In Page in the sign-in dialog is renamed Open.
  • The pitboard cask's caveats link Upgrade from 0.3.0 or earlier in place of the commands that remove 0.3.0's formula.

Fixed

  • The status line shows a Team seat's five-hour limit alone, where it printed ? for a weekly limit the seat does not have.
  • pitboard uninstall's question says the other accounts need signing in again, not a browser sign-in.
  • A refused change says the interrupted switch it finished or undid before the refusal, not after it.
  • While CLAUDE_CODE_CUSTOM_OAUTH_URL is set, pitboard abandon refuses only where a Claude Code switch is interrupted.

0.13.0

Added

  • Pitboard can warm up a Claude Code account: once its five-hour limit resets, Claude Code sends one short message so the next window starts at once.
  • pitboard warm on <account> and Settings > Limits turn warm-ups on.

Changed

  • Breaking: The public API of pitboard-core changes; its documentation shows the new one.
  • The automatic switch and the offer when an account runs out prefer an account with no weekly limit for all models, such as a Team seat.
  • Settings has a Limits pane, with the automatic switch and warm-ups that were under General.
  • Settings has a Renewal pane, with daily renewal and Renew Now.
  • The app's icon and menu bar mark are a pit board with its top row lit, replacing three bars and a speedometer.

Fixed

  • Settings fits on screens as small as 1024 x 768: it opens at the top of the screen, and a long pane scrolls.

0.12.0

Added

  • Each account shows its plan, such as Max 20x or Pro, in the app, the menu and pitboard status, and as plan in --json.
  • An install script, curl -fsSL https://usepitboard.com/install.sh | sh, puts pitboard in ~/.local/bin on macOS and Linux and edits no shell profile.

0.11.0

Changed

  • Breaking: pitboard forget, stow and uninstall stop with confirmation_needed where they cannot ask, such as from a script, unless given --yes.
  • Breaking: --json no longer implies --yes.
  • The account index is schema 7, which earlier versions cannot read, so update the command line and the app together.
  • When Anthropic no longer accepts the Claude Code login in use, Pitboard marks the account login_refused and says to sign in again with claude.

Fixed

  • A switch, pitboard stow and the automatic switch no longer stop on an expired Claude Code access token, and renew it as Claude Code would.
  • An interrupted pitboard stow no longer loses a login it renewed.

0.10.0

Added

  • On macOS, pitboard stow and Put Away put away a Claude Code login left in ~/.claude/.credentials.json, parking it if Pitboard has none.
  • Pitboard warns with config_names_another when Claude Code's config names another account than the one whose login is stored.
  • Pitboard warns with in_use_unconfirmed when Claude Code's config has named another account since Anthropic last identified the stored login.
  • pitboard doctor has an in use check.
  • pitboard use on the account in use, and Update Claude Code's Config in the app, write that account into Claude Code's config.
  • pitboard log records why the automatic switch did not switch, as auto-stay, which Activity shows as Automatic switch not made.
  • pitboard watch --json has the event waiting, and more fields on idle, no_room and skipped.

Changed

  • Breaking: The public API of pitboard-core changes; its documentation shows the new one.
  • Breaking: pitboard watch --json reports switch_interrupted and custom_oauth_endpoint with the new event not_watching, not with skipped.
  • The account index is schema 6, which earlier versions cannot read, so update the command line and the app together.
  • While ~/.claude/.credentials.json is behind the keychain on macOS, every read warns with fallback_login.
  • While ~/.claude/.credentials.json is behind the keychain on macOS, a switch says running sessions keep their account until they renew their login or restart.
  • The app and pitboard watch say once why Pitboard is not switching.
  • The app decides whether to switch every 30 seconds, as pitboard watch does.
  • Switch when a limit reaches shows which account the automatic switch watches.
  • After a failed switch, the automatic switch waits a minute, doubling up to 15 minutes, before it tries again.
  • The status line labels a session's usage work? or ? while it cannot be sure whose it is.

Removed

  • Breaking: pitboard status --json no longer gives "source": "claude_code_cache", since Pitboard no longer reads Claude Code's usage cache.
  • Breaking: pitboard doctor no longer has the usage_cache check.
  • Pitboard no longer has the error code switch_overtaken, which it never printed.

Fixed

  • A sign-in outside Pitboard that replaces the login of the account in use shows as login replaced outside Pitboard, not nothing parked.
  • An account just switched to no longer shows the previous account's usage.
  • Numbers filed under the wrong Claude Code account go at that account's next answer from Anthropic.
  • The status line files a session's usage under the account the numbers belong to.
  • The app no longer offers an account whose reading may leave out a limit the account in use has.
  • The automatic switch and the app's offer can choose an account with fewer limits, such as a Team seat.
  • The automatic switch switches at the share the menu shows, so 95% shown counts as 95%.
  • Every front end rounds a half up and changes colour at 70% and 90%.
  • Pitboard takes the account in use from what Anthropic last said of the stored login, not from Claude Code's config.
  • The automatic switch identifies the stored login before it decides, and when it cannot tell, it decides nothing and says so.
  • The automatic switch judges every limit of the account in use.
  • The automatic switch says and records each reason it does not switch once.
  • A Claude Code switch no longer leaves the account switched from with a refused login when a session renews it at the same moment.
  • The app and pitboard watch see a change made in the same second as the last one, such as a pitboard use in a terminal.
  • The app and pitboard watch no longer report a switch that another pitboard is making as interrupted.
  • A login too large to pass without the argument line, under PITBOARD_NO_ARGV, counts as one of the automatic switch's three attempts.

0.9.0

Added

  • On macOS, pitboard doctor and each Claude Code change warn with fallback_login when ~/.claude/.credentials.json holds a login besides the keychain's, which Claude Code over SSH uses.
  • pitboard status, the app and, as ▲ or ▼, the status line compare each limit's use with an even pace to its reset, such as 27% over pace.
  • --json gives each limit's pace.
  • pitboard status --json gives each account's organization_uuid, the Claude organisation its login belongs to.

Changed

  • Breaking: A keychain locked where it cannot ask for its password stops a command with credential_store_locked, not credential_store_unreadable. A script that checks for the old code should check for both.
  • The account index is schema 5, which earlier versions cannot read, so update the command line and the app together.
  • How long the account in use lasts follows its limits' paces, as in weekly limit runs out in 11h 05m at this pace.
  • Accounts not in use no longer say how long they last.

Removed

  • Pitboard no longer keeps readings/ in its directory, and deletes the files it wrote there.

Fixed

  • pitboard doctor and This Mac report a locked keychain once, as a failed credential check, not as parked logins that need a new sign-in.
  • While the login in use cannot be read, the account Pitboard last switched to shows login could not be read, not Needs signing in again.
  • Pitboard enrols one person's Claude accounts in two organisations, such as a claude.ai plan and a Team plan, as two accounts, where it refused the second.

0.8.0

Added

  • Pitboard can switch Claude Code automatically once any limit of the account in use reaches a share you choose.
  • pitboard watch switches Claude Code automatically while it runs in a terminal, whatever the app's setting.
  • pitboard watch takes --at for the share it switches at, --once to decide once and exit, and --json for one event per line.
  • Settings > General has Switch Claude Code automatically, off by default, with the share it switches at; the app switches only while open.
  • The app posts a notification for each automatic switch and for what stops one.
  • pitboard doctor and This Mac have a network check that names the proxy Pitboard's requests go through, and warns about a SOCKS proxy or a proxy variable it cannot read.
  • The daily renewal schedule goes through the proxy of the Pitboard that installed it.
  • pitboard doctor's schedule_proxy check warns when the schedule's proxy differs from yours.

Changed

  • Breaking: The public API of pitboard-core changes; its documentation shows the new one.
  • Breaking: On macOS and Linux, Pitboard changes nothing as root or with sudo and stops with elevated, though pitboard status still answers as with --offline. Run it as yourself.
  • Breaking: Pitboard refuses SOCKS proxies: while ALL_PROXY, HTTPS_PROXY or HTTP_PROXY names one, requests fail as unreachable unless NO_PROXY names their host.
  • Breaking: pitboard schedule install and Renew parked logins daily refuse with schedule_not_default_home while PITBOARD_HOME names a directory other than ~/.pitboard. Unset PITBOARD_HOME to turn it on.
  • On Windows, pitboard builds and refuses every command but --version, --help, completions and manpage with windows_not_released.
  • The product is called Pitboard, with a capital P, and the pitboard command and every key it reads or prints stay the same.
  • pitboard status names a limit that is not a whole number of hours by its minutes or seconds, such as 90m.
  • The app writes spans as pitboard status does, such as resets in 2h 05m.
  • The app says resetting now once a reset is due.
  • Under a minute, pitboard status says about to run out or resets any moment, as the app does.
  • pitboard doctor sums up in the same words as This Mac, and pitboard renew as Renew Now.
  • The command line runs the claude or codex that PITBOARD_CLAUDE or PITBOARD_CODEX names, as the app does.
  • pitboard doctor reports the build of the claude or codex that PITBOARD_CLAUDE or PITBOARD_CODEX names.
  • An empty PITBOARD_CLAUDE or PITBOARD_CODEX names nothing.
  • Pitboard reads a few rare shared links differently, such as c%EF%BD%8Caude.ai, which it now takes for claude.ai.
  • The app's preferences, such as the tools you said Not Now to, follow PITBOARD_HOME.
  • The app posts that the account in use has run out once per reset, even across relaunches.
  • The app updates text that depends only on the time, such as used up until 14:05, once a minute.
  • The app's settings update what they offer each time they are shown.
  • The Activity list names a switch Switch, where it said Use.
  • When the app cannot read its record of the account windows, it deletes no window's data and never writes over the record.
  • --json output is ASCII only, with other characters as \u escapes that a JSON parser reads as before.
  • Pitboard's own Codex sign-ins keep the new login in auth.json, even when a Codex config chooses the keychain.
  • pitboard doctor and This Mac say which setting chose Codex's login store, such as file (Codex's default).

Fixed

  • Breaking: With HOME, PITBOARD_HOME or CLAUDE_CONFIG_DIR empty or relative, or CODEX_HOME relative, Pitboard refuses every command but completions, manpage and doctor with home_not_absolute. Set a full path or unset the variable.
  • When the account in use runs out, the app offers only an account with room in every limit.
  • Where Pitboard cannot list running processes, a Codex switch, or a sign-in that puts a new login in use, warns with sessions_unknown.
  • Pitboard reads Codex's login store from every config layer Codex reads, such as /etc/codex and managed preferences.
  • Codex changes stop with live_store_unsupported where a Codex config layer chooses a store other than the file.
  • Codex changes stop with live_store_unsupported where a Codex config layer cannot be read, names an unknown store or has an unmatched profile.
  • Pitboard no longer refuses a Codex account where config.toml chooses another store but a managed setting or a requirement chooses the file.
  • An account's window opens again on the page before a sign-in page, or on the site's home, not on the sign-in page.
  • After Claude Code refuses a pasted code, the sign-in sheet asks for the code again.
  • Sign In pressed right after Cancel no longer says another sign-in is already waiting.
  • The app reads again right after you add, rename or forget an account, give up on a switch or press Renew Now.
  • The window says when a sign-in fails, or a name cannot be saved, after its sheet has closed.
  • Quitting Pitboard stops a sign-in under way, and the tool's own sign-in with it.
  • The window shows two warnings with the same words as two notices.
  • This Mac gives each account's parked login check its own row.
  • This Mac says it is checking until the last check is in, not Checked at beside checks still running.
  • After an interrupted switch Pitboard cannot finish, the app shows An interrupted switch is waiting, with Give Up.
  • After an interrupted switch Pitboard cannot finish, pitboard status warns with recovery_undetermined.
  • pitboard abandon and Give Up give up on an interrupted Codex switch while CLAUDE_CODE_CUSTOM_OAUTH_URL is set.
  • pitboard doctor and the app's checks no longer warn that a parked login could not be read after a switch, an enrolment or a renewal.
  • pitboard doctor's advice about a login others can read is one sentence again.
  • The note under the sign-in sheet's Code field says Claude Code takes the code shown after you sign in.
  • The sign-in sheet links the right address when Claude Code prints it as a terminal hyperlink.
  • With HOME unset, the command line uses your account's home directory, as the app does.
  • The daily renewal schedule renews ~/.pitboard, even when PITBOARD_HOME reaches it through launchctl setenv or systemd's user environment.
  • On Linux, the daily renewal timer runs pitboard renew --scheduled once pitboard schedule install rewrites it.
  • The command line and the app take a claude or codex only when it is a regular file you may run.
  • The app honours the environment it was started with, such as ANTHROPIC_API_KEY, though opened from Finder it sees only what launchctl setenv sets.
  • The Open Link window and the Share sheet name claude.ai and chatgpt.com in English, whatever the Mac's language.

Security

  • Breaking: Pitboard refuses any folder in ~/Library/CloudStorage or ~/Library/Mobile Documents as its directory, with state_on_synced_drive.
  • Breaking: Pitboard refuses a ~/.pitboard with a sync client's folder name, such as Dropbox or Sync, anywhere in its path, in any case. Set PITBOARD_HOME to a folder outside it.
  • Pitboard writes the daily renewal schedule's files so only you can read them, since they can hold a proxy's password.
  • Pitboard refuses a site's sign-in link, or a link with a . or .. path segment, however the rest of its path is written.
  • Pitboard refuses a link that names a user or a port, and a pitboard:// link with a user, a port or a path.

0.7.0

Added

  • The app gives each account a window on its tool's site, claude.ai or chatgpt.com, so every account stays signed in side by side.
  • An account's window has Back, Forward, Reload, zoom and Find, with Safari's shortcuts.
  • An account's window opens at the last page it showed.
  • When an account's window first opens, a note says how to sign in, since Google's sign-in does not work inside apps.
  • An account's window opens other web pages in your default browser.
  • An account's window saves downloads to your Downloads folder without replacing a file.
  • An account's window asks before a download that an artifact or another site starts.
  • The Downloads button lists an account window's downloads.
  • File > Remove Website Data signs an account's window out on this Mac only.
  • Pitboard in a browser's Share menu opens a claude.ai or chatgpt.com page as the account you pick.
  • While any of its windows is open, Pitboard has a Dock icon, is in Command-Tab and shows its menus in the menu bar.

Changed

  • View > Refresh (Command-R) works in every window, and reloads the page in an account's window.
  • Forgetting an account also deletes everything its window keeps on this Mac, its sign-in included.
  • brew uninstall --zap --cask pitboard-app also removes the account windows' data.

0.6.0

Added

  • Switching Codex in the app while the ChatGPT app is open offers Quit ChatGPT and Switch, which quits ChatGPT, switches and opens it again; the command line never quits an app.

Changed

  • Breaking: The public API of pitboard-core changes; its documentation shows the new one.
  • After a Codex switch, Pitboard names each program still running the old login and how to make it take the new one.
  • pitboard doctor's codex_running check lists the programs still running the old Codex login.

Fixed

  • A switch counts only your own codex processes, not every user's.

September 2026

0.5.2

Fixed

  • After a banked reset on claude.ai, Pitboard shows the account's lower weekly share at its next read, not 100% until the old reset.
  • Pitboard shows the right weekly share after a plan upgrade mid-window.

0.5.1

Fixed

  • pitboard status --fresh and the app's Refresh no longer ask again during a wait the service asked for with Retry-After.
  • An account whose service never answered and then could not be reached no longer shows as rate limited.
  • With PITBOARD_NO_ARGV=1, renewing a parked login too large for security's standard input no longer loses it.
  • A switch whose login could not be read back names the pitboard use that finishes or undoes it.
  • With Codex's auth.json missing, pitboard doctor says to run codex login.
  • The man page covers every command on its one page, instead of naming pages that were never installed.
  • The app says Claude Code is not installed when it finds neither claude nor codex, and no login or enrolled account.

Security

  • The app, and a renewal schedule installed while PITBOARD_NO_ARGV is set, honour it, so a large login never reaches security as an argument another process running as you could read.

0.5.0

Added

  • The window's account list can rename an account.
  • Double-click or Return in the window's account list switches to that account.
  • Delete in the window's account list forgets the account.
  • Each account's menu in the window has Copy Email Address and Sign In Again.
  • The menu has About Pitboard.
  • Settings has a Command Line tab.
  • Menu bar shows in Settings picks the account and usage, the usage alone or the icon alone.

Changed

  • The menu bar item opens a menu, not a panel, with each account under its tool, and choosing one switches to it.
  • Adding an account, signing in again and renaming are sheets over Pitboard's window.
  • A sheet stays open while your browser is in front.
  • A failed switch, rename or forget says why in an alert, and a failed sign-in says so in its sheet.
  • Open Pitboard at login says when macOS waits for your approval in Login Items.

Fixed

  • The menu shows when it last read, not "updated just now".
  • The window's reset times stay current while it is open.
  • Giving up on an interrupted switch shows as a note, not as a failure.
  • A failure to change daily renewal or Open Pitboard at login shows in Settings.
  • Switching one tool's account no longer hides advice about another tool's account that ran out.
  • Advice to switch no longer offers an account that was forgotten, expired or ran out since.
  • A read in flight when you switch no longer lands after the switch and shows the account before it.
  • The window says why any account's numbers are not new, the one in use included.
  • The menu and the window describe each account the same way.

0.4.1

Changed

  • Pitboard keeps one usage reading per account that only moves forward, so a session's older numbers no longer replace newer ones.
  • The app's Documentation item opens docs.usepitboard.com.

Fixed

  • Every session on one account, pitboard status and the menu bar show the same, newest numbers, and idle sessions follow with "refreshInterval": 10 in the status line settings.
  • A session still holding the previous account's numbers after a switch or a /login no longer records them as the new account's.
  • The advice to switch stays for as long as the account in use is out, not only until the app's next read.

0.4.0

Added

  • Settings > Advanced shows which pitboard a terminal runs.
  • Install command line tool… in Settings > Advanced links /usr/local/bin/pitboard to the app's own, and never replaces a pitboard someone else installed.
  • An account whose parked login has expired has a Sign in again button in its row.

Changed

  • Breaking: In the tap, pitboard is the command line's cask and the app's cask is pitboard-app. Upgrade from 0.3.0 or earlier has the commands to move.
  • Breaking: The public API of pitboard-core changes; its documentation shows the new one.
  • The app carries the command line inside it, so an update moves both.
  • brew install datlechin/tap/pitboard installs the release's own command line as a cask, on macOS and Linux, without compiling.
  • From the old formula, brew update leaves Pitboard at 0.3.0, so uninstall the formula before you install the cask.
  • From the old app cask, brew update replaces the app with the command line once, and keeps your settings and ~/.pitboard.
  • Removing the old app cask with --zap moves ~/.pitboard to the Trash, so leave --zap out.

Removed

  • Releases no longer publish a source tarball; the source is on crates.io and in the tag.

Fixed

  • Daily renewal turned on from the app runs the command line inside the app, instead of starting a second copy of the app every day.
  • Opening the app points a 0.3.0 renewal schedule at the command line inside it.
  • The app no longer turns daily renewal on from the temporary copy macOS runs before the app is in Applications.
  • pitboard doctor and Check this machine fail when the renewal schedule runs a pitboard that is gone or is an app.
  • On Linux, a renewal schedule turned on from the command line keeps working after brew upgrade.
  • pitboard uninstall removes the renewal schedule first, as schedule_removed in --json.
  • Both casks remove the renewal schedule only on brew uninstall --zap, and neither touches ~/.pitboard, so run pitboard uninstall before removing Pitboard.
  • Advice about upgrading or removing Pitboard no longer assumes Homebrew.
  • On Homebrew 6 and later, the app's cask installs without the formula installed first.
  • cargo binstall pitboard no longer falls back to a third party's build when it cannot fetch the release's.

0.3.0

Added

  • Pitboard switches Codex accounts too, with pitboard enroll codex/<label> and pitboard use codex/<label>.
  • pitboard enroll codex/<label> --sign-in runs codex login in a private CODEX_HOME.
  • pitboard shows each Codex account's five-hour and weekly limits.
  • Pitboard handles Codex's auth.json store, and refuses Codex's keychain stores with a reason.
  • Until a Codex account is enrolled, Pitboard reads nothing of Codex's and asks OpenAI nothing.
  • A Codex switch says that running codex sessions keep the old account until restarted, and how many it found.
  • A Codex switch warns that signing out in a running codex would revoke the login just parked.
  • A Codex switch writes nothing over a login that a running codex renewed meanwhile.
  • A Codex switch refuses to park a login that names two accounts.
  • The app's panel groups accounts by tool.
  • The menu bar follows the signed-in account closest to running out, of either tool.
  • When an account runs out, the app offers only an account of the same tool.
  • Add another account asks which tool when both are installed.
  • A Codex sign-in in the app shows the address codex login printed.
  • Labels belong to a tool: work can name a Claude Code and a Codex account, and codex/work says which.
  • A bare label means Claude Code for a new account, and is refused as label_ambiguous where it matches both tools.
  • pitboard adopt takes over a ~/.pitboard written on another computer, keeping each account's label, email and usage and dropping every parked login.
  • pitboard repair finds every parked login in the keychain or vault, and gives it back to its account, deletes it or reports it.
  • pitboard repair deletes only logins this Pitboard recorded.
  • On macOS, a login pitboard repair gave back that this Pitboard never recorded is deleted only once Pitboard has used it.
  • pitboard uninstall says how many parked logins it left that this Pitboard never recorded, as parks_left in --json.
  • A failed request to Anthropic carries a cause beside its code, such as unreachable, rate_limited or login_refused, in --json and the app.
  • A failed request to Anthropic says whether asking again can help, and pitboard status tells the causes apart.
  • The app has a window with each account's usage history, the full change log and what doctor found.
  • The app has a Settings window, opened with Command-comma, that can turn on scheduled renewal.
  • On a first run, the app says what state the machine is in and offers the next step.
  • The app's first launch opens its window.
  • The app can give up on an interrupted switch that recovery cannot finish.
  • pitboard doctor fails when anyone but the owner can read a stored login.
  • pitboard doctor lists what fills a login too large to store, largest first.
  • pitboard doctor says when an account has gone unused longer than its refresh token lasts.
  • pitboard doctor reports Claude Code's supervisor daemon, which also writes the login.
  • pitboard doctor shows the installed Claude Code version, beside the version Pitboard's facts about it were checked against.
  • pitboard doctor has environment.codex, and Codex checks whose codes start codex_.
  • pitboard doctor fails or warns about a Codex keychain store or API key login only where it stands in the way of enrolled Codex accounts.
  • pitboard doctor says what Pitboard holds back from asking Anthropic.
  • Pitboard keeps two weeks of each account's usage, and says how long the account lasts at its recent rate.
  • pitboard status names the credential slot it reports on, which CLAUDE_CONFIG_DIR selects.
  • pitboard renew renews every parked login that is due.
  • pitboard status --fresh and the app's Refresh ask at once, but never during a wait the service asked for with Retry-After.
  • pitboard schedule install runs pitboard renew on a schedule, through a LaunchAgent on macOS or a systemd user timer on Linux.
  • Pitboard warns when Claude Code's settings set an env block, an apiKeyHelper or a third-party provider that makes sessions ignore the login it switches.
  • A custom OAuth endpoint set in Claude Code's settings refuses a switch.
  • PITBOARD_NO_ARGV=1 refuses a login too large for security's standard input, instead of passing it as an argument.
  • What Pitboard removes from Claude Code's config goes into pitboard log.
  • In --json, use, enrolments and renewals give provider.
  • pitboard use --json gives adoption, which says whether running sessions follow on their own or need restarting.
  • pitboard status --json gives each account provider and qualified, such as codex/work.
  • pitboard status --json gives login_unreadable for a login Pitboard cannot read, and login_unusable for one it cannot switch, such as an API key.
  • Each limit in --json gives length_seconds.
  • Each release artefact comes with a CycloneDX bill of materials.
  • The bills of materials, SHA256SUMS and appcast.xml are attested like the artefacts.

Changed

  • Breaking: A Claude Code credential with no account, as /logout leaves, makes use and enroll exit 1 with live_credential_absent, not 3 with live_credential_shape_unexpected.
  • Breaking: The public API of pitboard-core changes; its documentation shows the new one.
  • The account index is schema 4, which earlier versions cannot read; they say which of the command line and the app to update.
  • Pitboard brings a schema 3 account index forward on first read.
  • pitboard doctor warns, instead of failing, when Claude Code's credential holds no account.
  • Messages name the tool, service and sign-in command of the account they are about.
  • Messages qualify a label to type, such as claude/work, where a bare one would be ambiguous.
  • CLAUDE_CODE_CUSTOM_OAUTH_URL refuses changes to Claude Code accounts only, not to Codex ones.
  • pitboard doctor warns about the storage v5 flag only when it is on and the login is in the fallback store.
  • Pitboard asks Anthropic about an account again only once its tightest limit could have moved by a percentage point.
  • Every front end waits out a refusal for as long as Retry-After says.
  • An interrupted switch is recovered without a network in most cases.
  • The app shows the last measured numbers when Anthropic cannot be reached, not an empty panel.
  • Text in the app grows with the system text size without clipping.
  • VoiceOver reads each account row as one item, and says whether each check passed.
  • A login too large for security's standard input is passed as an argument, as Claude Code does, and the switch says so.
  • Homebrew serves each release as it is published, not up to a day later.

Fixed

  • The app follows a switch made elsewhere on the machine, such as in a terminal, within seconds, not up to five minutes later.
  • A run killed while parking a login no longer leaves a live login that nothing names, and pitboard doctor reports any left.
  • A parked Claude Code login keeps the account's other credential keys, such as its device token, and a switch back restores them.
  • Cancelling a sign-in no longer holds the app.
  • The app shows every warning, not only the first.
  • A failed read in the app shows its own warnings, not those of the last read that worked.
  • VoiceOver no longer calls the status item "speedometer".
  • The app finds claude and codex installed through a Node version manager such as nvm or volta, or a custom npm prefix.
  • pitboard enroll <label> --sign-in for the account in use puts the new login in use, where it parked it.
  • When Pitboard cannot confirm a new sign-in is in use, it parks the login rather than lose it, and says why.
  • A renewal interrupted after writing the fresh login no longer loses that login on the next run.
  • Recovering an interrupted switch from another CODEX_HOME or CLAUDE_CONFIG_DIR stops with recovery_elsewhere.
  • A command refused over a mistyped name still finishes or undoes an interrupted switch, and reports it.
  • Labels written by 0.1.x that contain a slash can be switched to, forgotten, renamed and signed in to again.
  • Pitboard no longer asks about an account as often as once a minute over limit kinds it did not know, such as session.
  • Changing Claude Code's config no longer loses what Claude Code wrote to it meanwhile, such as project history.
  • A renewed login's expiry follows Anthropic's clock, not this machine's.
  • When Claude Code's config names a signed-in account whose login no store Pitboard reads holds, Pitboard refuses with live_credential_elsewhere.
  • A switch checks the incoming login with Anthropic first, and drops a refused login and stops.
  • A switch refuses an incoming login filed under the wrong account.
  • A switch renews an incoming login's expired access token.
  • A switch undone by a Claude Code /logout at the same moment fails with switch_did_not_hold, not with success.
  • A switch notices when the machine slept long enough for Claude Code to take back the credential lock, and stops.
  • A locked keychain no longer reads as a lost login: the switch keeps every copy and fails with switch_unverified.

Security

  • pitboard doctor --json no longer prints the signed-in email, organisation uuid, login name, a value derived from the refresh token or home paths with the username.

0.2.0

Added

  • pitboard log shows what Pitboard has changed and when, and which front end asked.
  • pitboard uninstall deletes every parked login, then Pitboard's own files.
  • pitboard abandon gives up on an interrupted switch that cannot be finished, keeping every login.
  • pitboard status --offline answers from the last measured numbers, without asking Anthropic or touching a login.
  • Each usage row in --json carries severity, Anthropic's own grade for that limit.
  • ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN and CLAUDE_CODE_OAUTH_TOKEN raise a warning on every change, since Claude Code signs in with them instead.
  • The app shows each account's email, and when each limit resets.
  • The app shows when a parked login stops working.
  • The app runs doctor's checks on demand.
  • The app shows its own version, and a mark in the menu bar.
  • The app has VoiceOver labels.
  • The app can record the account in use.
  • The app can drop an account.
  • The app can add an account through Claude Code's sign-in, showing what that sign-in says.
  • cargo binstall pitboard fetches the built binary instead of compiling.
  • The macOS command line binaries are signed and notarised like the app.
  • Each release carries build provenance.

Changed

  • pitboard forget asks before deleting a parked login, unless given --yes or --json.
  • The minimum supported Rust version is 1.91.

Fixed

  • A state file from a newer version makes Pitboard say whether to update the command line or the app, not offer to delete the accounts.
  • pitboard statusline typed at a prompt no longer waits for input.
  • Offline, the account in use no longer shows as one with nothing parked.
  • A switch that failed before installing anything no longer makes the next command announce a recovery.
  • enroll --sign-in checks what could refuse the enrolment before the browser sign-in, not after.
  • The status line shows numbers for every account, not question marks for all but the account in use.
  • doctor and forget go by who is signed in, not by Pitboard's record of its last switch.
  • Three ways a parked login could be left in the keychain with nothing naming it are closed.
  • A renewal that could not be written no longer leaves the account with a login already spent.
  • A login past the keychain's size limit gets its own error, giving the size, the limit and what to do.
  • Columns line up in a terminal when a label is in Chinese or Japanese.
  • One state file serves every credential slot, and an account switched to in one slot is no longer claimed in another.
  • A limit scoped to one model no longer makes the menu bar read as though everything had stopped.
  • Building on Windows stops with one sentence instead of a screen of type errors.

0.1.4

Fixed

  • Renewing a parked login whose answer has no refresh-token lifetime keeps the deadline it had, as Claude Code does.
  • Pitboard refuses to act while CLAUDE_CODE_CUSTOM_OAUTH_URL is set, where a switch would restore into an item nobody reads.

Security

  • A switch no longer leaves the outgoing account's trustedDeviceToken, organizationUuid, enterpriseGateway or designOauth for the incoming account to present as its own.

0.1.3

Added

  • The menu bar panel says when an account has run out and which has the most left, whether or not notifications are allowed.
  • After a switch, the panel counts down until sessions already open follow.
  • A Homebrew tap installs the command line with brew install datlechin/tap/pitboard, and the app with --cask.

Changed

  • The app asks for permission to post notifications only when it has something to say.

Fixed

  • Pitboard run without USER set, as from launchd, cron or an app opened from Finder, reads the same keychain item as Claude Code.
  • A parked login issued to another client is renewed as that client, not as the first-party one.
  • The app's build number counts up with its version, where 0.1.2 shipped a number Sparkle would read as newer than the next release.

0.1.2

Added

  • A macOS menu bar app shows the account in use and its tightest limit in the menu bar, and every account's limits in its panel.
  • The app switches accounts in one click.
  • The app posts a notification when an account runs out.
  • The app can open at login.
  • status renews a parked login whose access token has expired, so parked logins no longer lapse.
  • status drops a login Anthropic refuses, and names the command that signs in to it again.

0.1.1

Fixed

  • enroll --sign-in no longer holds Pitboard's lock while the browser sign-in waits, so use, forget and rename work meanwhile.
  • A second enroll --sign-in is refused while one waits.
  • enroll --sign-in --json prints exactly one JSON line, with Claude Code's sign-in output on stderr.

0.1.0

Added

  • Pitboard has the commands enroll, use, forget, status, doctor and statusline.
  • status shows live usage for every enrolled account, which accounts can be switched to, and until when.
  • enroll <label> --sign-in on an enrolled label renews its parked login.
  • rename changes an account's label.
  • A switch refuses a parked login that has expired.
  • doctor checks every parked login and reports an interrupted switch.
  • Every command takes --json, with a versioned envelope and stable error codes, even for a mistyped command line.
  • Pitboard has shell completions and a man page.
  • Pitboard runs on Linux, with parked logins in a file vault, not yet tried against a signed-in Claude Code there.
  • Pitboard keeps an audit log of every change it makes.
  • The account index is schema 3, with one parked login per account and its expiry.

Follow releases with the RSS feed. Release candidates are only on GitHub Releases.

This page is built from CHANGELOG.md.

Sponsor Pitboard on GitHub.