Skip to content

CLI

Strøm provides two CLI binaries:

  • stroem — Local workspace tool for exploring and running tasks without a server
  • stroem-api — Remote server client for triggering jobs and querying a running Strøm server

Local workspace commands. No server required.

Terminal window
# 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.

Terminal window
# Run a task in the current directory
stroem run my-task
# Run from a specific workspace path
stroem run my-task --path /path/to/workspace
# Run with input
stroem run deploy --input '{"env": "staging"}'
# A file input field takes a local path
stroem 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.* }})
  • when conditions (skip steps based on expressions)
  • for_each loops (iterate over arrays)
  • The same dependency gate as the server: a step runs only when its whole depends_on tree is satisfied — each edge’s accept set (default: must complete) 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 skipped unreachable, matching server jobs
  • A when or for_each evaluation error fails that step, same as the server, instead of aborting the run
  • Masked step context for downstream templates: a completed step’s output, null for a skipped one, null plus error for a failed one — a failed loop’s partial array is never exposed to a step that reads it
  • Ctrl+C graceful 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: 0 when every failed step’s own continue_on_failure catches it, 1 when at least one failed step escaped uncaught (a downstream step’s continue_on_failure/accept never 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_each iterations always run sequentially regardless of the sequential setting
  • Only type: script with 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 workflow YAML files before deploying.

Terminal window
# Validate current directory
stroem validate
# Validate a specific path
stroem 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_skipped flag, or a malformed depends_on tree (duplicate siblings, empty all/any groups, empty or duplicate-entry accept lists) — a named, actionable error, not a silent warning (see the 0.18 upgrade guide). stroem run and 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: task actions, scheduler/webhook triggers). A reference with ref: is not resolved offline — it is skipped with a warning, like a library action

List all tasks in the workspace.

Terminal window
stroem tasks
stroem --path /path/to/workspace tasks

List all actions in the workspace.

Terminal window
stroem actions

List all triggers (scheduler and webhook) in the workspace.

Terminal window
stroem triggers

Show detailed information about a single task: input schema, flow steps with dependencies, hooks.

Terminal window
stroem inspect deploy-pipeline

Remote server commands. Requires a running Strøm server.

Terminal window
# Set the server URL (default: http://localhost:8080)
export STROEM_URL=http://localhost:8080
# Set authentication token (optional)
export STROEM_TOKEN=strm_your_api_key

Execute a task and create a new job.

Terminal window
# Trigger with default input
stroem-api trigger hello-world
# Trigger with input
stroem-api trigger hello-world --input '{"name": "CLI"}'
# Trigger in a specific workspace
stroem-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.

Check the status of a job.

Terminal window
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
Terminal window
# Tail (default: last 256 KiB)
stroem-api logs <job-id>
# Stream the whole log
stroem-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.

Terminal window
# List last 10 jobs
stroem-api jobs --limit 10

List tasks from the server (across workspaces).

Terminal window
# List all tasks
stroem-api tasks
# Filter by workspace
stroem-api tasks --workspace data-team

Cancel a running or pending job.

Terminal window
stroem-api cancel <job-id>

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).

Terminal window
stroem-api workspaces