CLI
Strøm provides two CLI binaries:
stroem— Local workspace tool for exploring and running tasks without a serverstroem-api— Remote server client for triggering jobs and querying a running Strøm server
stroem (Local)
Section titled “stroem (Local)”Local workspace commands. No server required.
# Set the workspace path (default: current directory)stroem --path /path/to/workspace <command>Run a task locally without a server. Loads the workspace, walks the task’s DAG, and executes each step via the local shell runner. Only type: script with runner: local (default) is supported — docker, pod, task, agent, and approval steps are rejected upfront.
# Run a task in the current directorystroem run my-task
# Run from a specific workspace pathstroem run my-task --path /path/to/workspace
# Run with inputstroem run deploy --input '{"env": "staging"}'
# A file input field takes a local pathstroem run import-report --input '{"data_file": "./report.csv"}'For a file input field the value in --input is a local path. The CLI checks that it is a regular file and copies it read-only to {temp}/stroem-run-inputs-{uuid}/{file_id}/{safe_name}, so the path in the script has the same shape as on a server. The directory is removed when the run ends. A required file field with no value fails with Input field '…': a file is required.
Supports:
- DAG dependency ordering
- Template rendering (
{{ input.* }},{{ step.output.* }},{{ secret.* }}) whenconditions (skip steps based on expressions)for_eachloops (iterate over arrays)- The same dependency gate as the server: a step runs only when its whole
depends_ontree is satisfied — each edge’sacceptset (default: mustcomplete) names which of the dependency’s outcomes let it through, independent of any flag on the dependent itself. An untolerated failure no longer aborts the whole run — independent branches keep going, and unreached dependents are skippedunreachable, matching server jobs - A
whenorfor_eachevaluation error fails that step, same as the server, instead of aborting the run - Masked step context for downstream templates: a completed step’s output,
nullfor a skipped one,nullpluserrorfor a failed one — a failed loop’s partial array is never exposed to a step that reads it Ctrl+Cgraceful cancellation (still aborts the run and exits non-zero — there is no step-level cancellation locally)OUTPUT: {json}parsing for step outputs- Exit code reflects the run’s outcome, not a raw failure count:
0when every failed step’s owncontinue_on_failurecatches it,1when at least one failed step escaped uncaught (a downstream step’scontinue_on_failure/acceptnever excuses someone else’s failure). When every failure was caught, the run prints one extra line after the summary counts:Every failure was caught by continue_on_failure.
Limitations:
- Steps execute sequentially, even when the DAG allows parallelism
for_eachiterations always run sequentially regardless of thesequentialsetting- Only
type: scriptwith local runner is supported — docker, pod, task, agent, and approval steps are rejected - Summary counts are diagnostic only: a successful loop counts as one step in the tally, while a failed loop’s instances are each counted individually
validate
Section titled “validate”Validate workflow YAML files before deploying.
# Validate current directorystroem validate
# Validate a specific pathstroem validate /path/to/workspace/.workflows/The validator checks:
- YAML syntax and structure
- Action type validity
- Runner field validity
- Flow step and dependency references
- DAG cycle detection
- Trigger cron expression syntax
- Hook action references
- Dependency shape: a leftover
continue_when_skippedflag, or a malformeddepends_ontree (duplicate siblings, emptyall/anygroups, empty or duplicate-entryacceptlists) — a named, actionable error, not a silent warning (see the 0.18 upgrade guide).stroem runand job creation on the server enforce the same check; loading a workspace on its own does not. ref:values (Git Refs): the ref’s syntax, and that it appears only where it is supported (flow-step actions,type: taskactions, scheduler/webhook triggers). A reference withref:is not resolved offline — it is skipped with a warning, like a library action
List all tasks in the workspace.
stroem tasksstroem --path /path/to/workspace tasksactions
Section titled “actions”List all actions in the workspace.
stroem actionstriggers
Section titled “triggers”List all triggers (scheduler and webhook) in the workspace.
stroem triggersinspect
Section titled “inspect”Show detailed information about a single task: input schema, flow steps with dependencies, hooks.
stroem inspect deploy-pipelinestroem-api (Remote)
Section titled “stroem-api (Remote)”Remote server commands. Requires a running Strøm server.
# Set the server URL (default: http://localhost:8080)export STROEM_URL=http://localhost:8080
# Set authentication token (optional)export STROEM_TOKEN=strm_your_api_keytrigger
Section titled “trigger”Execute a task and create a new job.
# Trigger with default inputstroem-api trigger hello-world
# Trigger with inputstroem-api trigger hello-world --input '{"name": "CLI"}'
# Trigger in a specific workspacestroem-api trigger etl-pipeline --workspace data-team --input '{"date": "2025-01-01"}'
# Give a file to a file input field (repeatable)stroem-api trigger import-report --file data_file=./report.csv--file FIELD=PATH uploads the file (streamed), then executes the task with the file ID as the value of FIELD. A key that appears in both --input and --file is an error. See File Inputs.
status
Section titled “status”Check the status of a job.
stroem-api status <job-id>View the logs of a job. Prints the last 256 KiB of the log (whole lines) by default and, when the log is longer, a note on stderr:
note: showing the last 256.0 KiB of up to 83.3 MiB; use --full for the whole log# Tail (default: last 256 KiB)stroem-api logs <job-id>
# Stream the whole logstroem-api logs <job-id> --full
# Ask for a different tail size (max log_storage.read.tail_max_bytes, 4 MiB by default)stroem-api logs <job-id> --tail-bytes 1048576--full and --tail-bytes are mutually exclusive.
Against a server older than this release, --full receives the old full-log JSON body (no streaming) and holds it in memory before printing, instead of streaming NDJSON.
List recent jobs.
# List last 10 jobsstroem-api jobs --limit 10List tasks from the server (across workspaces).
# List all tasksstroem-api tasks
# Filter by workspacestroem-api tasks --workspace data-teamcancel
Section titled “cancel”Cancel a running or pending job.
stroem-api cancel <job-id>workspaces
Section titled “workspaces”List all configured workspaces on the server: name, task / action / trigger counts ((off) when the server config disables the workspace’s triggers), and the display name and description from the server config (- when unset).
stroem-api workspaces