Install it, run uncloud login — the browser opens, you approve, the token
lands on your machine. From there every uncloud primitive — apps, droplets, Postgres, volumes,
domains, TLS — answers to your terminal, and to Claude Code holding the same token.
The CLI keeps one file — ~/.uncloud/config, mode 0600 — holding your
API URL and token. Everything else is stateless.
A single static Go binary — no runtime, no daemon, no agent to babysit. macOS and Linux, Intel and Apple Silicon, ~6 MB. Installs the agent skill into Claude Code, Codex, and opencode at the same time, for whichever you already run.
$ npm i -g uncloud-cli added 1 package · binaries for darwin + linux bundled uncloud: agent skill installed for Claude Code, Codex
$ curl -fsSL https://uncloud.club/install.sh | sh → downloading uncloud (darwin/arm64) ✓ installed → /usr/local/bin/uncloud
$ git clone https://github.com/TeamDukaan/dukaanUnCloud $ cd dukaanUnCloud/cli $ go build -o /usr/local/bin/uncloud .
No token to copy. uncloud login opens the console on a loopback callback, you approve
once, and the token is written to ~/.uncloud/config. Point it elsewhere with
-api if you self-host.
$ uncloud login Opening https://uncloud.club/cli/auth Waiting for you to authorize… done api https://api.uncloud.club project proj_default token uck_8f31a0c2… (saved to ~/.uncloud/config)
$ uncloud login -api http://localhost:8080 Opens the console that fronts that API, not uncloud.club.
# headless runners skip the browser entirely $ export UNCLOUD_API_URL=https://api.uncloud.club $ export UNCLOUD_API_TOKEN=uck_••••••••••••
Drop the uncloud skill into Claude Code. It carries the command grammar, the monorepo conventions,
and the failure table — so the agent knows uncloud db add exists before it guesses.
$ mkdir -p ~/.claude/skills/uncloud && curl -fsSL \ https://uncloud-cli.vercel.app/dl/skill.md \ -o ~/.claude/skills/uncloud/SKILL.md $ claude › deploy this repo and give it a production Postgres
# already cloned the repo? it ships with the skill $ mkdir -p ~/.claude/skills/uncloud $ cp skills/uncloud/SKILL.md ~/.claude/skills/uncloud/
The agent doesn't wrap a toy subset. It holds the same token your terminal does, which means the whole control plane — build, provision, attach, scale, expose — is in reach of a sentence.
Nothing to wire up: installing the CLI drops the skill into Claude Code, Codex, and
opencode — whichever of them you already run, and none that you don't. Re-run it any time with
uncloud skill install, or check what's where with
uncloud skill status.
One markdown file. It carries the command grammar, the exit codes an agent branches on, and the failure tables — so the agent fixes a broken build or an expired token itself instead of handing you the error. Drop it in the skills directory above.
Ship this repo. It's a monorepo — api, web, worker.
uncloud deploy all -project proj_default
→ 3 apps created · 3 builds submittedGive the api a production Postgres and write the .env.
uncloud db add -workload production -storage 20
→ 3 replicas · pooler · DATABASE_URL writtenSpin me two 4-vCPU boxes in the Mumbai region.
POST /api/v1/droplets ×2
→ dpl_9fa2, dpl_9fa3 · provisioning → activePut api.myapp.com on it with TLS.
POST /api/v1/apps/{id}/domains
→ ACME issued · cert stapled · liveWhy did the last build fail?
GET /api/v1/apps/{id}/build-log
→ step 4: missing lockfile · patch suggestedAttach a 100 GB volume to the worker and back it up nightly.
POST /api/v1/volumes · POST /api/v1/backup/policies
→ vol_31c8 mounted · policy 02:00 ISTA dozen verbs cover the daily loop, and every control-plane resource takes the same
five — list, get, create,
update, delete. Anything left over is
uncloud api, same token, same REST surface.
~/.uncloud/configanywhere.uncloud-apps and deploy every listed path in one passrepo rootKEY=value into itproject root-workload dev|production, -storage GB — and print the .envproject rootThere is no privileged dashboard path. The web console is a client of the same API your agent is holding — so nothing is locked behind a UI.

Tarball or Git builds, replicas, env, domains.

KubeVirt VMs on your own metal.

Postgres — dev single, production HA.

S3-compatible buckets and block volumes.
Git or tarball builds, replicas, env, domains, build logs.
KubeVirt VMs on your own metal, plans and regions.
Postgres as a StatefulSet — dev single, production HA + pooler.
PVCs you attach, resize, snapshot and detach.
S3-compatible buckets, objects, presigned URLs.
Register providers, add nodes, provision capacity.
Build and deploy stages with per-step runs.
Scheduled workloads with history and alerts.
Policies and jobs across volumes and databases.
Users, groups, roles, project-scoped access.
Event rules and deliveries with replay.
Keys pushed into droplets at provision time.
Signing in to the console is how you prove you're you. Minting a token is how you lend that proof to a machine — with a smaller blast radius and a kill switch.
uncloud login, or mint one by hand in Settings → API tokenssha256:… server-side. The plaintext is shown once.~/.uncloud/config, mode 0600Authorization: Bearer … + X-Project-ID# the CLI is a convenience — the API is the contract $ curl -s https://api.uncloud.club/api/v1/apps \ -H "Authorization: Bearer $UNCLOUD_API_TOKEN" \ -H "X-Project-ID: proj_default" | jq '.apps[] | .name' "orbit-api" "orbit-web" "orbit-worker"
# .github/workflows/deploy.yml - run: npm i -g uncloud-cli - run: uncloud deploy all env: UNCLOUD_API_URL: https://api.uncloud.club UNCLOUD_API_TOKEN: ${{ secrets.UNCLOUD_API_TOKEN }}
uncloud login actually work?+/cli/auth with that callback and a
random state nonce. You're already signed in there, so approving mints a project-scoped token and redirects it
back to 127.0.0.1. The console refuses any callback that isn't loopback, and the CLI refuses any
callback that doesn't carry back the exact nonce it generated — so the token only ever travels between two
processes on your own machine..uncloud-apps file at the repo root — one path per line — and
uncloud deploy all walks it. Each app keeps its own .uncloud/config.json with its
app id, so subsequent deploys from a subfolder just work.UNCLOUD_API_URL at your own control plane — http://localhost:8080 in
development. The CLI has no hard-coded host.Install the binary, mint a token, and let the agent do the provisioning while you keep writing code.