Skip to main content
Version: Next

Top-level configuration

An ArkFlow configuration describes the engine: logging, the health-check / control-plane server, the list of streams to run, and optional streaming jobs executed by the unified kernel. The file format is selected by extension — .yaml/.yml, .json, or .toml are all accepted.

logging:
level: info

health_check:
enabled: true
address: "127.0.0.1:8080"

streams:
- id: orders
input: { ... }
pipeline: { ... }
output: { ... }

jobs: [] # optional declarative streaming jobs, see "job" below

Top-level fields

FieldTypeRequiredDefaultDescription
streamsarray<stream>yes*Streams to run.
jobsarray<job>no[]Declarative streaming jobs (DAG + time + state + checkpoint) run by the unified kernel.
loggingobjectnosee belowLogging configuration.
health_checkobjectnosee belowHealth-check and control-plane server.

* Both streams and jobs default to empty lists; a jobs-only configuration is valid (declare streams: [] or omit it).

logging

FieldTypeRequiredDefaultDescription
levelstringnoinfoLog level: debug, info, warn, error.
file_pathstringnoWrite logs to this file instead of stdout.
formatstringnoplainLog format: plain or json.

health_check

Runs an HTTP server with /health, /readiness, and /liveness endpoints (useful for Kubernetes). The same server also hosts the optional control-plane API and the Hub agent when hub_url is set (see Control plane).

FieldTypeRequiredDefaultDescription
enabledbooleannotrueStart the health-check / control-plane server.
addressstringno127.0.0.1:8080Listen address.
health_pathstringno/healthOverall health endpoint path.
readiness_pathstringno/readinessReadiness endpoint path.
liveness_pathstringno/livenessLiveness endpoint path.
api_prefixstringno/api/v1Prefix for the versioned control-plane API.
api_tokenstringnoOptional Bearer token protecting control-plane operations and configuration.
cors_originsarray<string>no[]Browser origins allowed to call the control API. Empty denies cross-origin calls.
hub_urlstringnoHub URL for compute-node agent mode. Absent ⇒ standalone mode.
node_idstringnoStable identity this process reports to its Hub.
node_tokenstringnoShared node registration credential. Never included in reports.
agent_lease_ttl_msintegerno15000Lease duration (ms) a compute node advertises to its Hub.
agent_session_ttl_msintegerno3600000Hard lifetime (ms) of a Hub-issued agent session credential; the Agent re-registers transparently when it elapses.

stream

Each entry in streams is one independent processing pipeline. Stream fields are documented in depth in the Components section; the shape is:

FieldTypeRequiredDefaultDescription
idstringnostream-<index>Stable stream identifier (must be unique; used for WAL identity and Hub reporting).
inputobjectyesInput component (source).
pipelineobjectyesProcessor pipeline.
outputobjectyesOutput component (sink).
error_outputobjectnoOutput that receives batches a processor failed on.
bufferobjectnoBuffer / windowing strategy between input and processors.
durabilityobjectnoPer-stream WAL durability (see Delivery semantics).
temporaryarray<object>noTemporary storage tables for joins.

pipeline

FieldTypeRequiredDefaultDescription
thread_numintegerno1Number of processor worker tasks.
processorsarray<object>yesOrdered list of processor components.

job

Each entry in jobs is a declarative streaming job: an operator DAG with explicit event-time, state, checkpoint, and recovery settings. Jobs run locally through the same unified kernel as streams, and the same job shape is what the Hub distributes to compute nodes (see Distributed jobs).

jobs:
- id: local-job
version: 1
parallelism: 1
max_parallelism: 128
operators:
- { id: source, kind: source }
- { id: sink, kind: sink }
edges:
- { id: e1, from: source, to: sink, partitioned: true }
sources:
- operator_id: source
input_type: generate
config: { type: generate, context: '{"value": 1}', interval: 1s, batch_size: 10 }
time:
mode: processing_time
sinks:
- operator_id: sink
output_type: stdout
recovery: latest_checkpoint
FieldTypeRequiredDefaultDescription
idstringyesStable job identifier; must be unique across jobs.
versionintegeryesJob version; state-format compatibility on recovery is evaluated against it.
parallelismintegerno1Default task parallelism.
max_parallelismintegerno128Upper bound used for key-group partitioning.
operatorsarray<object>yesDAG nodes: id, kind (source, map, filter, aggregate, window, join, sink, udf), stateful, key_field, config.
edgesarray<object>no[]DAG edges: id, from, to, partitioned (key-group routing instead of same-subtask).
sourcesarray<object>no[]Attach a component input to a source operator: operator_id, input_type, config, time.
sinksarray<object>no[]Attach a component output to a sink operator: operator_id, output_type, config.
stateobjectnobackend (e.g. embedded_kv), namespace, ttl_ms, format_version, max_pending_transactions (positive; default 4096; raise it when a window sees very high per-window key cardinality, since one transaction is held per open window group or unacknowledged output). Required by stateful operators.
checkpointobjectnointerval_ms, retention, object_store_uri (e.g. file://... or s3://...).
recoverystringnolatest_checkpointlatest_checkpoint, latest_savepoint, or fail.

time (source event-time declaration)

FieldTypeRequiredDefaultDescription
modestringyesevent_time or processing_time.
timestamp_fieldstringnoField read as the event timestamp when mode: event_time.
watermarkobjectnostrategy (bounded_out_of_orderness (default) or monotonous), out_of_orderness_ms, idle_timeout_ms.
allowed_lateness_msintegerno0How far past the watermark late events are still accepted.
late_event_policystringnodropWhat happens to late events: drop, route, or update.
late_event_routestringnoOperator receiving routed late events when the policy is route.
note

Intermediate operator kinds (map, filter, aggregate, window, join, udf) are primarily produced by the streaming SQL compiler and the console DAG orchestrator today. Always run --validate before deploying: it performs the same deep build checks as startup and rejects unsupported operators or state backends explicitly. ./target/release/arkflow schema emits the authoritative JSON Schema, including the jobs fields, for editor completion.

Validate before running

Always validate a config first:

./target/release/arkflow --config config.yaml --validate

Or emit the full JSON Schema and point your editor at it for field-level completion:

./target/release/arkflow schema > arkflow.schema.json

A pre-generated schema ships with the documentation at /config-schema.json; see IDE auto-completion for editor setup.