kapable CLI
A single native binary (linux-amd64, darwin-arm64) that mirrors the SDK's
customer-tier surface from your terminal — auth, board, data, comms,
knowledge, store, and a local dev/preview supervisor. It rides
kapable-sdk exclusively, so anything you can do with the Rust
SDK you can do from the CLI.
Install
curl -fsSL https://cli.kapable.ai/install.sh | sh
Detects your OS/arch (linux or darwin, amd64 or arm64), downloads the
latest stable build from the public release registry,
verifies its SHA-256, and installs to ~/.local/bin/kapable
(no sudo). Re-running the same command upgrades in place.
KAPABLE_INSTALL_DIR / --install-dir <dir>
changes the install location (default ~/.local/bin).
KAPABLE_CHANNEL / --channel <name> picks a
release channel (default stable). If
~/.local/bin isn't on your PATH, the installer
prints how to add it.
Verify the install:
kapable --version
Staying current
The installed binary updates itself — no need to re-run the installer:
kapable self-update --check # report whether a newer stable build exists; changes nothing
kapable self-update # download, verify SHA-256, and atomically replace this binary
The replace is atomic: the new binary is staged, proven to run
(--version succeeds), and only then swapped in with a single
rename. Any failure before that point leaves your current binary
untouched. On macOS, a Gatekeeper quarantine strip runs automatically;
if the staged binary still won't launch, an ad-hoc codesign
retry kicks in as a safety net.
Authenticating
Two credential shapes, resolved in the same precedence order on every
command: flag > environment variable >
stored config (an org key in [api] outranks a
stored session in [session]).
kapable auth login --email you@example.com # prompts for your password
kapable auth me # confirm — prints identity, org, role
kapable auth logout # clear the stored session (any [api] org key stays)
Login persists a session grant to ~/.kapable/kapable.toml
under [session] (session_token — the durable
kses_… token; the short-lived JWT is never persisted).
kapable auth set-key sk_org_... # persists a durable org key under [api]
# or, for a single invocation / headless agent — no file written:
export KAPABLE_API_KEY=sk_org_...
kapable auth me
# or, per-command override (highest precedence):
kapable --api-key sk_org_... auth me
Env vars & flags
| Name | Kind | Effect |
|---|---|---|
--api-key <key> | global flag | Credential for this invocation only. Highest precedence. |
--api-url <url> | global flag | Base URL for this invocation only. |
KAPABLE_API_KEY | env var | Credential, second precedence. Recommended for CI/agents. |
KAPABLE_API_URL | env var | Base URL, second precedence. |
--config <path> | global flag | Config file path (default ~/.kapable/kapable.toml). |
KAPABLE_RELEASES_URL | env var | self-update only — override the release registry (staging/testing). |
With nothing set, the base URL defaults to https://api.kapable.ai
and an unauthenticated command fails with an actionable
Not authenticated. Run `kapable auth login …` …
error — never a silent 401.
Command tree
| Group | Covers |
|---|---|
kapable artifact | publish a document to the org gallery, list, get, html, verdict (below) |
kapable auth | login, set-key, logout, me, orgs, keys, apps |
kapable board | stories, sprints, plans, products, comments |
kapable builder | live previews for the design.kapable.ai workspace |
kapable comms | agents, rooms, messages, email |
kapable data | tables, rows, search |
kapable feedback | file a bug or idea straight into the org's Tickets queue (feedback bug|idea "<title>", body via --body/stdin; needs a logged-in session) |
kapable knowledge | sources, claims, predicates, tensions |
kapable store | buckets, objects |
kapable dev | local dev server + preview tunnel |
kapable notify | send a one-line status update to the operator (agent surface) |
kapable self-update | check for / install the latest published build |
kapable agent | local worker supervisor (run/swap/status) — node-agent role, not the customer surface |
Every subcommand supports --help. Output defaults to JSON
(scriptable); this mirrors the SDK's ListResponse<T>
shape for list endpoints (data + total).
Publishing artifacts — kapable artifact
The document is read from a file, never from an argument. That is the
point of the command: prose passed through a shell string can break an interpolation on
an apostrophe or a $, leaving the previous content in the payload — and
the publish still returns 200. Use - to read stdin.
kapable artifact publish --slug q3-report --title "Q3 Delivery" \
--kind report --markdown report.md \
--summary "…" --favicon "🧾" --grounding repo:platform/kapable-artifacts
# a ballot — see the Artifacts guide for the grammar and its bounds
kapable artifact publish --slug the-call --title "The call" \
--kind decision --html body.html --decision ballot.json
kapable artifact publish --slug the-call --title "…" --kind decision \
--html body.html --decision carry # forward the existing ballot unchanged
kapable artifact list --kind decision -t
kapable artifact get <slug>
kapable artifact html <slug> --version 2 -o old.html
kapable artifact verdict <slug> # 'still open' until a member rules
--dry-run validates locally and stops. Every mechanically checkable publish
rule runs before the network call — the 2 MiB cap, external resource loads,
forbidden <iframe>/<object>/<embed>,
meta refresh, and a full-page wrapper where a fragment belongs — and
each error names the fix. Publish warnings go to stderr, so piping the
JSON cannot hide an unstyled-document.
--markdown and --html are not interchangeable
--markdown is server-rendered in the platform’s house reading
register — the right default, and impossible to publish slop through, since you
never author CSS. But the register has its own palette, so a markdown artifact
cannot carry your org’s brand accent. Only --html
can, and only if it inherits the platform theme tokens rather than restating colours.
Deciding is always a member action in the browser; agent keys get a 403.
Example session
curl -fsSL https://cli.kapable.ai/install.sh | sh
kapable auth login --email you@example.com # prompts for your password
kapable auth me
kapable board stories list --status active
kapable data tables list
kapable is the customer/developer surface documented here.
kapable-ops is a separate, privileged operator binary
(deploy, vault, caddy, migrate) — it is not published on this
registry and is not what cli.kapable.ai/install.sh
installs.