CUBSTER Join the waitlist
DOCS / CLI

CLI

@cubster/cli is built on @cubster/assets. Log in with a pasted API key, upload files, and list/delete assets — from a terminal or from an agent, with clean --json output and predictable exit codes. It isn't published to npm yet — see the repo for local usage during development.

$ cubster login      # paste a csk_... key created at app.cubster.dev
$ cubster whoami
$ cubster upload ./hero.png --tags marketing,hero
$ cubster assets ls --type image
$ cubster assets rm <id>
$ cubster transcribe ./standup.m4a
$ cubster transcripts ls --status completed
Config & auth

Credentials resolve highest-precedence first: the --key/--base flags, then CUBSTER_API_KEY/CUBSTER_BASE_URL, then the config file (~/.config/cubster/config.json), then the SDK default base URL. cubster login writes that config file owner-only (0600). The full key is never printed, logged, or included in --json output — only its csk_xxxxxxxx… prefix is ever shown.

A command run with a key that lacks the route's service exits 1 with the API's own message printed as-is, e.g. This API key is not enabled for the 'transcription' service (enabled: assets). Create a key with that service at app.cubster.dev/account/keys.. With --json, the outcome also includes service and enabled fields.

cubster login

Prompts for a key (or takes --key non-interactively, for CI/agents), verifies it against /me, and stores it. Key management (create/list/revoke) isn't available here on purpose — manage keys at app.cubster.dev.

$ cubster login --key "$CUBSTER_API_KEY"  # non-interactive
cubster whoami

Prints the profile email, the credential's bound workspace, and the base URL in use. Signed in with an API key, it also prints a Services: line — the key's own service scope (a session credential has none to show).

$ cubster whoami
Email: you@example.com
Workspace: Acme (acme)
Base URL: https://app.cubster.dev
Services: assets, transcription
cubster upload <path>

A local file path (no stdin in this version). Flags: --name, --tags a,b, --workspace <id|slug>.

cubster assets ls / rm

ls — a table by default, a JSON array with --json; filter with --type, --search, --tags, --limit. rm <id> prompts for confirmation unless --yes is passed — and defaults to "no" (never deletes) when stdin isn't a TTY and --yes wasn't passed.

$ cubster assets rm abc123 --yes
cubster transcribe <path>

Upload a local audio file and transcribe it (Deepgram Nova-3). Flags: --name, --language <tag>, --no-diarize, --workspace <id|slug>. A file over the 4 MB cap is rejected locally, before anything is uploaded. A failed transcription still keeps the audio — the output includes a retry hint with the transcript id.

$ cubster transcribe ./standup.m4a --language en-US
Transcribed "standup.m4a" (t1) — completed, 1:33, 2 speaker(s)
[0] 0:00 Hi there.
[1] 1:33 Bye.
cubster transcripts ls / get / rm / retry

ls — a table by default, filter with --status/--limit. get <id> prints the same header + speaker-turn rendering as transcribe's success output. rm <id> deletes the transcript and its audio asset (confirmation prompt unless --yes). retry <id> re-runs a pending/failed transcript, reusing the stored audio — a completed transcript responds 409.

$ cubster transcripts get <id>
$ cubster transcripts retry <id>
Exit codes
0 Success
1 Runtime error (network/API failure, missing file, no key configured)
2 Usage error (bad flags, missing argument, unknown command)