Skip to main content
None of these commands takes an argument. JSON output lists what each prints with --json.

stow

pitboard stow puts away Claude Code’s .credentials.json where it sits behind the keychain on macOS, or behind Credential Manager on Windows. The fallback_login warning names that file. While it is there, open Claude Code sessions follow a switch only at their next renewal, as Open sessions explains. Claude Code over SSH uses another account says how the file gets there. On Linux, .credentials.json is Claude Code’s only store, so no file sits behind one, and stow says there is nothing to put away. At a terminal, stow says what the file holds and asks first, as Questions before deleting describes. Anywhere else, such as in a script or with --json, it needs --yes. Without it, stow refuses with confirmation_needed and deletes nothing.
Deleting the file signs out a Claude Code session that signed in with it, as one over SSH does where it cannot read the keychain or Credential Manager.
stow identifies the login in the file by its refresh token where Pitboard knows that token. Otherwise it asks Anthropic, with the login’s own access token. It never sends an expired access token. It renews such a login first and writes it back to the file before anything else. That write keeps the file’s other keys. If stow is killed before the write, or the write fails, the next change writes the renewed login to the file, and stow then says the file changed. Until then, stow changes nothing and says why. Where the outcome turns on whose login Claude Code has stored, stow identifies that login too. If its access token has expired, the question before stow uses the account Pitboard last recorded, and stow itself renews the login as a switch does. It then keeps the login where it is not kept already, and deletes the file: login is the --json field, and the outcome log records. A parked login that an earlier, stopped stow copied from the file does not count as one the account can switch to. A session using the file may have renewed the login since, spending the copy. From its last reading of the file until the file is gone, stow holds the locks Claude Code takes before it renews a login. Claude Code files names them. On macOS, parking a login too large for the keychain’s standard input warns written_on_the_command_line. See Large logins on macOS. stow stops with a code from Claude Code and Codex files, Credential stores and locks or Command output, such as left_login_not_enrolled. None of them deletes the file. Once stow begins putting the file away, an error ends with how far it got:
  • Pitboard changed nothing.
  • Pitboard deleted nothing, having renewed the login in the file and written it back there.
  • Pitboard deleted nothing, having parked the login in the file for `work`.
  • Pitboard deleted nothing. It renewed the login the file held and keeps the renewed login until the next change writes it back there.
  • Pitboard deleted nothing. It renewed the login the file held and could not write the renewed login back there, so that login no longer works. A sign-in replaced the file’s login meanwhile, or neither the file nor the store in front of it could take the renewed login.
  • Pitboard deleted nothing. It renewed the login Claude Code has stored and keeps the renewed login until the next change saves it there.
Where stow renews the login Claude Code has stored and can keep the answer nowhere, the error ends with Run `claude`, sign in, then try again. instead. With nothing behind the keychain or Credential Manager, stow changes nothing. It prints Nothing is left behind the store Claude Code keeps its login in, so there is nothing to put away. On Linux it always prints that, and on Windows while .credentials.json is Claude Code’s store: the file is where Claude Code keeps its login.
On Windows, the output names Credential Manager where this one names the keychain. In the app, Clean Up on the notice A leftover sign-in file does the same, as Notices lists. On Windows, the button is Clean up.

abandon

pitboard abandon ends what an interrupted change left waiting, and keeps every login. Giving up a Codex switch drops a parked login that copies the login in use. Why Codex logins are moved, not copied says why. Giving up a Claude Desktop move moves nothing in or out of Claude’s data folder. Items of the account left there stay, and a later change sets them aside. A Claude Desktop move that abandon cannot give up still waits, and abandon refuses with the reason, such as app_open. Where giving it up would leave items beside another login in the data folder, the reason is move_mixed. Where abandon gave up a Claude Code or Codex switch first, it warns move_not_given_up with the reason instead. While CLAUDE_CODE_CUSTOM_OAUTH_URL is set and a Claude Code switch is interrupted, abandon refuses with custom_oauth_endpoint, exit status 3, and gives up nothing. With no Claude Code switch interrupted, the variable does not stop it. After an interrupted switch from work to personal:
The Claude Desktop line changes in two cases: An interrupted switch cannot be finished and A Claude Desktop move was interrupted say when to run it.

repair

pitboard repair finds parked logins that Pitboard’s account list does not name. It adds the names in pending in Pitboard’s directory, then reads each one the account list does not name. Pitboard writes a parked login’s name to pending before creating it. Every switch, enrolment, forget, rename, stow and uninstall resolves the names on that list as it starts, without listing the keychain. A parked login is missing from both only after Pitboard’s directory is lost or restored from a backup. That is when repair is needed. With no move waiting, repair reads nothing of Claude. It gives a parked login back to the enrolled account whose id is in its name when: A Claude Desktop account whose parked login’s folder is gone, as after state.json is restored from a backup, counts as holding none. repair gives back a folder set aside earlier on the same terms. It sets aside the folders no account can take, and deletes none that holds an item. While CLAUDE_CODE_CUSTOM_OAUTH_URL is set, repair refuses with custom_oauth_endpoint, exit status 3. Pitboard lost track of parked logins says when to run it.

adopt

pitboard adopt takes over a Pitboard directory another computer wrote. Until you run it, commands that read the account list refuse that directory with state_wrong_machine. It keeps every account with its label, email and remembered usage. Each parked login goes one of three ways: Asking whether a login works means renewing it, and nobody has measured whether that ends the other computer’s copy. What Pitboard will not do says why a parked login never moves between computers.
Where it set Claude Desktop logins aside, a line before Sign in to each again: names them:
Each of those accounts then gets its own pitboard enroll desktop/<label> --sign-in line, after the lines of the logins dropped. The count of logins dropped leaves them out. If the directory is already this computer’s, adopt prints This Pitboard directory was already written on this computer. and changes nothing. The Pitboard directory came from another computer says when to run it.