Conduit CLI
Conduit CLI is how you configure, run, and operate Conduit — pipelines, connectors, processors, and the engine itself. It's built on Ecdysis, Conduit's own Go CLI framework.
This page is the exhaustive command reference. For narrower how-tos, see:
- Deploy and apply pipelines to a running server
- Structured errors & JSON output
- Exit codes
- Configuration — every
conduit runflag, env var, and config file field
Conventions that apply to every command
--json— every command supports it. Output is a single JSON object to stdout:{"command": "...", "ok": true|false, "summary": {...}, "result": {...}, "error": null}.ok/errorare always present;erroris only set on a hard command failure (bad input, unreachable dependency), never for domain findings (a validation run that finds problems isok:false,error:null, with the problems underresult). See Structured errors & JSON output.- Exit codes are deterministic:
0success ·1runtime/internal error ·2validation (bad input, not found, failed precondition) ·3environment (server/database/index unreachable). Some commands (doctor,connectors audit) reduce multiple findings to one exit code by taking the worst. See Exit codes. --quiet/-q— suppress passing/OK lines and progress chrome; print only warnings, failures, and the summary. Doesn't change the exit code.--no-color— disable colored/glyph output even on a color-capable terminal (glyphs also fall back to ASCII automatically when not a TTY, or whenNO_COLORis set).--yes/-y— skip an interactive confirmation prompt on a mutating command.- Global persistent flags on every command:
--api.grpc.address(address where a running Conduit is reachable) and--config.path(path toconduit.yaml).
Quick reference
| Command | Aliases | Needs a running server? | Summary |
|---|---|---|---|
conduit run | — | Start the Conduit server and run configured pipelines | |
conduit init | offline | Scaffold a workspace (conduit.yaml + directories) | |
conduit quickstart | — | Run an ephemeral demo pipeline, no config needed | |
conduit doctor | offline (optional) | Preflight checks: would conduit run succeed here? | |
conduit mcp | — | Run Conduit's MCP server for AI agents | |
conduit open docs | docs | offline | Open the Conduit documentation in a browser |
conduit config | offline | Show the resolved configuration | |
conduit version | offline | Print the Conduit version | |
conduit pipelines list | ls | yes | List registered pipelines |
conduit pipelines describe | desc | yes | Full static config of one pipeline |
conduit pipelines init | offline | Scaffold a pipeline config file | |
conduit pipelines validate | offline | Parse/validate one or more pipeline configs | |
conduit pipelines lint | offline | Validate + advisory warnings | |
conduit pipelines dry-run | offline | Validate + show the enriched graph run would load | |
conduit pipelines inspect | yes | Live status + per-stage state of one pipeline | |
conduit pipelines deploy | prefers live, falls back offline | Preview (and optionally apply) a pipeline's changes | |
conduit pipelines apply | prefers live, falls back offline | Apply a previously-previewed plan | |
conduit pipelines repair | offline | Preview/apply machine-fixable config fixes | |
conduit pipelines start | yes | Start a stopped pipeline | |
conduit pipelines stop | yes | Stop a running pipeline | |
conduit pipelines dev | — | run --dev sugar: hot-reload watcher | |
conduit connectors list | ls | yes (see --installed) | List pipeline connector instances, or installed plugin artifacts |
conduit connectors describe | desc | yes | Detail of one connector instance |
conduit connectors new | offline | Scaffold a new Go connector repository | |
conduit connectors install | offline | Install a standalone connector from the registry | |
conduit connectors uninstall | offline | Remove an installed standalone connector | |
conduit connectors audit | offline | Re-verify installed connectors against the registry | |
conduit connectors bundle | offline | Prepare an offline install bundle | |
conduit connector-plugins list | ls | yes | List connector plugins available to pipelines |
conduit connector-plugins describe | desc | yes | Detail of one connector plugin |
conduit processors list | ls | yes | List registered processor instances |
conduit processors describe | desc | yes | Detail of one processor instance |
conduit processors new | offline | Scaffold a new Go processor repository | |
conduit processor-plugins list | ls | yes | List processor plugins available to pipelines |
conduit processor-plugins describe | desc | yes | Detail of one processor plugin |
"Needs a running server" means the command dials the API of a conduit run
process. "offline" commands never do. deploy/apply are hybrid: they dial a
live server if one is reachable at --api.grpc.address and fall back to
opening the local store directly (see
Deploy and apply).
Top-level commands
conduit run
Starts the Conduit server and runs the pipelines under --pipelines.path.
Blocks until shutdown. See Configuration for the full
flag/env/config-file reference — highlights relevant here:
| Flag | Description |
|---|---|
--dev | Alias for --dev.enabled: watch --pipelines.path and hot-reload changes into the running engine as you save. A processor-only edit applies in place (no restart); a source/destination/topology edit applies via a labeled graceful restart; a bad edit is reported and never touches the running pipeline. |
--pipelines <path> | Alias for --pipelines.path. |
--api.allow-live-restart-apply | Authorize pipelines apply/MCP apply (from any client) to drain-and-restart a running pipeline. Off by default. See Deploy and apply. |
--config.path | Path to conduit.yaml. |
--dev is self-authorizing (running --dev and watching the output is the
authorization) — it does not set --api.allow-live-restart-apply, which stays
independently gated for the gRPC/HTTP/MCP surface.
conduit run
conduit run --dev
conduit run --dev --pipelines.path ./pipelines --dev.json
Exit codes: 0 on a graceful single SIGINT/SIGTERM; 130/143 on a
forced second signal (128 + signum). See Exit codes.
conduit init
Sets up a Conduit workspace in the current directory: writes conduit.yaml
and creates the pipelines, connectors, and processors directories. Does
not create a pipeline — that's conduit pipelines init.
| Flag | Description |
|---|---|
--path <dir> | Where to initialize the workspace. Default: current directory. |
conduit init
conduit init --path ./my-workspace
conduit quickstart
The fastest way to see Conduit working: scaffolds an ephemeral demo pipeline
(built-in generator → built-in log) and runs it immediately, in a temp
directory removed on exit, with in-memory state. Press Ctrl+C to stop.
| Flag | Description |
|---|---|
--json | Emit the demo's logs and records as JSON instead of human-readable text. |
conduit quickstart
conduit doctor
Offline, non-destructive preflight: "would conduit run succeed here?" Checks
config resolution/validation, database reachability, API address availability,
plugin directories, and (optionally) whether a running engine is reachable. It
does not start a Runtime — distinct from the running server's /readyz
and /healthz endpoints.
| Flag | Description |
|---|---|
--deep | Also run plugins.standalone_compat, which dispenses standalone connector plugin binaries in an isolated subprocess. |
--require-server | Fail (instead of warn) if the API server isn't reachable. |
--check <name> | Run only the named check(s); repeatable. --help lists all check names. |
--quiet / -q | Suppress passing checks. |
--no-color | Disable colored output. |
conduit doctor
conduit doctor --deep --json
conduit doctor --check db --check plugins.builtin
Exit codes: 0 every check passed (warnings never fail) · 2 invalid
configuration · 3 a required dependency (database, network address, or —
with --require-server — the API server) is unreachable.
conduit mcp
Runs Conduit's MCP server, registering pipeline operations as MCP tools that
are 1:1 with the CLI verbs and call the exact same engines: validate/lint/
dry_run/deploy/doctor/inspect are always available (deploy only
computes a diff + hash, never mutates); apply/start/stop/
scaffold_connector/scaffold_processor are additionally registered only
with --allow-mutations.
| Flag | Description |
|---|---|
--allow-mutations | Register the write tools. An operator/process-level switch — never agent-settable. |
--http <addr> | Serve the streamable-HTTP transport on this address instead of stdio (EXPERIMENTAL). Requires --token-file and --tls-cert/--tls-key. |
--token-file <path> | Bearer token file for --http (compared constant-time). |
--tls-cert <path> / --tls-key <path> | TLS cert/key for --http. |
--api-address <addr> | gRPC address of a running Conduit, dialed by the inspect/start/stop tools. |
Serves stdio by default (no auth needed — the agent owns the process).
--http is a network-daemon mode (systemd/container) and serves HTTP only
(never stdio simultaneously); it refuses to start unless both a bearer token
and TLS are configured — no plaintext, no unauthenticated HTTP.
conduit mcp
conduit mcp --allow-mutations --api-address localhost:8084
conduit mcp --http :8443 --token-file token.txt --tls-cert cert.pem --tls-key key.pem
See docs/operations/mcp-server.md in the conduit repo for the full transport
and hardening reference.
conduit open docs (alias: conduit docs)
Opens the Conduit documentation (conduitdata.io) in your default web browser.
conduit open docs
conduit docs
conduit docs at the top level is a hidden alias (it works, but doesn't show
in conduit --help) for conduit open docs.
conduit config
Prints the fully-resolved configuration Conduit would run with — flags, env
vars, and config file merged — using the same flags as conduit run.
conduit config
conduit version
Prints the current Conduit version.
conduit version
conduit pipelines (alias: conduit pipeline)
Initialize and manage pipelines.
list (alias ls)
Lists pipelines registered by a running Conduit. Requires a running server.
conduit pipelines list
conduit pipelines ls --json
describe PIPELINE_ID (alias desc)
Full static configuration detail of one pipeline: config, connectors (with their processors), pipeline-level processors, and DLQ config. Requires a running server.
conduit pipelines describe orders
conduit pipeline desc orders --json
init [PIPELINE_NAME]
Scaffolds a pipeline configuration file (offline — no running server
needed). With no flags, produces a runnable demo pipeline (generator →
log). --source/--destination select any built-in connector instead, or
--template <name> scaffolds a complete, ready-to-run pipeline from the
templates gallery.
| Flag | Description |
|---|---|
--source <name> | Source connector (any built-in). Default: generator (demo). |
--destination <name> | Destination connector (any built-in). Default: log (demo). |
--template <name> | Scaffold from a named vendored template. --template list enumerates the gallery. Mutually exclusive with --source/--destination. |
--pipelines.path <dir> | Where to save the file. Default: ./pipelines. |
--force | Overwrite an existing pipeline file at the destination path. |
--dry-run | Print the configuration that would be written, without touching the filesystem. |
--json | Machine-readable output (the rendered config, resolved path, and — with --template list — the template list). |
Refuses to overwrite an existing pipeline file at the destination path, returning
a structured error with a suggested fix unless --force is set. --dry-run never
writes, so it is exempt from that check.
conduit pipelines init
conduit pipelines init --source generator --destination s3
conduit pipelines init file-to-pg --source file --destination postgres --pipelines.path ./my-pipelines
conduit pipelines init --template list --json
conduit pipelines init --template postgres-cdc-kafka
conduit pipelines init --template generator-log --dry-run --json
validate <path>
Offline, errors-only check: runs the same parse, enrich, and validate steps
conduit run uses to load a pipeline config, without starting Conduit or
dialing its API. <path> is a single .yml/.yaml file, or a directory of
them (not recursed). Every problem in every file is reported — one bad file
never stops the rest from being checked.
| Flag | Description |
|---|---|
--quiet / -q | Suppress passing/OK lines. |
--no-color | Disable colored/glyph output. |
conduit pipelines validate pipelines/orders.yaml
conduit pipelines validate ./pipelines --json
Exit 0 if every pipeline is valid, 2 otherwise. See also lint (adds
advisory warnings) and dry-run (adds the enriched graph).
lint <path>
Everything validate checks, plus the parser's advisory warnings
(deprecated/renamed fields, unrecognized fields, config version fallback),
located by line and column. Offline, like validate.
| Flag | Description |
|---|---|
--strict | Escalate warnings to failures (exit 2). Validation errors always fail regardless. |
--quiet / -q | Suppress passing/OK lines. |
--no-color | Disable colored/glyph output. |
conduit pipelines lint pipelines/orders.yaml
conduit pipelines lint ./pipelines --strict --json
dry-run <path>
Everything validate checks, then reports the fully-enriched pipeline
graph conduit run would actually load: final connector/processor IDs,
injected DLQ defaults, and worker counts. Offline, no side effects.
| Flag | Description |
|---|---|
--resolve-plugins | Check that referenced builtin plugins exist (default: true). An unknown builtin fails (exit 2). Standalone plugin references stay advisory — not statically verifiable offline. |
--quiet / -q | Suppress passing/OK lines. |
--no-color | Disable colored/glyph output. |
conduit pipelines dry-run pipelines/orders.yaml
conduit pipelines dry-run ./pipelines --resolve-plugins=false --json
inspect PIPELINE_ID
The online, status-forward operational view of a running pipeline: live
status (running/stopped/degraded/recovering), any error, and a per-stage
summary of sources, destinations, and the DLQ. Unlike validate/lint/
dry-run, this dials the API. Use list to find pipeline IDs, describe for
full static config.
conduit pipelines inspect orders
conduit pipelines inspect orders --json
deploy <file>
Computes the diff between <file> and the pipeline's current state — one
create/update/delete per pipeline/connector/processor, each classified
in_place (safe on a running pipeline) or restart — without applying
anything. Emits a plan hash. Prefers a live server (if reachable at
--api.grpc.address); falls back to opening the local store directly if not.
See Deploy and apply for the full
workflow and the in-place/restart distinction.
| Flag | Description |
|---|---|
--apply | Compute the plan and apply it in one call (prompts for confirmation unless --yes). |
--yes / -y | With --apply, skip the confirmation prompt. |
--quiet / -q | Suppress per-change lines; print only the summary. |
--no-color | Disable colored/glyph output. |
conduit pipelines deploy orders.yaml
conduit pipelines deploy orders.yaml --json
conduit pipelines deploy orders.yaml --apply --yes
deploy never mutates on its own — only --apply (or apply itself) does.
apply <file>
Recomputes the plan for <file> and executes it, but only if --plan-hash
matches the freshly recomputed plan's hash exactly — a mismatch (the file or
the live pipeline changed since deploy computed that hash) refuses with
provisioning.plan_stale (exit 2), never partially applied.
| Flag | Description |
|---|---|
--plan-hash <hash> | The hash from conduit pipelines deploy. Required unless --yes. |
--yes / -y | Apply the freshly recomputed plan directly, without a hash. |
--no-color | Disable colored/glyph output. |
conduit pipelines apply orders.yaml --plan-hash 9f3a2c...
conduit pipelines apply orders.yaml --yes --json
Idempotent — applying an already-applied config computes an empty plan and
does nothing (exit 0). Against a running pipeline reached via a live
server, applying requires operator authorization
(--api.allow-live-restart-apply on the server) unless the change is entirely
live-swappable and taken via the in-place path — see
Deploy and apply.
repair <file>
Collects every finding validate/lint can find a structured, machine-appliable
fix for (a deprecated/renamed field, an unambiguous invalid /status value, a
negative processor /workers, an over-long /description) and shows the
proposed edit as a diff with a plan hash. Mutates nothing by default — edits the
config file only, never the pipeline store or a running pipeline.
| Flag | Description |
|---|---|
--apply | Apply the plan instead of only previewing it (safe fixes only, unless --fix selects others). |
--plan-hash <hash> | The hash from a prior repair read. Required with --apply unless --yes. |
--yes / -y | With --apply, apply the freshly recomputed plan directly. |
--fix <configPath> | Apply only the fix(es) at this configPath; repeatable. |
--escalate | Permit applying an explicitly --fix-selected data-path-adjacent fix (ack/position/checkpoint-adjacent config). Human-only — never available via MCP. |
--no-color | Disable colored/glyph output. |
conduit pipelines repair orders.yaml
conduit pipelines repair orders.yaml --apply --plan-hash 9f3a2c...
conduit pipelines repair orders.yaml --apply --yes --fix /processors/0/workers
Restart-class and data-path-adjacent fixes are never applied by default —
select one explicitly with --fix; a data-path-adjacent fix additionally
requires --escalate. Getting a repaired file into a running engine is still
deploy/apply.
start PIPELINE_ID
Transitions a stopped pipeline to Running against a live Conduit server. Requires a reachable server — there is deliberately no offline fallback (a started pipeline's goroutines only stay alive inside a long-running process).
conduit pipelines start orders
conduit pipelines start orders --json
Starting an already-running pipeline is refused with pipeline.running
(exit 2); nothing is mutated.
stop PIPELINE_ID
Transitions a running pipeline to UserStopped against a live server:
gracefully by default (drains in-flight records before returning), or
immediately with --force.
| Flag | Description |
|---|---|
--force | Skip the graceful drain and stop immediately. Positions are crash-safe and delivery is at-least-once, so this behaves like a crash on restart, not data loss. |
conduit pipelines stop orders
conduit pipelines stop orders --force --json
This command does not wait for the drain to fully settle before returning —
it reports the pipeline's status immediately after the transition RPC
returns, which may still be transitional. Stopping an already-stopped
pipeline is refused with pipeline.not_running (exit 2).
dev [dir]
Sugar for conduit run --dev [--pipelines.path dir]: starts a full Conduit
server with the hot-reload watcher enabled and pipelines.exit-on-degraded
forced off (so one intentionally-broken pipeline mid-edit doesn't take the
whole dev server down). Carries no watcher logic of its own — it's a thin
alias over run --dev.
conduit pipelines dev
conduit pipelines dev ./pipelines
conduit pipelines dev --dev.json
conduit connectors (alias: conduit connector)
list (alias ls)
Lists connector instances in pipelines registered by a running Conduit.
| Flag | Description |
|---|---|
--pipeline-id <id> | Filter connectors by pipeline ID. |
--installed | List installed connector plugin artifacts from the local install manifest instead — a completely different thing from a pipeline connector instance. Mutually exclusive with --pipeline-id. |
--index-url / --index-file | Registry index source, only consulted with --installed (for a best-effort "latest available" column). |
conduit connectors list
conduit connectors list --installed
describe CONNECTOR_ID (alias desc)
Detail of one connector instance and its attached processors.
conduit connectors describe connector:source
new [name]
Scaffolds a full connector repository from ConduitIO/conduit-connector-template
— SDK wiring, tests, CI, release workflow, acceptance test harness — ready to
build with no edits. Only --lang go is available today.
| Flag | Description |
|---|---|
--module <path> | Go module path, e.g. github.com/you/conduit-connector-<name> (required). |
--path <dir> | Destination directory. Default: ./conduit-connector-<name>. |
--git / --no-git | Initialize a git repository and first commit (default: on). |
--force | Overwrite the destination directory if it already exists. |
conduit connectors new s3 --module github.com/you/conduit-connector-s3
conduit connector new s3 --yes --json
install <name>[@version], uninstall <name>[@version], audit, bundle <name>[@version]
Registry connector-lifecycle commands — install/remove standalone connector
plugin artifacts, re-verify installed connectors against the registry index,
and prepare an offline install bundle. All are offline (they never dial the
running Conduit API; they operate directly on --connectors.path and the
registry index).
| Command | One-line summary |
|---|---|
install | Resolve, download, verify (signature + SLSA provenance), and install a connector artifact for this host's platform. |
uninstall | Remove an installed artifact and its manifest entry; refuses if a pipeline still references it, unless --force. |
audit | Re-verify every already-installed connector against the current signed registry index (catches a version yanked or publisher revoked after install). |
bundle | Package a fully-verified artifact + its signatures/provenance + the signed index snapshot into a tarball for fully offline installation elsewhere. |
conduit connectors install postgres@0.14.1
conduit connectors uninstall postgres --force
conduit connectors audit --json
conduit connectors bundle postgres@0.14.1 --os linux --arch amd64
See the connector registry guide (/docs/using/connectors/installing) for the
full flag reference, trust model, and offline-bundle workflow for these four
commands.
conduit connector-plugins
Aliases: connector-plugin, connectorplugins, connectorplugin,
connectorsplugins.
list (alias ls)
Lists connector plugins available to add to a pipeline — built-in and
standalone (installed under --connectors.path). Requires a running server.
| Flag | Description |
|---|---|
--name <substr> | Filter by name (substring match). |
conduit connector-plugins list
describe CONNECTOR_PLUGIN_ID (alias desc)
Full spec of one connector plugin: summary, author, version, and every source and destination config parameter (type, default, validations).
conduit connector-plugins describe builtin:postgres@v0.10.1
conduit processors (alias: conduit processor)
list (alias ls)
Lists processor instances registered by a running Conduit.
conduit processors list
describe PROCESSOR_ID (alias desc)
Detail of one processor instance: plugin, parent (pipeline or connector), condition, config settings, worker count.
conduit processors describe pipeline-processor
new [name]
Scaffolds a full processor repository from ConduitIO/conduit-processor-template
— SDK wiring, tests, CI, release workflow — ready to build with no edits. Same
flags as connectors new (--module, --path, --git/--no-git, --force).
Only --lang go is available today.
conduit processors new uppercase --module github.com/you/conduit-processor-uppercase
conduit processor-plugins
Aliases: processor-plugin, processorplugins, processorplugin,
processorsplugins.
list (alias ls)
Lists processor plugins available to add to a pipeline. Requires a running server.
| Flag | Description |
|---|---|
--name <substr> | Filter by name (substring match). |
conduit processor-plugins list
describe PROCESSOR_PLUGIN_ID (alias desc)
Full spec of one processor plugin: summary, author, version, and every config parameter.
conduit processor-plugins describe builtin:base64.decode@v0.1.0
JSON output
Every command in this reference accepts --json. Read commands that talk to
a running Conduit (pipelines list/describe/inspect, connectors list/
describe, processors list/describe, connector-plugins list/describe,
processor-plugins list/describe) emit the same shape as the
HTTP API. Newer (v0.17+) commands
(validate, lint, dry-run, doctor, deploy, apply, repair,
install/uninstall/audit/bundle, connectors new/processors new)
emit the shared {command, ok, summary, result, error} envelope described
above.
conduit pipelines list --json
--json makes the CLI scriptable and agent-legible: the same structured data,
without parsing table output. Errors are structured too — see
Structured errors & JSON output.
Exit codes are deterministic, so a script can branch on the kind of failure
without reading the error text — see
Exit codes.
