CLI
The 9d9 CLI: push a directory — no account needed — and manage deploys.
Install
No install needed for one-off use — npx grabs the latest:
npx @9d9dev/cli deploy ./dist For repeat use, install globally so the 9d9 command is always on PATH:
npm i -g @9d9dev/cli Authenticate (or don't)
No account yet? Skip this. The first 9d9 deploy
(or 9d9 init) creates a site, saves its deploy key, and prints
a claim link for the owner.
Existing site? Generate an API key in your dashboard at Settings → New key. The secret is shown once. Save it locally:
9d9 set-key ak_xxx --org=org_xxx
Config is written to .9d9.json in the current directory.
Subsequent commands walk up from cwd to find it — so each repo gets its
own org binding. The file holds a secret: keep it out of git (the CLI
adds it to an existing .gitignore when it creates a site).
Commands
9d9 deploy [dir] [--name "Site name"] [--slug my-site]
Walks dir (defaults to .), uploads files in
parallel, commits a manifest, atomically activates the deploy. With no
key configured it first creates an unclaimed site — named by
--name, or after the project folder — and prints the claim
link.
- Skips dotfiles and
node_modules. - Content-hashes each file (sha256, first 16 hex chars) — used as the manifest fingerprint.
- Detects
404.htmland registers it as the deploy's not-found page. - Concurrency: 6 file uploads in flight.
- 25 MB per-file limit.
9d9 deploy ./dist
# Deploying 13 file(s), 127.2 KB total...
# Deploy dep_qXpgSbWcNGfoWy3PxJfE24Ls created.
# 10/13
# 13/13
#
# Active. Deploy dep_qXpgSbWcNGfoWy3PxJfE24Ls is live.
# https://your-slug.9d9.dev/ 9d9 init --name "Site name" [--slug my-site]
Creates a site without deploying and prints its org_id, URL
and claim link — handy when the build needs the org_id (forms,
analytics) or the final URL (sitemap, Open Graph).
9d9 claim
Reprints the claim link for an unclaimed site, or says it's already claimed.
9d9 deploys [list]
Lists recent deploys for the current site.
9d9 deploys
# active dep_qXpgSb... 13 files 2026-05-30T05:26:46.000Z
# superseded dep_DCAcX6... 4 files 2026-05-29T22:14:55.000Z 9d9 set-key <key> [--org=<org_id>]
Saves the API key and org ID locally.
9d9 status
Prints the current local config (token shown truncated).
9d9 logout
Clears local credentials.
Multiple sites on one machine
Each repo holds its own .9d9.json, so switching sites means
switching directories — no global state to forget about. For CI /
scripted use, override per-invocation with env vars:
NINEDENINE_API_KEY, NINEDENINE_API_URL.
Rolling back
The Deploys tab in the dashboard lists every deploy with an "Activate" button. Old deploys' files are preserved in R2 for 7 days. After that they're garbage-collected by a daily cron.