@krovacloud/cli
v0.6.11
Published
Krova Cloud CLI (krova) — manage Cubes (Firecracker microVMs), browse the catalog, and log in, from your terminal.
Maintainers
Readme
@krovacloud/cli
The Krova Cloud command-line interface (krova) — manage Cubes (Firecracker
microVMs), browse the catalog, log in through your browser, and SSH into a Cube,
all from your terminal. A pure Node.js CLI built on
@krovacloud/sdk — no native
binary, no Go toolchain.
npm i -g @krovacloud/cli
krova --helpRequires Node.js ≥ 20.
Log in
krova login # browser device-authorization flow
# or paste an API key:
krova auth login # prompts (hidden) for a kro_… key
krova whoami # confirm the active context + spaceCredentials are stored in ~/.config/krova/config.json (mode 0600), as named
contexts — switch accounts/spaces like kubectl/aws profiles. The file
format is compatible with the previous CLI, so existing logins keep working.
krova context list
krova context use <name>
krova context rename <old> <new>
krova context delete <name>Cubes
krova list # list Cubes (alias: krova cubes list, ls)
krova get <cube> # show one Cube (name or ID)
krova cubes create \
--name web --image ubuntu-24.04 \
--vcpu 1 --ram 1 --disk 10 \
--ssh-key "$(cat ~/.ssh/id_ed25519.pub)"
krova cubes power-off <cube>
krova cubes wake <cube>
krova cubes restart <cube> # cold restart — the only way to pick up a new kernel
krova cubes ssh-port <cube> --port 2222 # in-Cube sshd port, NOT the host port
krova cubes delete <cube><cube> is a Cube name or ID — a unique name resolves automatically.
SSH
krova ssh <cube> # interactive shell
krova ssh <cube> -- uname -a # run a command non-interactively
krova ssh <cube> -i ~/.ssh/id_ed25519 -L 8080:localhost:80The CLI fetches the Cube's SSH endpoint — including which user to log in as
— so you never have to remember it. That is ubuntu on Ubuntu images and
debian on Debian images, both with passwordless sudo (sudo su for a root
shell); Cubes created before August 2026 log in as root. Direct root SSH is
disabled on the newer images, which is why the CLI reads the user from the API
rather than assuming one.
When the server provides them the CLI also pins the host keys to
~/.config/krova/known_hosts with strict host-key checking (no
trust-on-first-use window). The destination is always passed after
a -- separator, with host/user validated against option-injection — a hostile
value aborts before ssh ever runs.
Domains, snapshots & TCP mappings
Manage a Cube's attached resources. All take a <cube> name or ID and support
--json.
# Custom domains
krova domains list <cube>
krova domains add <cube> --domain app.example.com --port 8080
krova domains records <cube> <domain-id> # the DNS records the domain needs,
# and whether each one resolves yet
krova domains rm <cube> <domain-id>
# Reach the Cube over HTTPS instead of cleartext — only for a Cube that
# terminates TLS itself (a control panel with its own certificate). Visitors
# are on HTTPS either way.
krova domains add <cube> --domain panel.example.com --port 443 --origin-scheme https
krova domains set-origin <cube> <domain-id> https
# Send a PROXY protocol header naming the visitor on each connection to the
# Cube, for an app that reads the visitor from the connection. The app must
# accept it on that port first. Every domain on the same Cube port needs the
# same setting; add --confirm-mixed-proxy-protocol to save a mix anyway.
krova domains add <cube> --domain app.example.com --port 8080 --proxy-protocol v2
krova domains set-proxy-protocol <cube> <domain-id> v2 # or v1, or off
# Snapshots + restore
krova snapshots list <cube>
krova snapshots create <cube> --name nightly
krova snapshots restore <cube> <snapshot-id> # replaces the Cube's disk
krova snapshots rm <cube> <snapshot-id>
# TCP port mappings (expose a Cube port on the host)
krova tcp list <cube>
krova tcp add <cube> --port 5432 --whitelist 203.0.113.4/32
krova tcp rm <cube> <mapping-id>Backups
A backup is a Cube's disk and configuration, kept after the Cube is gone. A backup is named or given by ID.
krova backups list
krova backups get nightly
krova backups download nightly # prints a link valid for 15 minutes; anyone holding it can download the disk
# Offer another space its own copy. It has 48 hours to accept, and pays for its copy from then.
krova backups share nightly <destination-space-id>
krova backups shares # pending shares into and out of this space
krova backups accept <share-id> # in the destination space
krova backups decline <share-id>
krova backups cancel <share-id> # withdraw one this space offeredThese need the Backups permissions on the key's member: View Backups for list, get and shares, Manage Backups for the rest. Accepting or declining also works for the destination space's owner.
Catalog
krova regions # regions with available capacity
krova images # OS images
krova pricing # per-resource hourly pricingWebhooks
krova webhooks listen --secret "$KROVA_WEBHOOK_SECRET"
# verifies each delivery's HMAC signature and prints the eventGlobal flags
Available on every command (flag > env var > context):
| Flag | Env | Purpose |
| --- | --- | --- |
| --api-key <key> | KROVA_API_KEY | API key |
| --space <id> | KROVA_SPACE_ID | Space ID (else auto-detected) |
| --base-url <url> | KROVA_BASE_URL | override the API base URL |
| --context <name> | KROVA_CONTEXT | select a named context |
| --json | | machine-readable JSON output |
| --timeout <dur> | | per-request timeout (e.g. 30s); defaults to 30s |
License
MIT
