One binary, nauka. Global flags: --data-dir <dir> (default
./nauka-data, only used by local-store commands), --token (prefer the
NAUKA_TOKEN env var — argv is visible in ps), --keys <dir>. On an
initialized machine, commands that need the cluster identity inherit it
from /etc/nauka/nauka.env automatically.
Everywhere a file hash is expected, a unique prefix works (≥ 4
characters, git-style): nauka get 18445b -o x.
turns this machine into the first node: dedicated user, identity in /etc/nauka, hardened systemd unit, founds the cluster. Root + systemd only; --advertise <ip>:7311 to override detection
node add <ip>:7311
provisions a machine over SSH and joins it — convergent: blank → joined, member → re-affirmed, replaced → stale identity evicted. --ssh-user, --force (wipe), --peers
node disable <ip:port>
drains a member WITHOUT removing it: it stays a voter and keeps serving reads, but leaves the placement view — the others take over its shards (proof-gated) and its store empties. Reversible with node enable. Watch it in nauka top; at 0 B, removal is instant
node enable <ip:port>
puts a drained node back into the placement view; shards migrate back over the next scrubs
node remove <id>
drops a member from the cluster; after a disable drain, instant and safe
serve
runs a node in the foreground — what the systemd unit calls. --listen 0.0.0.0:7311, --advertise, --join (wait to be added instead of founding), --http, --metrics, --scrub-interval 30, --capacity, --egress-quota, --cache-size, --extent-cache-size. Co-hosted nodes: space --listen ports by ≥ 2
the authenticated live, full-screen cluster view (htop-style): per-node fill with sparklines, migration rates during a rebalance, the registry one keypress away (2, type to filter). --api <url>, --interval <s>
The multi-tenant layer: organisations are the
engine’s clients, spaces their storage units, keys what signs their
requests.
Command
What it does
org create <name>
creates an organisation (lowercase, digits, dashes)
org list
organisations and their spaces, with status
org suspend <name> / org resume <name>
cuts / restores everything under the org, cluster-wide
org rm <name>
deletes the org — refused while it still has spaces
space create <org>/<name>
creates a space; --public serves its files bare (direct links)
space list [org] / space suspend / space resume / space rm
same verbs, space-scoped — rm refused while the space still references files
space files <org>/<name>
the files the space references, with sizes and total
space key add <org>/<name> --role admin|signer
generates a keypair locally, registers the public half; prints the private key ONCE. --name for rotation handles, --public-key <hex> to register an externally-generated key
space key ls / space key rm <space> <name-or-prefix>
list keys / revoke one — its signatures die cluster-wide
space sign <space> --key nsk_…
signs a write offline and prints the X-Nauka-* headers plus a ready-to-paste curl. --method, --path, --content-hash to bind the exact bytes
space link <space> <hash> --key nsk_…
mints a signed READ link offline (--ttl seconds or absolute --exp, --rate bytes/s and --conc max simultaneous connections, both bound into the signature); works with signer and admin keys
space set <space> --rate-default <bytes/s|off> --quota <bytes|off> --egress-quota <bytes|off>
the space’s policies: bare-read speed, storage cap (uploads refused past it), monthly egress cap (reads crawl past it)
space usage <space> / org usage <org>
consumption against the caps
org set <org> --quota <bytes|off>
cap on the sum of the org’s spaces
space publish <space> <hash> [--to <space>] --key nsk_…
references an existing file from another space of the same org (no re-upload) — publish to a public space, or adopt an unowned legacy file without --to
Commands exit 0 on success, 1 on any failure, with the error chain on
stderr. Machine-readable surfaces: status --json, the token on stdout
(reminders go to stderr), and the HTTP API for everything a
script should really be doing.