CLI Reference

cheasee-pi is the Docker-based launcher for the pi coding agent. It sets up a workspace, launches pi inside a container with provider keys injected, and manages the container lifecycle. This page is the command reference — every command’s does, checks, and inputs at a glance. For step-by-step setup and daily walkthroughs, see Installation and Daily Usage.

At a glance

Command Does Key inputs
cheasee-pi (no args) Launch pi in the container — alias of start workspace, API keys
cheasee-pi start (alias up) Launch pi inside the container with provider keys injected workspace, --build to rebuild first
cheasee-pi init Set up workspace: bare clone + main worktree + cheasee-settings.json empty folder, repo URL
cheasee-pi auth add \| remove \| list \| envvars Manage provider API keys provider, key
cheasee-pi build (full: rebuild) Rebuild the Docker image workspace settings
cheasee-pi down (alias stop) Stop/remove THIS workspace’s container only —
cheasee-pi clean Remove ALL cheasee-pi containers (every repo) — kills active sessions confirmation
cheasee-pi prune-images Delete ALL tagged cheasee-pi images (every repo) — recreated on next build confirmation, --dry-run / --yes
cheasee-pi uninstall Delete cheasee-pi itself: cache, auth config, binaries confirmation
cheasee-pi about (alias intro) Print a ~10-line glossary of core concepts + workflow links —

cheasee-pi --version prints the CLI version. cheasee-pi --help lists every subcommand.

Lifecycle

Step Command What happens
1 cheasee-pi init empty-folder workspace setup (clone, scaffold, auth)
2 cheasee-pi auth add <provider> store API key, set default provider
3 cheasee-pi start build image on first run, launch pi
4 (work) interactive pi session inside the container
5 cheasee-pi down stop and remove this workspace’s container
6 cheasee-pi clean sweep every container + orphan sessions, prune
7 cheasee-pi prune-images remove every tagged cheasee-pi-* image on the host + orphaned build cache

An empty folder can skip step 1: cheasee-pi start auto-runs init and stops (init never launches pi); run cheasee-pi start again to launch.

cheasee-pi (no args) / start

Launch an interactive pi session inside the container. The root command run without a subcommand executes the same handler as start.

   
Does Mounts the workspace at /workspaces/main and its sibling bare clone at /workspaces/.bare, starts the container (docker compose up if not running), injects provider keys from ~/.config/cheasee-pi/auth.json as environment variables, launches pi, and prints the CodeFlow URL (http://localhost:<port>/?repo=local/workspace&run=1) once the container is healthy. The CodeFlow sidecar is published on loopback only by default (CODEFLOW_HOST_IP, default 127.0.0.1 — set 0.0.0.0 to opt in to remote access). It also starts the local ui sidecar and prints the control-center URL (ℹ UI: http://127.0.0.1:<port>), bound to loopback by the compose mapping (see UI below).
Checks Workspace gate: empty folder → runs init and stops (re-run start to launch pi); cheasee-settings.json present → run; non-empty folder without it → refused with an empty-folder hint. Docker gate (binary present + docker info responds + Engine ≥ 24.0.0, 5 s timeout) unless --no-docker-check.
Inputs Flags: --workdir, --name, --build, --no-docker-check, --api-key (session-only, not saved), --dry-run (print injected env vars, then exit). Reads auth.json + cheasee-settings.json; writes the version-keyed compose/Dockerfile cache.

UI (web control center)

cheasee-pi start also launches the local ui sidecar — the cheasee-pi web control center — and prints its URL once the container is healthy:

ℹ UI: http://127.0.0.1:9713

The URL is printed with the literal 127.0.0.1, never localhost: the compose mapping pins the host side to IPv4 loopback (127.0.0.1:<port>), and on hosts where localhost resolves to ::1 first a localhost URL would not reach the published port.

Resolution order for the host port: docker.uiPort in cheasee-settings.json → env PI_UI_PORT → derived 9500 + fnv32(repo-slug) % 1024 (range 9500–10523, probed next-free) so parallel workspaces never collide. The port the running sidecar actually published (docker port) is authoritative over that chain.

The resolved host port is forwarded into the pi session as PI_UI_PORT so the in-session footer link agrees with the printed ℹ UI: hint. When no free host port can be resolved (range exhausted) the CLI omits PI_UI_PORT, prints ⚠ UI port: <reason>, and sets CHEASEE_UI_PORT_UNRESOLVED=1; start still succeeds and the footer suppresses the UI link.

The host side is bound to loopback by configuration — there is no all-interfaces opt-in (unlike CodeFlow’s CODEFLOW_HOST_IP). This is not a hard isolation boundary: Docker Engine before 28.0.0 may expose a loopback-published port to hosts on the same L2 segment, and the supported floor is Engine 24.0.0. The container side stays 0.0.0.0:3000 (docker-proxy/DNAT delivery); the published host port is loopback-bound. See Daily Usage for the start/reconnect workflow and Security for the threat model.

cheasee-pi init

Set up a cheasee-pi workspace from scratch: bare clone to <workdir>/.bare, main worktree in the workspace subfolder (<workdir>/main by default), and the dedicated cheasee-settings.json scaffolded inside that worktree leaf (gitignored, machine-local). GitHub OAuth (device flow) is the primary authentication; --no-github falls back to the legacy API-key-only path (no clone, no repo URL).

   
Does Bare-clones the project repo, adds the main worktree in the workspace subfolder (<workdir>/main unless a different workspace folder name is stated), scaffolds cheasee-settings.json in the worktree leaf (never overwrites an existing one), authenticates GitHub, records custom skill repos, saves auth config, and sets up the provider API key. Prints cheasee-pi start as the next step — init never launches pi (the second start invocation does).
Checks Docker gate unless --no-docker-check. Empty-folder probe: non-empty folders are refused (.DS_Store tolerated). cheasee-settings.json presence marks the workspace initialized — init refuses it unless --reauth (which re-runs only the GitHub + API-key authentications). Single invocation capped at a 5-minute timeout (device-flow OAuth polling dominates). --no-input requires --repo-url.
Inputs The GitHub repo pi should work on (--repo-url or interactive prompt; must already exist on GitHub), workspace folder name (interactive prompt, default main; names the subfolder only, not a git branch), GitHub OAuth device flow, API key (--api-key or prompt), provider name. Files written: cheasee-settings.json in the worktree leaf, ~/.config/cheasee-pi/auth.json, .pi/ agent settings, sibling .bare clone + worktree leaf.

init flags

Flag Meaning
--workdir <dir> Working directory (default: current directory)
--no-github Legacy API-key-only path — skip the clone and GitHub OAuth entirely
--client-id <id> GitHub OAuth app client ID (default: cheasee-pi’s app)
--provider <name> Provider name for the API key (default: opencode-go)
--no-input Skip all interactive prompts (--repo-url then required)
--api-key <key> API key, skips the interactive prompt
--no-docker-check Skip the Docker Engine check
--repo-url <url> GitHub repo pi should work on (owner/repo or GitHub URL; required with --no-input)
--reauth Redo GitHub + pi API-key authentications on an initialized workspace
--skill-repo <spec> Custom skills installed into the container (repeatable)

cheasee-pi auth

Manage provider API keys. Keys live in ~/.config/cheasee-pi/auth.json (0600, atomic writes) and the last-added provider becomes the default in the workspace settings.

Subcommand Does Inputs / checks
auth add [provider] Add or update a provider API key; sets it as the default provider (and model) in the workspace settings provider name or interactive picker; --workdir, --no-input (skip model selection). Saves to auth.json + cheasee-settings.json + .pi/agent/settings.json
auth remove <provider> Delete the key from auth.json exact provider name; --workdir. Leaves defaultProvider/defaultModel in cheasee-settings.json untouched — switch the default with cheasee-pi auth add <other>
auth list List configured providers (masked keys) + the workspace default --workdir
auth envvars Print the canonical provider→env var mapping (shell format by default) --format shell\|json; emits no key values

cheasee-pi build / rebuild

Rebuild the Docker image without starting the container. build reuses the Docker layer cache; rebuild is a full no-cache rebuild plus prune.

   
Does Rebuilds the image from the compose/Dockerfile in the version-keyed cache dir; passes CHEASEEPI_MEMORY from cheasee-settings.json as a build arg.
Checks Runs from a git repo (settings + git identity come from it). Docker gate unless --no-docker-check. Compose validates every volume spec, so the workspace path must resolve.
Inputs Flags: --workdir, --no-docker-check. Reads cheasee-settings.json (docker.memory).
Note A cached build does not apply the new image to a running container — apply with cheasee-pi start --build or cheasee-pi down + cheasee-pi start.

cheasee-pi down

Stop/remove the current workspace’s container only — via docker compose down (alias stop).

   
Does Removes the compose project derived from this workspace’s repo — sibling workspaces’ containers keep running.
Checks No-ops when no container matches the workspace’s project. Legacy pre-derivation containers (project cheasee-pi) are deliberately not targeted — cheasee-pi clean removes those.
Inputs None (no flags).

cheasee-pi clean

Remove ALL cheasee-pi containers (every repo) — kills active sessions and orphaned pi processes inside them.

   
Does Enumerates ALL managed containers on the host (every repo, running or stopped), force-removes each, kills orphaned pi processes inside them, and prunes dangling images + build cache.
Checks Lists the matches and asks for confirmation before killing anything (--yes skips, --dry-run previews). Default scope is every cheasee-pi container on the host — --name scopes to a single container.
Inputs Flags: --name <container> (scope), --older-than <minutes> (orphan age reap; 0 disables), --dry-run, --yes.

cheasee-pi prune-images

Delete ALL tagged cheasee-pi images (every repo) — recreated on next build — the explicit “free the disk” step when repeated builds fill the Docker data root. clean removes containers; prune-images removes the regenerable per-repo images (cheasee-pi-<slug>-cheasee-pi, cheasee-pi-<slug>-codeflow) that clean never touches.

   
Does Enumerates all tagged cheasee-pi-* images on the host (every repository, no keep-latest), force-removes each by full Repository:Tag, then prunes dangling images + build cache.
Checks Refuses while any cheasee-pi container exists (running or stopped) — run cheasee-pi clean first; a running container is a hard Docker conflict -f cannot force, and force-removing a stopped container’s image silently orphans it. --dry-run lists the matched images with approximate (upper-bound) sizes.
Inputs Flags: --dry-run, --yes (skip confirmation).
Note Images are regenerable via cheasee-pi build / cheasee-pi rebuild. docker buildx prune -a -f discards cache host-wide — other projects sharing the default builder lose their cache too. Foreign tagged images are never matched.

cheasee-pi uninstall

Delete cheasee-pi itself: cache, auth config, binaries.

   
Does Removes the version-keyed cache dir (compose/Dockerfile), ~/.config/cheasee-pi/auth.json, and every cheasee-pi binary (the running executable plus the canonical install locations ~/.local/bin and /usr/local/bin, deduped). Workspace files (.pi/, .git/, source checkouts) are never touched.
Checks Shows a summary and asks for confirmation (--force skips). Skips build-cache/tmp binaries; warns when a binary’s directory is not writable.
Inputs Flags: --force.

cheasee-pi about

Print a non-interactive glossary of cheasee-pi’s core concepts — workspace, bare repo, worktree, container/image, provider, skill repo, CodeFlow, and CHEASEE_REF — plus the one-sentence workflow, linking the long-form docs (docs/daily-usage.md) and the published rendering (https://schneiderdaniel.github.io/cheasee-pi/daily-usage).

   
Does Prints the ~10-line glossary + workflow summary to stdout and links docs/daily-usage.md and pi.dev.
Checks None — pure print.
Inputs None (no flags). Alias: intro.

Environment variables

Provider keys are read from ~/.config/cheasee-pi/auth.json, not the environment — the mapping below is what the CLI injects into the container. cheasee-pi auth envvars is the canonical live source.

Provider Env var
opencode-go (alias: opencode) OPENCODE_API_KEY
openai OPENAI_API_KEY
anthropic (alias: claude) ANTHROPIC_API_KEY
deepseek DEEPSEEK_API_KEY
gemini (alias: google) GEMINI_API_KEY
groq GROQ_API_KEY
mistral MISTRAL_API_KEY
openrouter OPENROUTER_API_KEY
xai XAI_API_KEY
fireworks FIREWORKS_API_KEY
together TOGETHER_API_KEY
cerebras CEREBRAS_API_KEY

Passthrough from the host environment (when set):

  • GH_TOKEN, CLOUDFLARE_ACCOUNT_ID

Other variables the CLI reads:

Variable Meaning
CODEFLOW_PORT Host port for the CodeFlow sidecar. Resolution order: docker.codeflowPort in cheasee-settings.json → env CODEFLOW_PORT → derived 8470 + fnv32(repo-slug) % 1024, probed next-free
CODEFLOW_HOST_IP Host-side bind IP for the CodeFlow sidecar’s published port. Default 127.0.0.1 — loopback only, matching the printed localhost URL (the sidecar serves the workspace source read-only). 0.0.0.0 is the explicit remote-access opt-in
PI_UI_PORT Host port for the ui control-center sidecar. Resolution order: docker.uiPort in cheasee-settings.json → env PI_UI_PORT → derived 9500 + fnv32(repo-slug) % 1024, probed next-free. The host bind is bound to 127.0.0.1 by configuration (no opt-in). See UI
CHEASEEPI_MEMORY Build arg passed by build/rebuild from docker.memory in cheasee-settings.json
XDG_CACHE_HOME (Unix) / LocalAppData (Windows) Base for the CLI cache dir via os.UserCacheDir

Files and artifacts

Path Role
~/.config/cheasee-pi/auth.json Provider API keys + GitHub token/user (0600, atomic writes)
<workspace>/cheasee-settings.json Initialized marker; defaultProvider/defaultModel, docker settings, skill repos (tab-indented, never overwritten by init)
<UserCacheDir>/cheasee-pi/<version> CLI-managed cache: docker-compose.yml, Dockerfile (extracted on demand)
<workspace>/.pi/ pi agent config (settings, agent settings)
<workdir>/.bare Sibling bare clone, mounted at /workspaces/.bare in the container
container cheasee-pi-<repo-slug> Per-repo Docker container (workspace mounts at /workspaces/main)

Where to go deeper

  • Installation — prerequisites, install, first setup, uninstall
  • Daily Usage — start/stop flows, CodeFlow, parallel workspaces, troubleshooting

Copyright © 2026 SchneiderDaniel. Distributed under the MIT License.

This site uses Just the Docs, a documentation theme for Jekyll.