Skip to main content
With --json, every command prints one line of JSON on standard output, whether it succeeds or fails. pitboard watch prints one per event.

The envelope

It prints this on one line:
integer
required
The envelope’s version, 1. Pitboard adds fields and codes without changing it. A release that renames or removes a field or a value says so in the changelog, in an entry marked Breaking.
string | null
required
The command that ran, such as rename. pitboard alone gives status, the three schedule commands give schedule, vault and its commands give vault, watch install, status and uninstall give watch, and completions and manpage give generate.
boolean
required
true when the command succeeded and exits with status 0. Exit codes lists the other statuses.
object | null
required
What the command found or did, as Data by command lists. null when the command failed. doctor and generate keep it when they fail.
object[]
required
One object per warning, with code and message, or an empty array. A change that failed still lists the warnings it found first. Warning codes lists the codes.
object | null
required
Set when ok is false, and null otherwise.
These failures have a shape of their own: In the last two rows, error has no cause field. Every byte is ASCII. Pitboard writes a character outside ASCII as a \u escape: the label Đạt comes out as \u0110\u1ea1t. A character beyond U+FFFF becomes its UTF-16 surrogate pair. Times are Unix times in seconds, such as 1790474400. In log entries, at is a local time instead, such as 2026-09-22T01:01:00+07:00.
Only doctor --json hides email addresses and account ids, behind placeholders such as <email 1a2b3c4d>. Email addresses appear in the output of status, enroll, forget, rename and watch, and in error messages such as label_taken. status also prints account ids. repair prints parked login names, and each name holds an account id.

Data by command

In the order of pitboard --help: A Claude Desktop account has no email address, so email is empty wherever one of its accounts appears. adoption says how each tool takes up a switch, as Open sessions explains:

Moves given up

Each object in the moves_given_up of abandon:

Doctor environment

The environment of doctor. It is {} where a variable naming a folder is empty or relative.

Status data

For Codex and Claude Desktop, the account in use is the object in accounts with that provider and signed_in set to true. Each object in accounts: Which expiries parked gives depends on the tool. A time is null where it is unknown. source is live when Pitboard asked the service this time. It is remembered for the last reading Pitboard recorded, from the command line, the app or a Claude Code status line. Each object in windows is one limit: Each object in awaiting:

Watch events

Each event’s envelope has command set to watch. With --once, watch prints one event. The data of every event has event. Every event but the warm-up ones also has threshold, the share it switches at, such as 95. With --no-switch, threshold is null. The other fields: For switched, reason is limit, where a limit of from reached the share, or resets_first, where to comes first by its week before the share. For skipped and not_watching, Automatic switching lists the codes. For warm_up_held, reason is one of these: For warm_up_halted, reason is one of these: When it holds back says when each ends. A warm-up that came to nothing prints an envelope with ok set to false and its error, once for each reason until that account warms up. An error prints an envelope with ok set to false, and watch goes on. An error that ends watch prints the same, and watch exits with its status. watch says which errors end it, and what it prints only once. A switch prints this on one line: