CLI reference
orbit setup <host> [--email you@example.com]orbit init [--recipe NAME] [--force] [--list]orbit create [<host> <slot>] [--ttl 6h]orbit create <host> {}.example.com [--ttl 6h]orbit deploy [<host> <slot>] [--dry-run] [--force]orbit status [<host> [<slot>]]orbit env [<host> <slot>] [--set KEY=VALUE | --from FILE | --edit]orbit remove [<host> <slot>] [--purge] [--yes]Target arguments
For create, deploy, env, and remove: pass both host and slot, or neither.
Neither reads the mapping for the current Git branch from ~/.config/orbit/config.json ($XDG_CONFIG_HOME/orbit/config.json when set). The repository key is the origin remote URL when configured; otherwise the absolute path to the repo root. Detached HEAD has no mapping — pass the target explicitly.
status also accepts host only:
orbit status ship # slots with src/ on the hostHost values
Passed to OpenSSH unchanged:
ship Host alias in ~/.ssh/configdeploy@host.example.com user and hostnamedeploy@203.0.113.10 user and addresshost.example.com default SSH userMust not start with - or contain /.
setup
orbit setup ship --email you@example.comPrepares Ubuntu host layout, permissions, system Caddy, and TTL timers. Interactive SSH (sudo prompts). See Prepare the host.
init
orbit initorbit init --listorbit init --recipe stario-podmanorbit init --forceWrites ops/ in the current Git repository. Auto mode runs each bundled recipe's recognizer and uses the first match: stario-podman, python-podman, then static-caddy. Recognition failure means that recipe does not handle this tree. --recipe writes that recipe even when recognition fails. --force replaces existing hook files. Edit the written scripts; later deploys do not rewrite them.
create
orbit create ship app.example.comCreates slot directories. Successful create writes the local target mapping.
Generated preview name:
orbit create ship {}.example.com# created ship calm-otter.example.comWith expiry (max 30d; 30m, 6h, 2d, …):
orbit create ship {}.example.com --ttl 6hExpiry permanently purges the slot. An explicit slot name can reuse retained data and env after a normal remove.
deploy
orbit deploy ship app.example.comMirrors the Git work tree into $SLOT_SRC, runs ops/deploy (must exist). Orbit runs it with bash. Requires a clean work tree so the upload matches HEAD. --force also uploads local modifications and non-ignored untracked files.
orbit deploy ship app.example.com --dry-runorbit deploy --forceorbit deploy # after a saved mapping existsstatus
orbit status ship app.example.comorbit status # saved mappingorbit status ship # slots with src/ on the hostRuns ops/status when present. Without a hook, prints unknown and exits 0. With no src/ directory, prints missing and exits 1.
env
orbit env ship app.example.com --from .env.productionorbit env ship app.example.com --set APP_ENV=production --set LOG_LEVEL=infoorbit env ship app.example.com --editPrint keys (values redacted) when no action is given. Stored at $SLOT_ENV, mode 0600.
remove
orbit remove ship app.example.comorbit remove ship app.example.com --purgeorbit remove ship app.example.com --yesRuns ops/remove when present, then removes src and run. Keeps data and env unless --purge. Manual remove cancels an active expiry timer.
User config
{ "version": 1, "remotes": { "github.com/acme/app": { "branches": { "main": { "host": "ship", "slot": "app.example.com" } } } }}Successful create and deploy create or update the entry. Preview TTL stores expires_at; Orbit prunes expired entries on read.