Run the workspace CLI as pnpm tiny <command>. The underlying entry point is tools/cli/src/main.ts.
The CLI never starts a control plane or an application runtime. All planning, deployment, status, and log commands target the configured remote server.

Global behavior

Every command accepts these global flags: Configuration is resolved from flags, then TINY_API_URL / TINY_TOKEN, then the current saved profile. TINY_CONFIG changes the credential-file path from its default, ~/.tiny/credentials.json. With --json, progress stays on stderr. Commands do not prompt when stdin is not a TTY.
tiny secrets set accepts a secret from a prompt or piped stdin. The value is deliberately not accepted as a command-line argument — that would put it in shell history and the process table.

Authentication and setup

App authoring and deployment

About --yes

--yes passes approval intent with the deployment request. It does not bypass role or policy checks. In non-interactive use, a plan with required approvals fails with APPROVAL_REQUIRED unless --yes is supplied. See Approvals.

About deploy and waiting

deploy returns when the deployment reaches a terminal state, because the API answers 202 and a worker builds and rolls out afterwards — a deploy that returned is not a deploy that happened. It reports how the artifact came to exist (Built in 12.4s, or Reused a cached build when the content-addressed build was already in the cache), and exits non-zero if the deployment failed, repeating the deployer’s own reason and remediation. In --json mode the single result object gains a build field ({ artifactUri, cached, durationMs }) whenever a build ran.

What gets uploaded

Artifacts omit .git, node_modules, .tiny, common caches, and credential-looking files. Add repository-specific patterns to .tinyignore.

Inspection and governance

When an optional app reference is omitted, the CLI reads metadata.name from the current directory’s tiny.yaml.

Exit codes

Scripts should branch on these rather than on message text. Codes 5 and 7 in particular mean “a human has to do something”, not “this failed”.