uncloud is a single binary over the same REST API the console uses. Anything the dashboard can do, the CLI can do — apps, databases, droplets, volumes, buckets, domains, pipelines, IAM — and anything it does not model yet is still one uncloud api call away.

Install

The Go binaries ship inside the package rather than being fetched afterwards, so installation works behind a proxy, in a locked-down CI runner, and from an npm cache with no network at all. macOS and Linux, x64 and arm64.

Sign in

This opens your browser, you approve once, and the token is written to ~/.uncloud/config. Nothing is copy-pasted: the token is handed back to a one-shot server bound to 127.0.0.1 that the CLI started itself, and is only accepted when it carries the state nonce generated for that attempt.
Point the CLI at your own API and it will send you to your own console, where your session actually exists:
Set two environment variables and skip sign-in entirely. They override ~/.uncloud/config when present:
Mint a token with uncloud tokens create name=ci.

The shape of a command

Commands fall into three layers:

The daily loop

deploy, status, logs, env, scale, domain, db — the commands you run from a project directory, which need no ids.

Resources

Every control-plane resource, each with list, get, create, update, delete and its own verbs.

Raw API

uncloud api METHOD PATH for anything the other two layers do not cover.

Context: what a bare command means

Most commands need to know which project and which app you mean. Rather than making you type ids, the CLI resolves them in order and stops at the first answer: Project — the -project flag, then .uncloud/config.json in the current directory, then the project cached in ~/.uncloud/config, then your account’s default (fetched once, then cached). App — the -app flag, then .uncloud/config.json in the current directory. -app accepts a name or a slug, not just an app_ id:
The first uncloud deploy in a directory writes .uncloud/config.json with the app id, project id, and name. Commit it or do not — it only records which app this directory ships to.

Global flags

These work on every command and can be written anywhere in the line:
Deleting anything asks first. When stdin is not a terminal — CI, a cron job, an agent — there is nobody to ask, so the command refuses rather than assuming yes. Pass -y to mean it.

Output

Lists render as tables, with empty columns dropped so you are not reading a wall of blanks. Everything else prints as indented JSON.
Add -json for anything you intend to parse:

Configuration files

Environment variables UNCLOUD_API_URL and UNCLOUD_API_TOKEN override the stored config when set.