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 groupThe 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.
| Group | Default | What it brings |
|---|---|---|
| shell | yes | Your 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. |
| python | yes | The 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). |
| node | yes | The 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. |
| tools | yes | Go 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. |
| clis | yes | Developer 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) | yes | Executables 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. |
| docker | yes | Registry 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. |
| services | yes | Local 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. |
| data | no | Database contents (pg_dump piped into the box), named Docker volumes, and local-only images streamed over the tunnel. Sizes are shown before you answer. |
| secrets | yes | The 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
| Flag | Effect |
|---|---|
--env shell,python,... | Bring these install groups without asking (the grant for --non-interactive; -y covers them too). |
--env-secrets | Copy your secrets without asking: the project's .env files, env-var values, and CLI sign-ins (-y covers this too). |
--env-data | Copy database contents, volumes, and local-only images. Never covered by -y. |
--no-env | Skip the step. |
--no-advisor | Never contact the advisor; questions come from the built-in rules. |
--attach, --no-attach | Open 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
envstep saysquestions: 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
| Path | What it is |
|---|---|
~/.config/prized/shell.sh | Your aliases, functions, exports, and the PATH hooks for the installed toolchains; sourced from ~/.profile, ~/.bashrc, and ~/.zshrc. |
~/.config/prized/env.secret | The env-var values you chose to move, 0600, sourced by shell.sh. |
~/.config/prized/welcome.txt | The 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?
Agent setup
Paste one prompt into Claude Code or Codex on your Mac; the agent installs the CLI, runs prized setup, and asks before putting your project or your credentials on the box.
Sync
A synced project is one folder pair, ~/code/<name> on the box mirrored into a folder on your Mac. Edits land on the other side in under a second, both directions, .git included.