Skip to main content
Each command also takes the global options. Exit codes lists the exit statuses, and Labels says how a label finds an account.

status

The two options cannot be given together. status sends every request at once, and each times out after 5 seconds. --offline sends no request and writes nothing. How often Pitboard asks says when an account is asked again, and what --fresh changes. How Pitboard knows whose login it is explains the record for each tool. status exits 0 when a service cannot be reached, and that account’s last line says why. It exits 1 on an error in The Pitboard directory. Warning codes gives each message and what to do.
A Codex account’s last line ends read without asking OpenAI instead. A Claude Desktop account has no usage lines. status says so once for all of them:
Where any Claude Desktop account reads login replaced outside Pitboard, status leaves that line out. Account status says what each line means, and Status data lists the --json fields.

enroll

Without --sign-in, enroll records the account the tool is signed in to. It parks nothing: Parked logins says why. With --sign-in: A Claude Code or Codex sign-in leaves the account in use signed in. Before each one, Pitboard deletes signin and makes it again, private to you. It runs the tool in signin-work, which it empties first. It reads the new login from signin, then deletes that directory and, on macOS, that keychain item. On Windows, it deletes that Credential Manager item too. On Windows, before a Codex sign-in, Pitboard names on standard error what runs Codex: a Codex sign-in open there ends as this one starts. A lock on signin.lock in Pitboard’s directory keeps sign-ins to one at a time. A Claude Desktop sign-in holds it for the whole wait. Where Claude is already signed out and its settings still hold an account’s keys, Pitboard sets those keys aside before it waits. While it waits, a Claude Desktop sign-in prints these lines on standard error. A warning raised while it parks the account in use comes first, as a plain line without warning:. After Control-C, Claude stays signed out. An account parked for the sign-in stays parked, and every read warns sign_in_awaited. Finish or undo an add or a sign-in again says what to do next. The enrolled field of --json output names the outcome. current adds a second line: When Pitboard cannot identify the Claude Code or Codex login in use, --sign-in parks the new login instead of replacing that one. If Pitboard cannot identify the login in use says what to do. enroll refuses with a code from Accounts and labels, Signing in, Claude Code and Codex files or Claude Desktop. Before your browser opens, a Claude Code or Codex sign-in refuses with custom_oauth_endpoint, sign_in_pinned_to_console, live_store_unsupported, sign_in_not_isolated, claude_program_missing, codex_program_missing or sign_in_in_progress. enroll can warn sign_in_parked_not_in_use, sessions_keep_old_login, sessions_unknown, lock_compromised, written_on_the_command_line, login_taken_as_named or set_aside. Warning codes gives each. To add a second Claude Code account:
This line and Claude Code’s own output go to standard error. For an enrolled label, the line names the account’s email.
Claude Code then opens your browser. Once you sign in, Pitboard prints:

use

use parks the login the label’s tool has stored and puts the account’s parked login in its place. Where nothing is signed in to Claude Code or Codex, as before its first sign-in, it puts the account’s login where the tool reads it and parks nothing. A Claude Code login whose refresh token Anthropic refuses for good no longer works, and cannot be parked. use says why, and asks before it puts the account’s login in its place, which loses nothing. use never asks about a login Anthropic will not name, an account on hold, or when Anthropic cannot be reached. Before anything moves, use refuses with a code from Accounts and labels, Parked logins, Switching, Claude Code and Codex files or Claude Desktop. For the account in use, use moves no login and prints work is already signed in. Where Claude Code’s config names another account, use writes work there and adds Claude Code's config named another account, and now names work. The --json field config_updated is then true. After a switch, use prints Switched to work; personal is parked. and a second line: A switch where nothing is signed in parks nothing. Its first line names the tool, such as Switched Claude Code to work. or Switched Claude Desktop to desktop/work. Open sessions explains both Claude Code lines. After a switch, use can warn sessions_still_running, sessions_unknown, written_on_the_command_line, login_taken_as_named, set_aside or login_item_gone. Warning codes gives each.

forget

forget drops the account from Pitboard’s list and deletes what Pitboard keeps for it: Pitboard does not revoke the login it deletes: see SECURITY.md. For a Claude Code or Codex account, the app deletes its window data, sign-in included, at its next read of the accounts. Website data has the rules. forget refuses the account in use with cannot_forget_active_account. Where Pitboard cannot identify the login in use, it also refuses the account last in use, or one with no parked login, with the code of what stopped it, such as identity_unverifiable or app_open. While a Claude Desktop move waits, forget refuses every Claude Desktop account with the code that stops settling the move, such as app_open or recovery_undetermined. At a terminal, without --yes or --json, forget asks on standard error: Anywhere else it needs --yes, and refuses with confirmation_needed without it. A label that names no account fails with its own error instead. The account in use needs --yes too, and then fails with cannot_forget_active_account. Questions before deleting says when it asks and what each answer does.

rename

rename changes only the label. The account keeps what Pitboard holds for it, such as its parked login, usage reading, account window or folders set aside. It stays in use if it is. A rename stays inside the account’s tool: pitboard rename codex/work job gives codex/job. Accounts and labels lists what rename refuses.

warm

Warm up accounts says what a warm-up sends and when Pitboard holds back. The app and pitboard watch warm up the accounts turned on; warm itself never runs by itself. warm on and warm now refuse a Codex or Claude Desktop account with warm_up_unsupported. warm now refuses an account with nothing to start, with the code of the reason, such as limit_used_up:
warm now prints personal's 5-hour period runs already, until 22:50. and changes nothing while the period runs.

watch

watch switches Claude Code only. Switch before an account runs out gives the rules it follows. It also warms up the accounts warm on turned on, as Warm up accounts describes. With --no-switch, it never switches. It runs in the foreground until you press Control-C, whatever the app’s When a limit reaches setting says. The watch service runs it in the background instead. While it runs, watch:
  • Reads every account when it starts and every 5 minutes, as often as How often Pitboard asks allows.
  • Decides again as soon as another run writes the account list or the usage readings.
  • Decides at least every 30 seconds.
On standard output, each line but the first starts with the local time, such as 14:02:11. A limit of one model is named with its model, as in 97% of its weekly Opus limit. Three reasons end the line in their own way: watch names the account it watches whenever its last line said something else. Until the next switch, it prints each reason, wait and error code once. A warning also comes once, on standard error, with the line of the decision that found it. A switch or a warm-up that fails prints its error on standard error, as pitboard use would, and watch goes on. Automatic switching says what ends each reason and how long Pitboard waits after a failure. watch ends with the error’s exit status where a change fails with elevated or system_too_old. It also ends on an error in The Pitboard directory while deciding whether to switch. No warm-up error ends it. With --once, watch prints only the line of one decision, with no start line or time. It may still ask Anthropic to identify Claude Code’s stored login, and a switch checks the parked login as use does. It exits 0, or with the error’s status. With --json, watch prints one line of JSON per event. Watch events lists the fields.

The watch service

The service starts at each sign-in and runs watch with the --at, --order or --no-switch that install was given. Its first line ends Stop it with `pitboard watch uninstall`. in place of Stop with Ctrl-C. On macOS, its lines go to ~/Library/Logs/Pitboard/watch.log, and on Linux to your user’s journal. On Windows, nothing keeps them. pitboard log records each switch and warm-up either way. Watch service lists where each system keeps it. On Linux, your user’s systemd runs the service from your first sign-in to your last sign-out. To keep it running with nobody signed in, as on a server, run loginctl enable-linger, as loginctl(1) says. Where watch ends on an error or a crash, macOS and Linux start the service again a minute later. On Windows, it starts again at your next sign-in, or with pitboard watch install. After you update Pitboard, the service runs the updated pitboard from your next sign-in, or at once after pitboard watch install. On Windows, Scoop and WinGet cannot update a pitboard.exe the service is running: scoop update skips it, and winget upgrade fails. Run pitboard watch uninstall before you update, and pitboard watch install after. install follows the rules of schedule install:
  • It watches the accounts in Pitboard’s own directory, whatever PITBOARD_HOME it is given. While PITBOARD_HOME names another directory, install refuses with schedule_not_default_home.
  • On Linux, it refuses with schedule_manager_elsewhere where your user’s systemd would not read the service, or would run it with another HOME.
  • It gives the service each proxy variable it was started with. Run install again after your proxy changes.
  • Where Pitboard may change nothing, it refuses with elevated or system_too_old.
On Linux, uninstall takes the service away only once systemctl has stopped it, even where nothing answers for your user’s systemd, as in a shell from su: one left running would write Pitboard’s directory again. It refuses with schedule_manager_elsewhere while systemd runs another HOME. The app and the service can both switch Claude Code: as with pitboard watch in a terminal, they never make two switches from one reading.
On Windows, the second line is the task’s path, such as \Pitboard\Watch S-1-5-21-….