Skip to main content

Runku CLI guide

The Runku CLI manages an application's development and delivery workflow. It is separate from:

  • runku-server, the long-running Self-Hosted service operated on infrastructure;
  • @runku/server, the TypeScript declaration API used inside Functions;
  • @runku/client and /v1/query|mutation|action, which application users call at runtime;
  • the Management API, which controllers may use directly for broader administration.

Use this guide to choose a CLI workflow. Use the CLI reference for every flag, JSON output, exit code, and exact retry rule.

Install​

npm install --global @runku/cli
runku --version
runku --help

Supported released targets are macOS ARM64/x86-64, Linux GNU ARM64/x86-64, and Windows ARM64/x86-64. npm optional dependencies install the matching native executable. Installation with optional dependencies disabled cannot run the CLI.

Choose the workflow​

GoalCommandsState affected
start a local application backendinit, dev, status, doctor, logs.runku/ in the application root
validate/build application declarationsdev --prepare, buildgenerated types and immutable local build outputs
connect a directory to Self-Hostedlogin, linkprotected login store + non-secret root link
publish code to a remote Workspacepublish --remoteimmutable Dev Revision + Workspace HEAD
freeze/promote/rollback coderelease --remote, promote --remote, rollback --remoteRelease/Channel state through Management API
inspect remote application statestatus --remote, logs --remoteread-only remote queries

The CLI does not configure host disks, S3, PostgreSQL, TLS, backups, or process resource limits. Those belong to Self-Hosted administration.

Local development workflow​

From the application root:

runku init
runku dev --origin http://localhost:3000

init creates one local Project/Environment/Workspace identity when absent. dev builds the current runku/ directory, publishes an immutable development revision, moves the local Workspace only after success, serves the Product API on loopback, and watches for changes.

In another terminal:

runku status
runku doctor
runku logs --limit 20

Stop dev with Ctrl-C and wait for shutdown. Restarting reuses the same state. Do not delete .runku/ as troubleshooting; doing so destroys the local Environment.

See Local development for origins, JWT configuration, application dotenv reconciliation, state/backup, and diagnostic behavior.

Prepare without serving​

Use this in CI or before an explicit build:

runku dev --prepare
runku build

--prepare initializes/reconciles local application state and exits. build validates schemas, Functions, capabilities, runtime selection, and contracts; creates immutable outputs; and replaces the api and serverApi runtime/declaration pairs below runku/_generated; each file is replaced through an atomic rename. Do not edit generated files.

A build failure does not move a running Workspace from its last valid revision.

Authenticate to Self-Hosted​

runku login --url https://management.example.com

Login authenticates a Platform operator and stores the session in the CLI's protected user store. It does not create an Application Key or functional user token.

From an application root:

runku link

Interactive link lists Environments authorized to the logged-in operator. Automation can pass the exact Project and Environment IDs. The link records the trusted Management origin and selected scope; IDs alone do not grant permission.

Use:

runku login status
runku status --remote

to confirm the active operator, Management origin, Project, Environment, and current Release/ Channel state before publishing.

Publish a development revision​

Build first and take paths from JSON stdout:

runku build

Then publish to the linked remote Environment:

runku publish --remote \
--manifest /path/from-build/manifest \
--artifact /path/from-build/artifact \
--expected-head empty

Publishing stores immutable code and moves one Workspace HEAD under compare-and-set. If the expected head is stale, read remote status and reconcile with the other publisher. Do not keep retrying with invented state.

Freeze and promote​

runku release --remote --release rel_...
runku promote --remote \
--channel preview \
--release rel_... \
--expected empty
runku status --remote

release validates/freezes an immutable Release. promote changes traffic policy; it does not rebuild or mutate Release code. The Channel update requires its expected current state.

Before promotion, verify schema/index/Cron compatibility and application behavior against the exact Release. A Channel move never migrates or rolls back persistent data automatically.

Roll back traffic​

Use the exact CLI syntax and current expected Channel state from the CLI reference. Rollback changes the Channel/serving policy to an eligible historical Release. It does not:

  • undo documents written by newer code;
  • remove scheduled work;
  • reverse configuration or storage changes;
  • downgrade the Self-Hosted server binary/database.

Keep stored-data compatibility for the full rollout and rollback window.

Local versus remote commands​

ModeIdentityAuthorityFailure evidence
local (default)local application rootlocal .runku/ statelocal status/doctor/logs
--remoteCLI operator session + linked rootManagement capabilities in exact scopeHTTP status/code, operation ID, remote state/logs

Do not assume a command becomes remote merely because login exists. Use --remote only where the command explicitly supports it and confirm the linked scope.

Exit codes and automation​

CLI stdout is reserved for the command's documented human/JSON result; stderr carries bounded diagnostics. Automation must use the command's stable exit-code class and parse JSON only where the reference promises JSON.

Broad interpretation:

  • success: continue only after checking the returned resource/revision;
  • usage/validation error: fix input; identical retry is not useful;
  • authentication/authorization error: renew or correct scope/grants;
  • conflict: read current state and reconcile;
  • temporary unavailable/busy: bounded backoff only when operation semantics allow;
  • uncertain mutation: query operation/current state using the same operation identity;
  • corruption/inconsistency: stop mutation, preserve evidence, follow recovery procedure.

The CLI reference is authoritative for each command's exact exit codes.

Security rules​

  • never pass bearer/secret material in command arguments when a file/session mechanism exists;
  • keep the CLI login store private and revoke lost sessions;
  • do not commit .runku/, generated dotenv secrets, manifests containing private paths, or logs;
  • verify the Self-Hosted Management URL/TLS origin before login/link;
  • use separate operator grants for developers and CI publishers;
  • use CAS/expected values instead of force-updating remote state;
  • record version, origin, Project, Environment, Workspace, operation ID, and Release ID in CI evidence without recording tokens or application data.

What the CLI deliberately does not do​

  • It does not act as an end-user data client; use the TypeScript client or public HTTP API.
  • It does not define Function parameters or schema types; use the Function API reference.
  • It does not replace deployment configuration or backup tooling; use the operator handbook.
  • It does not make unsupported Kubernetes/separated-role assets a released installation profile.

For an end-to-end application delivery procedure, continue with Application development workflow.