Build, iterate on, and manage Anything apps from your terminal
The Anything CLI lets you create apps, send prompts, publish, and manage everything from your terminal. It’s the same Anything agent you use in the browser, driven by commands instead of clicks. It’s built for scripting and for AI coding agents, so every command can speak structured JSON.
The CLI is rolling out to select accounts. If you don’t have access yet, email hello@anything.com.
# See your account and orgsanything useranything orgs list# Create an appanything projects create --prompt "Build a todo app with dark mode" --org <org-id># Send a follow-up promptanything projects generate <project-id> --prompt "Add a filter for completed tasks"# Publish itanything projects publish <project-id>
Or do the whole thing in one command:
anything ship "Build a markdown viewer for blog posts"
ship creates the app, runs the agent, and publishes, all in one shot. The prompt is a positional argument, so you don’t need --prompt. To iterate on an existing app instead of creating one, pass --project:
anything ship --project <project-id> "Add a settings page"
After ship finishes, check anything projects messages <id> before telling anyone the app is live. ship can return ok: true, published: true while the agent actually paused on a clarifying question or replied with a plan only, in which case the published URL serves an empty template. If the last assistant turn is a question or a plan, answer it (or send "proceed") with anything projects generate <id> --prompt "...", then publish again.
By default, secrets add writes to all environments (development, preview, and production), so a key your published app needs actually reaches it. Pass --env development, --env preview, or --env production to target one. If you only set a secret in development, the live app won’t see it.
The value can also come from stdin: cat key.txt | anything projects secrets add <id> --name OPENAI_API_KEY.
Every command takes these flags. They’re what make the CLI scriptable.
Flag
Behavior
--json
Print a structured JSON envelope (see below)
--quiet
Print only the primary identifier (an ID or URL), for chaining
--dry-run
Show the planned actions without running them
--non-interactive
Fail on ambiguity instead of prompting
--non-interactive turns on automatically when the CLI detects an agent or CI environment (CLAUDECODE, CODEX, CI, or OPENCLAW set). When --json and --quiet are combined, --json wins.
Streaming commands (ship, create, generate, and publish) emit one JSON object per line (NDJSON) to stdout. The terminal line is tagged "type": "result" and carries the same command field as the one-shot envelope, so a stream reader can attribute the result without tracking which command it ran. Even on failure the result stays a single line, parseable by a line-by-line reader:
Both success and error JSON go to stdout, so anything ... --json | jq works whether the command succeeds or fails. Human-readable error text goes to stderr.
Use --quiet to pass an ID or URL straight into the next command:
PROJECT_ID="$(anything projects create --quiet --prompt 'Build a todo app' --org <org-id>)"anything projects generate "$PROJECT_ID" --prompt 'Add dark mode' --quietPUBLISH_URL="$(anything projects publish "$PROJECT_ID" --quiet)"echo "Published to: $PUBLISH_URL"
Check the exit code before using a value captured from --quiet. On failure, --quiet prints the JSON error envelope to stdout, so PROJECT_ID="$(... --quiet)" would capture a JSON blob instead of an ID. Branch on $? (or the exit codes above) before passing the captured value to the next command.
By default, create and generate wait for the agent to finish. The wait is heartbeat-based: as long as the server keeps making progress, the CLI keeps waiting, so longer builds don’t get cut off (real builds routinely run past five minutes). It gives up only after a stall with no progress, or after a hard 30-minute cap. Real builds typically take 10 to 40 minutes (publish adds roughly 1.5 to 2 minutes, and pull can take 8 to 14 minutes), so a long-running build is normal, not hung.Pass --no-wait to return right away instead, then poll:
# Start and return immediatelyanything projects create --prompt "Build a CRM" --org <org-id> --no-wait --quiet# Poll until doneanything projects status <project-id> --json
Status values: CREATED and BUILDING mean it’s still working; VALID means done; INVALID and INVALID_PROMPT mean it failed.
VALID also covers a chat-only or plan-only turn that made zero file changes, so a VALID status alone doesn’t guarantee the agent built anything. Before publishing, confirm the last assistant turn with anything projects messages <id>; if it’s a question or a plan, answer it and generate again.
If the wait does time out, it’s not a failure. The build keeps running on the server. create, generate, and ship emit a resumable still_building result that carries the project ID and a hint telling you how to pick back up:
{ "type": "result", "ok": false, "command": "projects create", "error": { "code": "still_building", "projectId": "proj_123", "hint": "Check progress with `anything projects status proj_123`, then publish with `anything projects publish proj_123` once status is VALID." } }
So even on a slow build you never lose the project ID. Poll projects status until it reads VALID, then publish. A genuine INVALID or INVALID_PROMPT build (or a generation_failed) still fails terminally, as you’d expect.
A first publish can fail on a build error in the generated code. The failed-deploy result embeds the build output so you can recover without leaving the terminal:
Build error: read buildLogs from the failed result (or anything deployments logs <deployment-id>), send the error back as a fix prompt with anything projects generate <id> --prompt "...", then publish again.
Transient infra error (for example a conflict on a first-ever deploy): retry the publish as-is.
INVALID or INVALID_PROMPT: rephrase the prompt and generate again before publishing.
The CLI ships a skill file that AI coding agents (Claude Code, Codex, Cursor, OpenClaw) can read to drive Anything for you. Print it with:
anything skill
For the full machine-readable command tree, use anything introspect.
For agent and CI workflows, pass --json on every command, use --no-wait with projects status polling, and branch on the exit code. The CLI auto-enables --non-interactive in those environments, so commands fail fast instead of hanging on a prompt.
The CLI checks for a newer version in the background and tells you when one is out. To update:
anything update
It detects how you installed the CLI (npm, pnpm, yarn, or bun) and runs the matching command. Pass a version to pin or downgrade: anything update 0.1.3.The update notice shows up in non-interactive runs too (agents, CI, anything reading the CLI over a pipe), printed as a single plain line to stderr. It never touches stdout, so it won’t break a --json consumer.