Prized docs

Bring your environment.

prized setup looks at your Mac, asks a few yes or no questions, and reproduces the parts you pick on the box - shell, toolchains, CLIs, Docker images, databases, and env vars.

What it does

prized setup
#  fig ready
#  project  ~/src/app  fig:~/code/app
# bring     Bring your dev environment to the box?
#           shell     aliases + exports · zsh as the login shell · ~/.tmux.conf
#           python    Python 3.12 · ruff · pre-commit · project deps (uv)
#           node      Node 22.4.0 · pnpm · typescript
#           docker    postgres:16 · redis:7 · compose up: app
#           services  postgres 16 on :5432 · redis on :6379
#           [Y/n] n = choose group by group

The environment step runs inside prized setup, after the project step and before the agents step. It scans your Mac read-only (a spinner; the counts and the probes that could not look print under --verbose), turns what it finds into a few questions, and applies what you accept. One question shows at a time: what would move and a [Y/n] or [y/N]; a single key answers, and the answered question collapses to a one-line result so the screen stays short. The apply prints a row only when something did not carry ( env 41 moved · 2 not carried (mole, cursor-agent)); a clean run leaves the result lines as the record. Installs run four at a time within a group (a Python version, a go install, and a Docker pull do not wait for each other); apt, Homebrew, and npm -g take turns, since they hold a lock. Re-running is safe: every item checks the box first and reports already on the box instead of redoing work.

prized env scan shows the scan on its own, prized env plan shows the questions without applying anything, and prized env migrate runs the step outside setup. To preview the whole onboarding, this step's exact on-box commands included, run prized setup --dry-run: everything prints, nothing changes.

The questions

The install groups are one question (bring: Bring your dev environment to the box? [Y/n], each group on its own line with what would move); y or Enter takes them all, n asks group by group. Secrets are one question (secrets: Copy your secrets to the box? [Y/n]) listing exactly what would move: the project's .env files, the secret-looking env vars from your shell files, and CLI sign-in files. Data copies are their own question and default to no. On a terminal one key answers (y, n, Enter for the default), and each answered question collapses to a one-line result.

GroupDefaultWhat it brings
shellyesYour aliases, functions, and non-secret exports into ~/.config/prized/shell.sh on the box; zsh with oh-my-zsh, powerlevel10k, or starship when your Mac uses them; .tmux.conf, .vimrc, nvim config.
pythonyesThe same Python versions via uv, or just the pinned one when the project pins a version (.python-version, .tool-versions, or the Dockerfile's FROM python: tag); your pipx and uv tool packages; the project's dependencies from its lockfile (uv sync, poetry install, or pip install -r).
nodeyesThe same Node versions via fnm, or just the version under the pin when the project pins one (.nvmrc, .node-version, a plain engines.node, or the Dockerfile's FROM node: tag); your global npm packages; pnpm or yarn through corepack.
toolsyesGo and Rust at the same versions, cargo install binaries on request (one that is also a catalog CLI, like just, installs as a package instead), Homebrew formulae mapped to apt packages or installed with Homebrew on Linux, each formula its own item, bottles only: a formula with no Linux bottle (mole, most macOS-first taps) is reported as not carried instead of built from source; a formula that is also a catalog CLI, like infisical, installs as that CLI; Prized's own tools, like mutagen, stay home.
clisyesDeveloper CLIs found on your PATH: aws, gcloud, az, kubectl, helm, terraform, flyctl, vercel, wrangler, supabase, stripe, ngrok, doppler, infisical, e2b, deno, bun, direnv, and more. A CLI whose sign-in lives in the macOS Keychain (Infisical, 1Password, Tailscale) is listed as not carried with the login command to run on the box.
tools (bins)yesExecutables in ~/bin, ~/.local/bin, ~/go/bin, and the curl installers' own dirs (~/.fly/bin, ~/.deno/bin, ~/.bun/bin) that no package manager owns: a Go-built tool is reinstalled from the module path and version in its build header (go install path@version), a script is copied as-is after the secret screen, and a binary with no known origin is listed as not carried. On Apple Silicon /usr/local/bin is scanned too (Homebrew lives in /opt/homebrew there, so it holds only what you put in it); its entries are reinstalled or listed, never copied. Nothing is executed to find out.
dockeryesRegistry images are pulled on the box (faster than your uplink); images with a Dockerfile in the project are rebuilt there; a compose project that was running comes up. Images and volumes that belong to another compose project (one whose compose file is outside the project you are setting up) are listed as not carried; set that project up from its own folder.
servicesyesLocal Postgres, MySQL, Redis, MongoDB, and similar run on the box as containers at the same major version and port, data in a named volume, with the service's client (psql, mysql, redis-cli) installed alongside. A port a Prized tunnel holds on your Mac is a box port mirrored here, not a local service; a port already taken on the box fails the item with the reason instead of starting a second server.
datanoDatabase contents (pg_dump piped into the box), named Docker volumes, and local-only images streamed over the tunnel. Sizes are shown before you answer.
secretsyesThe project's .env and .env.* files (the committed .env.example and .env.sample are templates and sync instead), copied to the same relative path under the project folder on the box (see .env files); secret-looking env vars from your shell files; and CLI sign-in files (~/.aws, ~/.config/gcloud, ~/.kube/config, ...). Everything lands 0600; values are never shown.

The box is amd64. An arm64-only image is rebuilt from its Dockerfile or pulled from its registry, never streamed. Things with no recipe yet (conda environments, Ruby and Java toolchains, casks, devcontainers, MLX packages that only ship Apple Silicon wheels) are listed as not carried so you know what to set up by hand.

.env files

A sync session prized setup creates ignores .env and .env.* at every depth (.env.example and .env.sample still sync), so a credential file never reaches the box as a side effect of "sync this folder". Instead the secrets question lists each one it found (a monorepo's apps/web/.env.local included; node_modules, build folders, and hidden folders are not searched) and, with the default yes, copies it to the same relative path under the project folder on the box, 0600; a re-run refreshes it. A symlink to another .env file inside the project (apps/web/.env.local ../../.env.local) is recreated as a symlink. Under --non-interactive, -y or --env-secrets grants it. A project synced before this (or added by hand with prized sync add) still carries them in the mirror: the project row says so (.env synced with the folder) and the question leaves them out. Add .env to that project's extra_ignores to gate it.

Flags

FlagEffect
--env shell,python,...Bring these install groups without asking (the grant for --non-interactive; -y covers them too).
--env-secretsCopy your secrets without asking: the project's .env files, env-var values, and CLI sign-ins (-y covers this too).
--env-dataCopy database contents, volumes, and local-only images. Never covered by -y.
--no-envSkip the step.
--no-advisorNever contact the advisor; questions come from the built-in rules.
--attach, --no-attachOpen the box session in this terminal when setup finishes (the interactive default when a session started), or print the reattach command instead.

The advisor

The scan is deterministic. Before asking, the inventory goes to Prized's advisor, a bounded Claude pass that reads your project's manifests (README, Makefile, package.json, compose file) and rewrites the questions around what the project actually needs: the Python your .python-version pins, the Postgres your compose file names, the CLI your README says to install. It runs by default; --no-advisor (or PRIZED_ADVISOR=off) skips it.

What it can and cannot do:

  • It sees names, versions, and sizes. Secret values are redacted before anything leaves your Mac, and it never reads your credential files.
  • It cannot run anything. It picks from the same recipe catalog the rules use; anything outside the catalog is dropped and noted.
  • It cannot add a secrets or data item that the scan did not find.
  • If it is unreachable, the questions come from the rules; the JSON envelope's env step says questions: rules (the terminal shows nothing either way, the tailored summary prints under --verbose).

Set PRIZED_ADVISOR=off to never offer it.

What never moves

  • SSH private keys, GPG keys, the macOS Keychain, browser profiles, 1Password data. The report tells you when commit signing needs a box key.
  • Secret values into any output: the JSON envelope, the terminal, telemetry, and the advisor all carry names only.
  • Anything through the control plane: every transfer goes over your SSH tunnel straight to the box, the same path the agent handoff uses. See Credentials.

On the box afterwards

PathWhat it is
~/.config/prized/shell.shYour aliases, functions, exports, and the PATH hooks for the installed toolchains; sourced from ~/.profile, ~/.bashrc, and ~/.zshrc.
~/.config/prized/env.secretThe env-var values you chose to move, 0600, sourced by shell.sh.
~/.config/prized/welcome.txtThe welcome block setup printed: what moved, what was left.
prized-postgres, prized-redis, ...Service containers, --restart unless-stopped, data in prized-<name>-data volumes.

Services listen on 127.0.0.1 on the box; prized ports mirrors them to your Mac like any other box port.

Something unclear or out of date?

On this page