Sign in

CLI reference

Every prized command, flag, JSON shape, and exit code, on macOS, Linux, and Windows.

On this page26

Commands

Add --help to any command. With --json, every non-interactive command prints exactly one object, {"ok": true, ...} with the payload inline on success; failures and exit codes are under For agents and scripts.

prized help names the three commands that get you started, then lists every command with a line each, and prized help <command> (or prized <command> --help) prints one command's flags and examples.

Sign in and set up

prized login opens the dashboard to make an API key for this machine, stores it in ~/.config/prized (%LOCALAPPDATA%\Prized on Windows), sets up your SSH identity, and registers this machine's device key (Claude Desktop remote); with no config yet and exactly one box on the account, it also connects that box. With no box, it points at prized setup in a project folder, which starts one. Signing in this way, through the browser, also gives a new workspace's owner the free credit; signing in with --token does not. Flags: --token (an API key from the dashboard or a single-use install token; the only form --json accepts), --token-stdin, --url. JSON: {"ok": true, "email", "workspace", "boxes", "box", "url"}, plus keyExpiresAt for a dashboard key that expires. The key prized login makes never expires while the machine uses it; after 180 days unused, commands exit 8 with this API key has expired and you sign in again (When a key expires).

With no box, login also names prized sandbox create: a sandbox needs no box.

Your saved sign-in is tied to the control-plane address you authenticated with. Changing [controlplane].url, --config, or PRIZED_CONFIG does not authorize sending it to another address. If the CLI reports a different control-plane origin, check the URL before signing in there; older saved sign-ins work only with Prized's production service until you sign in again.

prized start is what npx prized runs: the sign-up in this terminal, a box, where you work, and this machine set up. Already signed in, it points you to prized setup, and to the folder of a setup that stopped part-way.

prized setup [PATH] sets this machine up for your box and is safe to re-run: a repairing health check, the project (copied to the box once unless you pass --sync), your environment, the agents, and a detached session. prized setup auto skips the auto-or-manual question (Quickstart). With no box on your account yet, setup offers to start one first, at the size your balance runs comfortably, and connects it once it runs; -y and prized setup auto start it without asking; --non-interactive and --json never start one (they exit 5; prized box new --wait starts and connects one).

If signing in, connecting the box, or the health check stops setup, the error ends with the command that picks it up. For a week, a plain prized setup in the same folder picks it up too, with the same project, when the destination is still the same. If you changed the selected box or server, rebound the box name, or setup cannot confirm an older saved destination, the bare command stops before applying saved choices. Check the selected box and give the project and options explicitly to start a new run. If the box itself stops answering, setup waits up to five minutes for it instead of stopping.

FlagMeaning
--project, --no-projectThe project to put on the box (a name or a path), or none.
--syncKeep the project in sync with the box, in place; without it the folder is copied once and nothing syncs.
--copy, --copy-once, --cloneCopy and keep syncing, copy once without asking, or git clone on the box. Public GitHub repos need no sign-in (Sync).
--mergeMerge into an existing folder on the box instead of refusing.
--env, --env-secrets, --env-data, --no-envThe environment groups to bring; data is never covered by auto or -y.
--env-workers NEnvironment items installed at once (default 8); 1 installs them in order.
--agent NAME, --no-agents, --saveAgents to hand off (claude, codex, cursor, chatgpt); --save records the pick.
--gh, --no-gh, --install-cursorThe GitHub token and git identity; Cursor's installer.
--start, --no-start, --attach, --no-attach, --session NAMEThe agent's detached session. In a terminal (not a CI job), setup ends by asking to open it here; --attach opens it without asking, --no-attach prints the command instead.
--box NAMEThe box to set up; one other than the default gets its own config and daemon (Several boxes).
--dry-run, --non-interactivePrint what a run would do and change nothing; never prompt.
--no-sshSet up without OpenSSH (below). Automatic when this machine has no ssh client.
--signup IDFinish what a terminal sign-up started (its box, mode, and app); npx prized passes it.

JSON: {"ok": true, "steps": [{"id", "status": "done|skipped|failed", "duration"}], "state": "READY|DEGRADED", "env", "agent": {"name", "running", "command"}}; agent is the agent the run would offer and the command that starts it or, when it runs already, opens it; running is true when this run started or found its session; absent when there is no agent to offer.

Paste setup's printed command, or agent.command, as shown, including its quotes: project folders with spaces or punctuation stay one argument. On Windows, use PowerShell for that command.

prized init adopts a box on your account (config, SSH stanza, daemon); login and setup run it for you. If the config it would write is already there, it exits 6, unless --box NAME (or PRIZED_BOX) names the box that config already connects: then it says so and exits 0 (JSON {"ok": true, "box", "user", "alreadyConnected": true}). Flags: --box NAME (another box, with its own boxes/<name>.toml and daemon), --force (make it the default instead, rewriting config.toml after a backup; refused for a box with its own file), --user NAME, --no-daemon, --non-interactive.

prized env scan|plan|migrate runs the environment step alone: list what your machine has, print the questions, apply them. Flags: --project PATH, --advisor/--no-advisor, --non-interactive (Bring your environment).

Setup without ssh

A coding agent's container often has no ssh client, or one that looks for its keys in another home folder than $HOME. Setup then does every step over Prized's own connection instead: it connects the box, copies the project once (or clones it with --clone), brings your environment, signs your agents in, and starts the agent's session. It says so before the steps, and the JSON adds "transport": "tunnel". It goes this way:

  • with --no-ssh;
  • on its own, when this machine has no ssh client in a system directory (to use one elsewhere, set bin under [ssh] in the config), or the ssh that bin names is not there;
  • on its own, when nobody can answer it (no terminal, --non-interactive or --json) and ssh could not reach the box, or the health check failed only on ssh, sync or the daemon.

Without ssh, nothing syncs: --sync, --copy and --attach are refused. The health check is skipped, since it checks ssh, sync and the daemon. --dry-run plans the same. To put the agent to work, setup prints a prized prompt command, which needs no ssh; agent.command in the JSON is that command. prized exec runs commands there without ssh too, in the foreground.

prized setup --no-ssh --json --non-interactive --copy-once . --agent claude

Box lifecycle

Every action also works from the dashboard; what each does is on Boxes.

  • Naming a box. BOX is a hostname (mango), a box id, current (the last box this machine created), or self (the box the command runs on); omitted, it is the box you set up. An unknown name exits 5 and lists your boxes.
  • Sizes. Tier id or public name: nano (Nano), micro (Micro), lite (Extra Small), flow (Small), pro (Medium), max (Large), ultra (Extra Large); prices on Billing. Until a plan is live, the free credit allows Nano through Small, one box at a time: a bigger size exits 5, a second box exits 6.
  • Windows. --ttl and --auto-pause take a duration with a unit: 45m, 4h, 1h30m, 2d.

box new

prized box new                         # a fruit name, the size your balance runs comfortably
prized box new mango --size Small --ttl 4h --auto-pause 45m --wait

Returns as soon as the control plane has the box, which becomes current (Boxes: Create).

FlagMeaning
NAMELowercase letters, digits, and hyphens, starting and ending with a letter or digit, up to 32 characters; an _ you type becomes - (Several boxes).
--tier, --sizeThe size; either name works.
--ttl WINDOWA pause deadline, 5m to 30d from now.
--auto-pause WINDOW|offIdle auto-pause, 30m to 7d, or off; if absent, off on a plan and 2h on the free credit or deal credit. On the free credit, off or a window over 12h runs as 12h until a plan or a top-up.
--environment NAMEApply a saved environment at first boot, by name or env_ id.
--from-snapshot IDRestore a snapshot into the new box, at the snapshot's size.
--region REGIONWhere the box starts, by AWS id or name (Regions); us-west-2 (Oregon) by default. With --from-snapshot, a move after first boot.
--storage TYPEinfinite keeps the box's files in infinite storage (Extra Small and up, in a region that offers it, not from a snapshot); standard is the box's own disk, the default; a control plane without infinite storage fails the create, naming the box it made.
--waitPoll until the box is running (5 minute budget), then print the prized ssh line; on a machine with no config yet, connect the box here first (below).

On a machine with no config yet (you signed in before your first box), --wait connects the new box here, as prized login does an account's one box: config, SSH alias, daemon; without --wait, it prints prized setup --box NAME, which connects the box once it is running. A config already in place is never rewritten; with one for another box, --wait also prints prized setup --box NAME to connect this one beside it. With --json, --config or --box, nothing is connected.

Exit 6 (CONFLICT): a taken name, the box count, or a balance that cannot run the box. Exit 5: a size not on your plan, a bad name, a window out of bounds, infinite storage the box cannot have, or the box create limit (the message says when to retry).

The rest of the box group

Each prints {"ok": true, "box": {...}} with the box object unless noted.

CommandWhat it does
box ls [--all] [--filter STATES] [--names]NAME, STATE, SIZE, REGION, AUTO-PAUSE, PAUSE-AT, CREATED; --all adds terminated boxes. JSON: {"boxes"}. --names prints only a bare JSON array of names, like ["mango"] ([] when none), even with -q; it replaces --json (both together exit 2).
box info BOXState, size, region, tunnel IP, login user, disk, pause settings, last vitals, last eight events. JSON adds events and pausesSurvived.
box pause BOX, box resume BOX [--wait]Aliases stop, wake (Pause and resume); --wait polls until running, first waiting out a pause that is still finishing. Idempotent; a resume the balance cannot cover exits 5.
box delete BOX [-y] [--missing-ok]Deletes the machine and its disk; for 7 days its last state can usually be restored (Data retention). Asks you to type the name; --json needs -y (exit 2 without). --missing-ok exits 0 with a note on stderr when the box is not on your account or already deleted; JSON is then {"ok": true, "missing": true}, with no box.
box rebind BOXBinds a name's ssh alias to the box that has the name now. After a box is recreated or its freed name taken, ssh BOX and the prized commands refuse the name until you rebind.
box rename BOX NEW-NAMERenames the box (Renaming a box); an _ in NEW-NAME is read as -. Moves this machine's setup to the new name at once, or once the sessions open through its daemon end. A name another box has exits 6, and a rename that would cut off a machine on an older CLI exits 5 with the count. JSON adds from, to and, when the name changed, local (what moved here; local.waiting is true while it waits). Needs v0.21.12 or later on every machine that uses the box.
box resize BOX SIZE (or prized resize SIZE)Restarts the box at the new size (Resize). Refusals exit 5. JSON adds from, to.
box move BOX REGIONMoves the box (Regions); desiredRegion is set at once, region changes when the move lands.
box extend BOX --ttl WINDOW | --no-deadlineSets, replaces, or clears the pause deadline; setting one needs a running box (exit 5), clearing always works.
box auto-pause BOX WINDOW|offSets the idle window (30m to 7d, or bare minutes) or switches it off. On the free credit, off or a window over 12h runs as 12h until a plan or a top-up.
box auto-snapshot BOX --every 6h|off [--keep 5]Sets or clears a snapshot schedule: every 1 to 168 hours, keeping 1 to 10.

The box object

{
  "id": "5d0a…", "hostname": "mango",
  "observedState": "running", "desiredState": "running",
  "tier": "flow", "instanceType": "m6a.xlarge",
  "region": "us-west-2", "desiredRegion": "us-west-2",
  "loginUser": "hudson", "boxIp": "10.77.3.1", "diskGb": 100,
  "autoPauseMin": 45, "pauseAt": "2026-09-01T18:30:00Z",
  "lastHeartbeatAt": "2026-09-01T15:17:52Z", "createdAt": "2026-08-29T12:00:00Z",
  "runningSince": "2026-09-01T09:02:11Z",
  "vitals": {"cpu_pct": 12, "mem_pct": 41, "disk_pct": 63, "idle_for_sec": 720},
  "syncOffReason": null, "syncOffAt": null
}

boxIp is the box's address inside its own private tunnel. It is not unique: two boxes can show the same one, so identify a box by id or hostname. autoPauseMin, pauseAt, diskGb, lastHeartbeatAt, and vitals are null when unset or unknown. syncOffReason and syncOffAt are set while Prized has turned sync off for the box: the reason, and since when. runningSince is when the box last started, resumed or rebooted; it is null unless the box is running or degraded, and box ls --json and box info --json carry it. Timestamps are RFC 3339 UTC.

Terminal dashboard

prized dashboard

A full-screen view of your boxes in the terminal (aliases dash, top; prized dashboard BOX selects that box first): every box with its state and vitals (yours first, your teammates' folded under Team) and, for the one you select, live CPU, memory and network charts, its processes, ports, sessions, disks and recent events. A paused box shows its history and is never woken by selecting it. Click a box, a tab, or a button at the bottom, or use the keys:

KeyWhat it does
↑ ↓ (or j k)Select a box
Enter (or s, or double-click)Open a shell on the box (prized ssh); on the Sessions tab, attach the selected session. A paused box asks before it wakes. Exit the shell to come back
p, rPause (after you confirm) or resume the box
oOpen the box in the web dashboard
1 2 3Chart history: 15 minutes, 1 hour, 24 hours
/Filter boxes by name
tShow or hide your teammates' boxes
?Every key
qQuit

Shell actions stay bound to the selected box’s ID, including after a wake confirmation. If that box was deleted and another box reuses its name, the shell is refused instead of connecting to the replacement. Refresh the fleet and deliberately select the box you want.

If the live-stats address is not trusted, the dashboard shows live address not trusted instead of live charts and does not send your login token there; the box list and history still work.

It needs a terminal at least 60 columns by 15 rows; box ls is the plain list for scripts.

Sandboxes

prized sandbox (alias prized sbx) runs Sandboxes (beta) from the terminal: short-lived machines your code and agents create, billed per second. It needs prized v0.21.0 or later, v0.21.9 for background commands, and v0.21.10 for a port's --token, --public and --private (prized update upgrades an older one). On a new machine, install it, then open a new terminal so prized is on your PATH (Windows: install line):

curl -fsSL https://prized.dev/install.sh | sh

Every command uses the API key in PRIZED_API_KEY when it is set, so CI and agents need no login, and your prized login otherwise. Get a key from the Sandboxes quickstart. sandbox ssh is the exception: a shell opens with your prized login only (a program with a key uses SSH access).

PRIZED_API_KEY goes only to Prized or to a control plane on this machine: a config's [controlplane].url, from whichever file --config or PRIZED_CONFIG selects, cannot send it anywhere else. For a key made on another control plane, set PRIZED_API_KEY_ORIGIN to that control plane's address, such as https://cp.example.com; the key then goes only there.

ID=$(prized sandbox create --template prized-agent-v1)
prized sandbox exec $ID -- "python3 -c 'print(6 * 7)'"
prized sandbox rm $ID
CommandWhat it does
sandbox create [--template ID] [--vcpu N] [--memory GB] [--disk GB] [--env K=V] [--label K=V] [--max-runtime W] [--auto-pause W] [--auto-delete W] [--no-wait]Creates a sandbox from prized-base-v1 unless --template names another, waits until it is running, then prints its id alone on stdout (progress goes to stderr). --memory is in GB, or MB with m (1536m); the shape must fit the template's range (sandbox templates). --env variables reach every exec command (not a sandbox ssh shell). --max-runtime is how long it runs before it is deleted: on a paid plan 24 hours unless set and up to 7 days, starting again at each resume; on the free tier 60 minutes of running at most, paused time not counted. --auto-pause pauses it after that long with no command or file copy, --auto-delete deletes it after that long paused. Windows take a unit (90m, 2h, 1d) or bare minutes; off turns --auto-pause or --auto-delete off. --no-wait prints the id at once. Ctrl-C before it prints creating ID deletes the sandbox it had started, and says so (or names one it could not delete); after, the sandbox stays (sandbox rm ID).
sandbox ls [--label K=V]ID, STATE, TEMPLATE, VCPU, MEMORY, DISK, LABELS, CREATED, EXPIRES; deleted sandboxes are left out. --label lists only those carrying it (repeatable: all of them). On the free tier, a sandbox deleted at its run limit in the last 7 days is named under the list, on stderr, with what lifts the limit; sandbox get, exec and rm of its id say so instead of "no sandbox". JSON: {"sandboxes"}, and "ended" and "endedTotal" for those.
sandbox get IDOne sandbox: state, template, shape, labels, when it is deleted, its run time, and timers.
sandbox exec ID [--cwd DIR] [--env K=V] [--timeout D] -- CMD...Runs one command under a shell in the workspace (/home/prized/work; a relative --cwd is under it) and exits with its code. The words after -- are joined into one shell command, as ssh does, so quote what that shell should see. stdout and stderr arrive when the command ends, up to 4 MB each. A paused or still-starting sandbox is resumed or waited for first, usually with nothing printed; a long wait adds progress lines to stderr (-q drops them). --timeout is the command's limit, 5m unless set and 1h at most; a command that runs out exits 124. For longer than an hour, or to read the output as it runs, use --detach (background commands). JSON: {"sandboxId", "exitCode", "stdout", "stderr", "durationMs", "timedOut"}.
sandbox exec ID --detach [--cwd DIR] [--env K=V] [--timeout D] -- CMD...Starts the command in the background and prints its process id (p_ and 12 hex digits) alone on stdout, with progress on stderr. It keeps running after the CLI exits. --timeout is its limit: none unless set, 168h at most. JSON: {"sandboxId", "process"}; the id is process.processId.
sandbox exec ID --psID, STATE, STARTED, COMMAND for each background command, newest first, ended ones included. STATE is running, exit N, killed (SIGNAL), or lost (the sandbox restarted under it). JSON: {"sandboxId", "processes"}.
sandbox exec ID --status PROCESS_IDState (timed out when its limit stopped it), start time, limit, and the end of each output stream, not all of it. Exits 0 whatever the process's own exit code. JSON: {"sandboxId", "process"}, with stdout, stderr, and stdoutTruncated and stderrTruncated saying a stream was cut.
sandbox exec ID --logs PROCESS_IDPrints what the process has written so far, stdout to stdout and stderr to stderr, and returns. Not for --json.
sandbox exec ID --follow PROCESS_IDPrints everything the process wrote, from the start, then the rest as it arrives, until it ends; exits with the process's exit code. Not for --json.
sandbox exec ID --kill PROCESS_IDStops it: SIGTERM, then SIGKILL 5 seconds later. Says stopped PROCESS_ID (TERM), or PROCESS_ID had already ended, on stderr, and exits 0 either way. JSON: {"sandboxId", "processId", "wasRunning", "signal"}.
sandbox ssh ID [-s SESSION] [--raw] [-- CMD...]Opens a shell in the sandbox as prized, in a tmux session (-s, default [ssh].default_session) that survives a dropped connection: run it again to land back in it. --raw is a plain shell; on a template without tmux you get a plain shell and a note. A paused sandbox is resumed first. The words after -- run as one command over ssh, exiting with its code. The shell starts in /home/prized, without the sandbox's --env variables. It works on sandboxes created after shells became available (an older one says to create a new one). It uses your prized login, never PRIZED_API_KEY; the connection carries a terminal and nothing else (no port or agent forwarding; SSH access carries ssh -L). While it is open the sandbox counts as in use, so it does not auto-pause. Not for --json.
sandbox cp SRC DSTCopies one file of up to 100 MB; the sandbox side is ID:PATH, relative to the workspace, or ~/ for the home. A directory as DST takes the file under its own name, and a file it replaces keeps its mode; - is stdin or stdout. A local symlink or hard link named as SRC is refused, as by prized cp: name the file it points at, or copy it to a new name first. JSON: {"sandboxId", "direction", "from", "to", "bytes"}.
sandbox pause ID [--wait]Keeps memory, processes, and disk, and bills storage only.
sandbox resume ID [--no-wait]Waits until it is running again. exec and cp resume a paused sandbox on their own.
sandbox extend ID --by WAdds W to a running sandbox's run time (90m, 2h, 1d), anytime once the workspace has paid in; on the free tier it adds no time. It never shortens it, your plan's maximum caps it (the output says when), and a retry adds the time once. JSON: {"sandbox", "capped"}.
sandbox timeout ID [--at TIME] [--in W]Sets exactly when a running sandbox is deleted, earlier or later (on the free tier, only earlier); give one of the two: --at an RFC 3339 time (2026-11-02T18:00:00Z), --in a window from now. Past your plan's maximum it exits 6 and names the latest time allowed.
sandbox fork ID [--count N] [--label K=V] [--max-runtime D] [--no-wait]N live copies of a running or paused sandbox, files, memory, and processes included (a paused parent stays paused); prints their ids, one per line, once each is running. Copies keep the parent's labels unless you pass --label, which gives them only the labels you pass (repeat any of the parent's you still want). On a paid workspace each copy lives the parent's runtime from the fork, or --max-runtime (up to the workspace's maximum); on the free tier copies keep the parent's deletion time, and a warning on stderr says when that is under 10 minutes away. A fork is all or nothing: if a copy cannot start, every copy is deleted, and it prints no ids and exits 6 (no room) or 5, naming the copy and why. JSON: {"fork", "sandboxes", "warning"?}.
sandbox port ID PORTPrints the https URL PORT of the sandbox answers at, alone on stdout (URL=$(prized sandbox port $ID 3000)). A request to it needs your API key in the Prized-Key header, and wakes the sandbox when it is paused (Preview a port). JSON: {"sandboxId", "port", "url", "header"}.
sandbox port ID PORT --token [--expires D]Prints the port's prized.link URL with a token in it, which opens the port with no header for an hour by default (--expires from 1m to 24h): in a browser tab, or for a WebSocket, EventSource or program you hand one port. It never wakes a paused sandbox, and needs a workspace that has paid in. JSON: {"sandboxId", "port", "url", "browserUrl", "token", "expiresAt"} (url is the same token on the p.prized.dev URL).
sandbox port ID PORT --public [--expires D]Makes the port public: anyone with the URL reaches it, with no key, for 7 days by default (--expires from 5m to 30d); owner only, on a workspace that has paid in. Prints the port's prized.link URL, which opens in a browser. JSON: {"sandboxId", "port", "url", "browserUrl", "public", "publicExpiresAt"}.
sandbox port ID PORT --privateMakes a public port private again: the key or a token is needed once more. JSON as --public.
sandbox rm ID...Deletes sandboxes for good, with no prompt. JSON: {"sandboxes"}, the ones deleted.
sandbox rm --label K=VDeletes every sandbox carrying the label (repeatable: all of them), with no prompt; running it again, or matching none, is not an error (Labels). JSON: {"count", "ids"}.
sandbox templatesEach template's default shape, the range create accepts, and its default lifetime. JSON: {"templates"}.

Sandbox SSH supports spaces, apostrophes and percent signs in your local home folder. It refuses home paths containing double quotes, literal backslashes on macOS/Linux, line breaks or ${ before creating SSH files or waking the sandbox. Normal Windows path separators are supported.

create, get, pause, resume, and timeout print {"ok": true, "sandbox": {...}}:

{
  "id": "sbx_3f9c0a1b2d4e5f60", "state": "running", "template": "prized-base-v1",
  "resources": {"vcpu": 2, "memoryMb": 4096, "diskGb": 10},
  "labels": {"job": "ci-42"}, "autoPauseMin": 10, "autoDeleteMin": null,
  "expiresAt": "2026-10-14T10:00:00Z", "maxRuntimeMin": 1440, "createdAt": "2026-10-13T10:00:00Z", "lastActiveAt": null,
  "errorReason": null, "toolboxBase": "https://term.prized.dev/v1/sandbox/sbx_3f9c0a1b2d4e5f60"
}

state is one of starting, running, pausing, paused, resizing, deleting, deleted, error. expiresAt is when it is deleted; it is null while the sandbox is paused (from a few seconds after paused), since the clock stops. On a paid plan each resume sets it maxRuntimeMin minutes on, up to the workspace's maximum then; on the free tier a resume carries on the time left. Exit 6 (CONFLICT): a sandbox limit or an empty balance; on free credit a limit is the free tier's, and the message says so and links the top-up that raises it. Exit 5: a workspace without sandboxes, an unknown template or id, a shape outside the template's range, a workspace on hold, or a refused fork. Exit 8 (AUTH): no login and no PRIZED_API_KEY, the key was rejected or has expired, or the config names a control plane the key does not go to. A set PRIZED_API_KEY is used instead of your login, so when it is the one rejected, replace it or unset PRIZED_API_KEY; prized login alone does not help.

Background commands

Start a command with --detach, then come back to it by process id, from this terminal or another machine. With ID a sandbox that holds train.sh:

P=$(prized sandbox exec $ID --detach --timeout 2h -- ./train.sh)
prized sandbox exec $ID --follow $P
  • Start. --detach returns at once. The command runs as exec runs it (--cwd, which must exist, and --env), keeps running after the CLI exits, and keeps its output on the sandbox's disk. Past --timeout it gets SIGTERM, then SIGKILL 5 seconds later; the sandbox's own run time ends it too. If --detach fails or times out, check --ps before you run it again: the command may already be running.
  • Read. --follow exits with the process's exit code: 143 after a --kill, 124 when its --timeout stopped it, 1 when the sandbox restarted under it and left no code. Run it again at any time and it starts over from the beginning; Ctrl-C stops the reading, not the command. --logs and --follow write the process's stdout to your stdout and its stderr to your stderr, so their order is lost (redirect 2>&1 in the command for one ordered stream), and take no --json.
  • Wrong id. An id the sandbox does not know exits 5 (--ps lists them); one that is not a process id exits 2.
  • Auto-pause. A paused sandbox is woken first, as for exec, and a --follow that stays attached keeps it awake. With an --auto-pause window set (off unless you set one), a background command alone does not: the sandbox pauses after that idle time with the command frozen, and carries on at the next resume. With auto-pause off nothing pauses the sandbox for being idle, and --keep-awake is accepted; with an --auto-pause window set, --keep-awake is refused with exit 6 on the current templates.

Snapshots

CommandWhat it does
prized snapshot create BOX [--name NAME] [--description TEXT]Snapshot a disk without stopping the box.
snapshot ls [--box BOX] [--kind KIND]List snapshots.
snapshot restore SNAPSHOT [--name NAME] [--tier SHAPE]Launch a new box from a snapshot.
snapshot delete SNAPSHOTRetire a snapshot.
prized fork BOX [--name NAME] [--tier SHAPE] [--keep-snapshot] [--wait]A new box from a copy of a running box's disk.

Behaviour, kinds, and limits: Snapshots.

Environments

prized environments (alias envs) manages what a new box inherits: ls, info, new, default, rm, set, set-var/rm-var, set-file/rm-file, add-repo/rm-repo, upgrade. Every command and its JSON: Environments.

Secrets

prized secrets controls who may use a workspace secret and shows what it was spent on; values are set and rotated in the dashboard or the API, not the CLI (Scoped secrets).

CommandWhat it does
secrets ls [--box BOX]NAME, SCOPE, HOSTS, MOUNTS, ROTATED; with --box, only what that box may mount.
secrets grant NAME --box BOX | --member EMAILMake the secret available to one box, or to every box a member owns; the first grant narrows a workspace-wide secret to its grants.
secrets revoke NAME --box BOX | --member EMAILTake a grant back; the box loses the secret within seconds. Revoking the last grant makes the secret workspace-wide again.
secrets grants NAMEWho has it: KIND, TO, SINCE.
secrets usage NAMEWhich boxes spent it against which hosts: BOX, HOST, FIRST, LAST, COUNT (a floor).

grant and revoke take exactly one of --box and --member (exit 2 otherwise); an unknown secret, box, member, or grant exits 5; a 409 exits 6. JSON mirrors the columns.

Connect

prized ssh [BOX] [SESSION] [-- CMD...] attaches to a persistent tmux session (waking a suspended box) and forwards a non-default box's ports while connected (Sessions). If the box itself stops answering, it says so and, in a terminal, waits up to five minutes for it. Flags: -s, --session NAME (default main), --ls, --kill NAME (asks unless -y), --raw (no tmux), --no-forward, --no-drop-upload, --no-clipboard (Copy out). With -- CMD it runs that one command instead, sharing the box's connection the way prized exec does, but on the box's system PATH with no login shell, so what prized setup installed (Node, uv, Go) is not found there; prized exec finds it.

Interactive forms reject --json (exit 2); once connected, the exit code is ssh's or the remote command's. JSON: --ls {"sessions": [{"name", "windows", "created", "attached"}]}, --kill {"killed"}.

Every command that uses SSH runs the OpenSSH client from the system directories (/usr/bin, or System32\OpenSSH on Windows), never one on PATH; name another with bin = "/path/to/ssh" under [ssh] in the config.

prized mosh [BOX] [SESSION] is the same session over mosh (installed locally; not on Windows yet), with -s, --raw, --no-forward, --no-drop-upload. prized herdr [BOX] [SESSION] lands in herdr instead of tmux, installing it on the box the first time. prized up starts the box, reconnects everything from cold, and prints the status block; --resume resumes paused syncs, --wait-timeout (default 5m) bounds the wait. prized proxy BOX PORT[:LOCALPORT] forwards one box port to localhost until interrupted, including a server that listens only on the box's localhost.

Run commands and files

prized exec [BOX] [flags] -- CMD... runs one command on the box and exits with its code: --cwd, --timeout, and --env K=V shape the run, --detach returns an id (add --keep-awake to hold the box up until the process exits; this requires the box agent’s runs capability and refuses to start if support cannot be verified, fallback), and --status ID, --ps, --kill ID inspect or stop detached runs without waking a paused box. Runs back to back share one connection to the box, so after the first, each one starts without a new handshake. On a machine with no ssh client, one whose [ssh] bin is not there, or with --no-ssh, the foreground form runs over Prized's own connection, with your stdin connected as over ssh; --detach, --status, --ps and --kill need ssh. JSON: {"ok": true, "exitCode", "stdout", "stderr", "commandId"}. prized exec history [BOX] lists what ran and prized exec logs [BOX] ID [--stderr] [--offset N] [--follow] prints one command's output, from Prized rather than the box, so both work while it is paused (Command history); if the live-log address is not trusted, --follow says so and prints retained history instead. Terminal display neutralizes control characters while file and pipe exports keep exact bytes. --delete ID and --delete-all remove records. prized cp [-r] SRC DST copies files scp-style: box:path is a path on a box, :path one on your box.

Both are on Run commands and files, and both report what they did (never output or contents) to the audit log as a reported row.

prized exec history and prized exec logs need command history, which is not open to every workspace yet.

Desktop

prized desktop [BOX] opens the box's desktop in the dashboard and forwards its VNC port until interrupted; --no-open prints the vnc:// address and password, --stop ends it. prized browser [BOX] does the same with one Chrome window (--profile, --url). Starting either reports a desktop.start audit row (mode and profile, never the password); see Desktop.

Sync

prized sync add PROJECT | add --local PATH mirrors a folder between the box and this machine (Sync). Flags: --local PATH (your own folder, in place, instead of ~/Prized/<name>; never your home folder, a folder above it, a whole drive, or the folder drives mount in), --remote PATH (default ~/code/<name>), --name NAME, --prefer box|mac (default box), --mode MODE (default two-way-resolved), --ignore and --unignore, --create (make the remote folder), --paused, --merge (allow a non-empty local folder). With --direct or a stopped daemon, the add checks existing sync sessions too: an overlapping folder or an unreadable session list stops it before either project folder is created.

prized sync (or sync ls) lists sessions with state and problems, and says so when Prized has turned sync off for the box (each ls --json row then carries sync_off_reason, and resume is refused until it is back on); pause, resume, and flush take a name or --all (flush --timeout, default 60s); repair NAME recreates a halted session; rm NAME removes one (--delete-local, --delete-box also move the files aside). JSON: add {"project"}; ls {"projects", "degraded"?}; repair {"repaired"}; rm {"removed", "files": "keep|trash_local|trash_box"}.

Mount

prized mount [BOX] mounts a box in Finder from a background process and returns, macOS only (Mount); -f, --foreground serves from the terminal until interrupted. Flags: --dir PATH (default the home directory), --at PATH (default ~/Prized/boxes/<box>), --read-only, --mount-opt OPTS, --no-open.

prized unmount [BOX] stops a mount, background or foreground. JSON: mount {"box", "mountpoint", "pid", "detached", "log"}, plus "already": true for a box already mounted (the call then opens the folder); unmount {"box", "mountpoint", "unmounted"}.

Ports

prized ports ls lists the box's listeners and their mirror state; prized ports toggle PORT switches one mirror on or off (Ports). JSON: ls {"ports": [{"port", "label", "process", "state", "reason"}]}; toggle {"port", "state", "reason"}.

prized ports share PORT prints a link sharing the port with your workspace's members (the same link again for a shared port); --anyone and --public are not available yet. --anyone makes a link anyone who has it can open, shown once, and --public one anyone at all can open (owner only); --expires 7d sets how long either lasts, 5 minutes to 30 days, 7 days by default. --anyone or --public on a port shared with another audience replaces its link; with neither flag, a shared port prints its existing link. prized ports share alone lists the box's shared ports; prized ports unshare PORT stops sharing (Share a port). A bad port or flag exits 2 before any call; a port that is not shared, or a link Prized refuses (the free credit, the workspace's limit, your role), exits 5 with the reason. JSON: share PORT {"share": {"id", "boxId", "hostname", "port", "slug", "access", "url", "origin", "expiresAt", "createdBy", "createdAt", "openCount", "lastOpenedAt"}, "created", "replaced"}; share {"enabled", "linksEnabled", "shares": [...]}; unshare {"share", "revoked": true}.

Agents

CommandWhat it does
prized agents lsOne row per coding agent: installed and signed in here and on the box, MCP servers, where it runs; with none running, the command that starts one.
prized agents handoff [AGENT...]Copy the named agents' sign-in and MCP config to the box (--gh, --install-cursor); a Codex ChatGPT sign-in does not travel, so the box signs in through your browser instead and the result shows in your terminal.
prized agents browserGive Codex and Claude Code on the box a browser: installs Playwright MCP and Chrome there and registers the server with each (--agent, --headed, --cdp, --force, --remove); Agents.
prized agents run AGENTStart an agent detached in a tmux session (--session, --dir, --attach, -- ARGS); the remembered box is checked before waking a paused box, and opencode and pi are installed on it if needed (JSON adds installed). For claude or codex on a box with no sign-in for it, at a terminal it offers to copy this machine's Claude Code sign-in or to sign Codex in through your browser here (JSON adds signed_in and waiting_for, and sign_in_copied after a Claude Code copy).
prized teleportMove this folder's Claude Code conversation to the box mid-task and resume it there in tmux (--wait, --id, --session, --no-attach, --force, --sync-env); inside Claude Code, ! prized teleport. JSON: {"id", "box", "session", "dir", "files", "bytes", "reattach", "url", "interrupted", "flags", "git_identity"} (git_identity: the git keys it set on the box); inside Claude Code {"id", "box", "session", "log"}, as the move finishes after it returns.
prized teleport backBring the folder's Claude Code conversation back from the box: stop it there, copy it here and resume it here (--id, --no-start, --force). Files come back through the folder's sync. JSON: {"id", "box", "dir", "files", "bytes", "resume", "interrupted", "flags", "started", "held"} (held: the shared Claude Code files, .claude/settings.json or .mcp.json, for which it did not start Claude Code, by their path from the conversation's folder, so a name can start with ../. A file is held when it changed while the conversation was away, is a link or in a linked folder, is over 1 MiB, is not a file, or has no earlier record to compare with and holds something. [] when nothing holds the start).
prized agent upgrade [--version V]Upgrade the box agent, which normally updates itself.

See Agents.

Prompt an agent remotely

prized prompt [BOX] --provider claude|codex|opencode|pi [flags] TEXT runs the box's coding agent headless on one prompt (- reads it from stdin) and follows its events until it answers. Flags: --model (amazon-bedrock/ID, openrouter/ID or deepseek/ID picks a backend), --effort low|medium|high (OpenCode takes it only with --model), --cwd, --continue (resume the provider's newest session), --queue (run after the run in progress), --detach (start and return the id), --auto (no approvals), --notify URL (one signed POST to an https URL on port 443 when the run ends; Webhooks). OpenCode and pi are installed on the box at their first prompt; a failed install exits 5 with the reason.

prized prompt models [--provider P] lists known --model values with their backend and efforts, without touching a box; JSON {"models": [{provider, id, backend, efforts, note}], "backends"}.

Each prompt is a turn of a conversation, and conversations run in parallel up to the box's limit: --new starts one (the default), --continue takes the provider's newest, --conversation ID a given one (--provider is required here too; box-side metadata never chooses it), and --queue waits behind the conversation's turn in progress. prized prompt conversations [BOX] lists conversations; prized prompt ls [BOX] [--conversation ID] lists runs; prized events [BOX] [--run ID | --conversation ID] [--follow] [--after N] shows a run, or follows every run in progress; prized interrupt [BOX] [--run ID | --conversation ID] stops every run in progress, or the one named. Only prompt wakes a box. Every provider and backend works in conversations alike. Exit: 0 when the run ends cleanly, 1 when it failed (its last verdict an error) or was interrupted, 6 when the conversation has a turn in progress or the box is at its limit, 130 on Ctrl-C.

JSON: prompt --json prints the started run and does not follow; prompt --jsonl and events --jsonl print one normalized event per line; prompt conversations {"conversations", "running", "limit"}; prompt ls {"runs", "active"}; events {"run", "events", "next", "finished"}; interrupt {"interrupted", "id", "wasRunning", "signal"}. Shapes: Prompt an agent remotely.

Team

prized team status is what the team is doing now, prized team log what happened; neither needs a box config (Teams).

prized team status
prized team log --since 7d --kind exec,prompt --member ana@acme.com

team status prints every live box (BOX, OWNER, STATE, IDLE, SESSIONS, SPEND TODAY), every member (MEMBER, ROLE, BOXES, SESSIONS, SPEND (CYCLE), LAST ACTIVE), and a totals line; a contractor gets their own boxes. JSON: the fields of GET /api/v1/team/status.

team log prints the audit log as TIME, MEMBER, KIND, BOX, DETAIL, ORIGIN (server or reported); contractors exit 5. Flags: --since WINDOW (default 24h), --kind KINDS, --box BOX, --member EMAIL, --limit N (default 100, at most 1000). JSON: {"events": [{"id", "at", "kind", "origin", "actorKind", "actorUserId", "actorTokenId", "boxId", "detail"}], "nextBefore"}.

Health and updates

prized status is box, sync, ports, and daemon state at a glance; --watch 2s keeps it open. JSON: {"box", "sync", "ports", "daemon", "update": {"available"}}; box.transport_path is udp, relay (the Prized relay over HTTPS), ws (the box's own port 443), probing while it looks for a way through, or empty while the tunnel is down. An unreachable box prints "ok": false and exits 3.

prized doctor is the full health check: it applies safe repairs by default, marks them (fixed), and prints only checks that failed, warned, or were fixed (Troubleshooting). Flags: --no-fix, --strict (warnings fail), -v (every check), --bundle (a diagnostics tarball; nothing leaves your machine); for the agent token and host key, --rotate-token, --fetch-token, --forget-hostkey, --pin-hostkey K. JSON: {"summary": {"pass", "warn", "fail", "skip", "fixed"}, "checks": [{"id", "status", "detail", "hint", "fixed"}]}; cp-auth adds signUp (see For agents and scripts) when this machine has no sign-in at all.

On Windows, a repairing doctor run also restores private permissions on an existing local agent token without changing the token itself. --no-fix leaves those permissions as they are.

CommandWhat it does
prized version (or prized --version)Client, daemon, and agent versions for the box in use (--box NAME for another).
prized updateUpdate prized and the daemon in place from signed releases (--check only reports, --channel picks one); it also runs by itself (Updates).
prized daemon install, uninstall, start, stop, restart, status, logsManage the daemon of the box in use: launchd on macOS, systemd --user on Linux, a Scheduled Task on Windows. On Linux with no systemd user session (WSL without systemd, a container), prized runs the daemon itself and nothing restarts it after a reboot: the next prized setup or prized doctor starts it again.
prized daemon proxyShow the daemon's proxy (PAC locations are omitted).
prized daemon proxy set [URL], prized daemon proxy clearChange it. set defaults to your shell's HTTPS_PROXY, refuses (keeping the old proxy) when there is none it can use, and records a proxy that does not answer from here with a warning.
prized mutagen ensure [--from FILE]Fetch Prized's managed Mutagen; your first synced project, and doctor while a project syncs, run it for you. If your network cannot fetch it and prized setup has connected a box, the box downloads it instead. --from installs a copy you downloaded yourself.
prized ops status OP [--wait]Print or poll a deletion operation (dop_…) the API returned (Deletion operations).

setup, login, and the daemon commands also record your shell's HTTPS_PROXY for the daemon, but never replace a recorded proxy with one that does not answer (Networks that block the tunnel).

Completions

zsh
prized completion zsh > "${fpath[1]}/_prized"
bash, as root
prized completion bash > /etc/bash_completion.d/prized
fish
prized completion fish > ~/.config/fish/completions/prized.fish

Tab then completes commands, flags, box names wherever a BOX goes, sizes on resize, regions on move, and windows on auto-pause.

Global flags

FlagWhat it does
--jsonExactly one JSON object on stdout. Interactive commands reject it; never inferred from a pipe.
-y, --yesAssume yes for confirmations.
-q, --quietSuppress non-essential output.
-v, --verboseVerbose output; repeat for wire detail on stderr.
--timeoutPer-request network timeout, default 10s.
--no-colorDisable ANSI color; NO_COLOR is honored too.
--box NAMEThe box to act on (PRIZED_BOX): the default box, or another connected with prized setup --box (Several boxes).
--config PATHThe config file to use (PRIZED_CONFIG). Overrides --box. prized ssh, exec and every other command run with it use that file; a plain ssh NAME, editors and sync use the config --box NAME finds. An escape hatch, not the way to a second box.

For agents and scripts

When a coding agent runs prized login, or prized start on a machine already signed in, the next steps are the agent's: copy the project to the box once with prized setup --non-interactive --copy-once . from the project's folder, then run its commands there with prized exec --cwd code/<name> -- <command>. A person gets prized setup in the project folder instead. An agent is a command marked the way Claude Code, Codex, Cursor, Gemini CLI and OpenCode mark the commands they run, or one with PRIZED_UNATTENDED=1 set.

  • Toolchain. Without --env, the copy brings only the project. So the copy line adds --env node for a package.json, .nvmrc or .node-version in the folder, and --env python for a pyproject.toml, requirements.txt, uv.lock or other Python manifest, with a line telling the agent to ask its person first: those groups bring this machine's versions and global packages too (Bring your environment). prized exec then finds them with no login shell (PATH).
  • Dependencies. With a lockfile (package-lock.json, pnpm-lock.yaml, yarn.lock, bun.lock and the like), --env node also installs the project's packages on the box with that lockfile's own install, such as npm ci, and the line under the copy line says so. The first npm test then finds them. With no lockfile, run the project's install there first (prized exec --cwd code/<name> -- npm install).
  • Go and Rust. They need --env tools, which brings every other language and package on this machine too, so the CLI never adds it.
  • Setup's closing lines. prized setup run by an agent with no one at a prompt ends on the prized exec line for the project on the box, or on those two steps when it had none; a setup that ran without ssh also prints its prized prompt line. If the copy left the project's Node or Python behind, a toolchain: line comes first: the same command with their --env, for after the person's yes. It copies nothing twice.

A failing --json command prints:

{
  "ok": false,
  "error": { "code": "CHECK_FAILED", "message": "…", "hint": "…" }
}

When this machine is not signed in, or Prized refused its key, the error also carries "signUp", one sentence saying a coding agent can sign its person up with their email and a 6-digit code at prized.dev/auth.md (Agent sign-in); people see it as a second line under the hint.

error.code maps 1:1 to the exit code, and both are a stable contract:

Exiterror.codeMeaning
0Success.
1INTERNAL, AWS_ERRORInternal or unexpected error.
2USAGEA bad flag, an unknown command (the error suggests the nearest one), an unknown size or region, a window without a unit, box delete --json without -y.
3BOX_UNREACHABLEBox unreachable (or Prized itself, from your network), or a --wait that ran out its five minutes.
4DAEMON_UNAVAILABLEDaemon required but unavailable.
5CHECK_FAILEDA precondition failed; the hint says what to do. Unknown boxes, sizes not on your plan, refused changes.
6CONFLICTAlready exists or cannot fit: a taken box name, the box count, a balance that cannot run the box, a port.
7PARTIALA batch partly failed: some items of a --all run or an agents handoff succeeded, others did not.
8AUTHNot signed in, or the token was rejected or expired; run prized login.
9MISSING_DEPA dependency is missing; prized doctor usually fixes it.
10DECLINEDYou declined a confirmation.
130Interrupted.
  • Three exceptions. prized ssh and prized exec exit with the remote command's code (ssh's 255 when the box cannot be reached); prized prompt --jsonl and prized events --jsonl print one object per event; prized box ls --names prints a bare JSON array of names.
  • --json is opt-in. prized box ls | head still prints the table.
  • The same token drives the edge API and every route on the API reference, with no prized installed.
  • Sign in without a browser. prized login --token dcp_… takes an API key from the dashboard; in a script use --token-stdin, since a command line is visible to other programs. The key keeps its expiry and box limit, and login prints both (this key expires 2026-12-01, reaches 1 box); once it expires, every command exits 8 with this API key has expired. A key limited to some boxes or to less access cannot register a device key, so Claude Desktop remote needs a full-access key. Retire keys under API keys.
  • A whole lifecycle in a script. prized box new ci-$RUN --size Small --ttl 2h --wait --json, work over prized ssh ci-$RUN -- make test, then prized box delete ci-$RUN -y --json --missing-ok (exit 0 if an earlier run already deleted it); the deadline is the safety net if the script dies.

Files

PathWhat lives there
~/.config/prized/config.tomlThe default box's config: box name, sync projects, port policy, preferred agents ([agents]).
~/.config/prized/boxes/<name>.tomlEvery other box's config, same schema, with its agent token beside it (<name>.token).
~/.config/prized/API key, SSH identity, per-box certificates and the hooks that renew them (ssh_hooks, read by the SSH stanza), and the proxy recorded from your shell (proxy.json, readable only by you).
~/.local/state/prized/current-boxThe box current names.
~/Prized/The default local twin of synced projects.
~/.ssh/config.d/prizedThe SSH aliases that make ssh box-3fa9 work everywhere and renew the box's short-lived SSH certificate before each connection (on Windows, the daemon keeps it fresh). Each alias is bound to the box it first connected to (prized box rebind moves it). An older alias without a saved identity adopts the box when SSH or your editor next verifies it online. Prized's own commands read their managed SSH config directly, so they work even when ~/.ssh/config does not apply its Include line.
~/Library/Logs/prized/Daemon logs (~/.local/state/prized/ on Linux).

The SSH config names the key and certificates by full path, so prized ssh and prized exec also work in a CI job, container or agent that sets its own HOME.

If your SSH config already defines a box's name, including in an included file, Prized withholds its alias and prints the file and line; prized ssh BOX and prized exec still reach the box. Rename your existing SSH alias, then run prized doctor to use the box's name in plain ssh, an editor or sync. Wildcard defaults such as Host * do not reserve names.

An older Prized alias that sync may still use needs that rename before Prized can disable it. The warning says cannot disable the existing Prized SSH alias; until you resolve it, use prized ssh BOX and avoid plain ssh BOX. Starting, resuming or repairing sync under a conflicting name is refused.

On Windows everything but the sync folder and the SSH stanza lives under %LOCALAPPDATA%\Prized (state\, cache\, logs\, mutagen\, boxes\, bin\). An install from before the rename keeps its doppel names, paths, and DOPPEL_* variables; PRIZED_* wins when both are set.

Windows

The CLI runs on Windows 10 1809 or later and Windows 11, x64 and arm64, from PowerShell, Command Prompt or Git Bash (install line); prized ssh uses the OpenSSH client that ships with Windows.

TopicWhat happens
The daemonA Scheduled Task, PrizedDaemon (PrizedDaemon-<name> for a box connected with --box), started at logon, no administrator needed. daemon stop and daemon restart end it hard, dropping sessions open through it; prized daemon logs reads its log.
No ControlMasterWindows OpenSSH has no connection sharing, so prized setup opens one connection per command, a few seconds slower, and every prized exec or prized ssh -- CMD opens its own.
Not on Windows yetprized mosh, prized mount and unmount, drag-and-drop upload in prized ssh, and prized env (setup skips the environment step and says so).
Symbolic linksNot synced: a link inside a synced folder stays on the box; every other file syncs.
Unsigned binariesThe executables are not Authenticode-signed; see Troubleshooting.

WSL is Linux to Prized: install with the curl line inside the distribution, and run prized setup and every other command there, not in PowerShell.

Updates

At most once every fifteen minutes, after a command finishes or while the daemon runs, the CLI installs any newer release with the same signed, checksum-verified download as prized update, and the next command prints a one-line note. So a computer that only reaches its box through the daemon (sync, an editor's SSH, no prized commands) stays current too. The daemon restarts onto it once no SSH session runs through it (a live prized ssh or external SSH client holds it; sync, mounts, port forwards, and mosh do not); prized version shows a pending restart, prized daemon restart does it now. A prized update you run yourself restarts the daemon at once, whatever runs through it: open prized ssh sessions reconnect on their own, while an external SSH client or an editor's remote connection drops and has to connect again. With several boxes, each daemon restarts the next time a command reaches its box.

Turn it off with auto = false under [update] in the config, or PRIZED_NO_AUTO_UPDATE in your environment; the daemon never sees your shell's environment, so on a computer that runs it, use the config line. Homebrew installs are left to brew upgrade prized, and from-source builds never self-replace. A CLI below the API's minimum exits 5 with a prized update hint; releases before 0.7.0 never update themselves, and the dashboard names a machine still on one.

Notifications

When a box stays paused or asleep while your computer keeps trying to reach it (the daemon, sync, an editor), the daemon tells you on your desktop. On macOS a small dialog says the box is asleep and its files are safe, with Resume and Not now; on Linux, with a desktop notification service running, a notification names prized box resume BOX. It waits until you are at the computer (macOS), comes at most once a day, and stops after three until the box runs again. A pause you chose waits three days first. Only a click on Resume wakes the box (Return and Escape pick Not now).

Turn it off, then run prized daemon restart (for a box connected with --box, in its own boxes/<name>.toml, then prized --box NAME daemon restart):

# in ~/.config/prized/config.toml
[notifications]
box_asleep = false

Usage telemetry

While you are signed in, from the first command after prized login, the CLI records which command ran, its version, OS (WSL counts as its own), duration, and exit code, and sends the counts in occasional batches; it never records arguments, flags, paths, or file contents, and sends nothing while you are signed out. Opening a command's help (--help, or prized help <command>) counts as viewing that help, not as running the command. A command you stop with Ctrl-C at a question that takes a single key (like [Y/n]) still counts, with exit code 130, and prized setup counts as soon as its own work is done, before it asks whether to start your agent. A failed prized setup step (or one setup worked around, such as a box it waited for), or a prized doctor report with a failing check, adds one word from a fixed list naming what happened (for doctor, the first failing check), never the message you saw. So does a command refused a GPU size (for example box new --size gpu-l4 without a paid plan), with the word for the rule that refused it. So does a connection to a box (ssh, an editor, the Codex app) that stops before it starts, for example because Prized could not be reached (the word says how: the name did not resolve, the connection timed out, a firewall or proxy). So does a background update, with the word for how it ended (for example installed, or waiting for the daemon to be idle). Setup's last question adds your answer the same way, and whether it said Claude Code still needs a sign-in on the box. prized agents run claude and prized agents run codex add, the same way, whether the agent was signed in on the box and how the sign-in offer ended (copied, signed in, declined, or stopped with Ctrl-C). CLI use also becomes at most one product event per workspace per UTC day, with the first command's name, the CLI version, and OS; updates and automatic connections do not count (Privacy).

Turn it off either way:

# in ~/.config/prized/config.toml
[telemetry]
enabled = false
# or per shell
export PRIZED_NO_TELEMETRY=1

Before prized setup has written the config, use the environment variable.

Turning it off stops those counts, not the requests the CLI and its daemon make for you. Each request names the version of the program that sent it, and your machine's API key keeps the last version the CLI reported, and the last the daemon reported and when (API keys).

This covers the CLI only; for the website and dashboard, see Privacy.