This is the multi-page printable view of this section. .
Documentation
- 1: Introduction
- 1.1: What is Eventboat?
- 1.2: Architecture
- 2: Get Started
- 2.1: Installation
- 2.2: Your First Pipeline
- 3: Reference
- 3.1: CLI Reference
- 3.2: Configuration
1 - Introduction
1.1 - What is Eventboat?
Eventboat routes events through directed acyclic graphs (DAGs) of transforms — from sources (Kafka, HTTP, cron, SQL, files) to sinks (Kafka, HTTP, files), with at-least-once delivery, dead-lettering, and replay.
It is agent-native: every capability is accessible through MCP (Model Context Protocol), CLI, and a language server — so AI agents can write, verify, deploy, and operate pipelines autonomously.
What makes it different
| Dimension | Approach |
|---|---|
| Predicates | CEL (Kubernetes standard) — zero custom DSL, huge training corpus |
| Transforms | Starlark (Python dialect, sandboxed, deterministic) |
| Verification | Four machine gates: verify, test, explain, operate |
| Reliability | Seven invariant tests, spool/settle/checkpoint engine on SQLite |
| Jobs | Cron scheduling, catchup windows, typed parameters, backfill |
| Extension | CEL → Starlark → WASM → gRPC out-of-process plugins |
| Interop | CESQL dialect (CloudEvents), official TCK 100% |
The one-line pitch
Eventboat lets AI agents build and run event pipelines that don’t lose messages — because machines verify every step before it goes live.
1.2 - Architecture
Three-layer model
- Config layer: YAML parsing, strict schema validation, variable substitution
- Static IR: validated DAG + precompiled CEL programs + Starlark programs + schema
- Runtime: spool + settle + checkpoint engine, consuming only the IR
Reliability model
- Spool: every message hits SQLite before the DAG sees it (invariant 1)
- Settle: each message settles when all branches reach terminal state
- Checkpoint: advances only over settled prefix (invariant 2)
- Crash recovery: kill -9 → restart → replay from checkpoint, never lose (invariant 3)
- Dead letters: exhausted retries → DLQ store with query + replay CLI
Seven invariant tests
Each has a dedicated test that must pass in CI:
- Spool before visible
- Checkpoint advances only after settle
- Kill -9 replay covers all unsettled
- Dead-letter write failure blocks settle
required: falseedges don’t block siblings- Redelivery keeps message ID stable
- Cursor watermark never exceeds settled
Four machine gates
| Gate | Command | What it does |
|---|---|---|
| verify | eventboat verify | Schema, topology, CEL+Starlark compile, lint — static, zero side effects |
| test | eventboat test | Contract tests against the real engine — fixture in, assertions out |
| explain | eventboat explain --message sample.json | Deterministic path walkthrough with real CEL evaluation and Starlark dry-run |
| operate | eventboat mcp | MCP server: 15 tools covering the full agent lifecycle |
2 - Get Started
2.1 - Installation
Prerequisites
- Go 1.25+ (for building from source)
- No runtime dependencies — everything is compiled into one binary
Install
Verify:
You should see the help screen with 11 commands listed.
What’s in the binary
| Component | Included |
|---|---|
| Engine (spool/settle/checkpoint) | ✅ |
| CLI (verify/test/run/trigger/jobs/explain/replay/repl/lsp/plugin/mcp) | ✅ |
| Built-in sources (kafka/http_server/cron/file/sql) | ✅ |
| Built-in sinks (kafka/http/file/drop) | ✅ |
| Built-in codecs (json/raw/csv/avro/protobuf) | ✅ |
| MCP server (15 tools) | ✅ |
| LSP (diagnostics/completion/hover) | ✅ |
| Admin REST + SSE + read-only UI | ✅ |
| OpenTelemetry (OTLP + Prometheus) | ✅ |
| SQLite storage (pure Go, no CGO) | ✅ |
Next steps
2.2 - Your First Pipeline
The three-section format
Every Eventboat pipeline is a single YAML file with three top-level sections:
sources, transforms, and sinks — connected by from edges.
Verify (gate 1)
Output: pipeline.yaml: 0 error(s), 0 warning(s)
Run
The pipeline starts; every 5 minutes the cron source fires, the Starlark script enriches the message, and the sink receives it.
Add branching (CEL predicates)
Agent mode
Next steps
3 - Reference
3.1 - CLI Reference
Overview
verify
Statically validate a pipeline. Checks schema, topology invariants (no cycles, no orphans, source has no in-edges, sink has no out-edges, at least one source→sink path), CEL predicate compilation, Starlark script compilation, job configuration, and semantic lint.
| Flag | Default | Description |
|---|---|---|
--config | (required) | Pipeline YAML file |
--strict | false | Upgrade warnings to errors |
test
Run contract test suites against the real in-process engine. Test files declare injection points, expected captures, and DLQ assertions.
run
Execute a pipeline. Job pipelines (with run.mode: job) run under the
jobs manager with scheduling and catchup. --config-dir starts a
multi-pipeline daemon with the admin surface.
| Flag | Default | Description |
|---|---|---|
--config | — | Single pipeline file |
--config-dir | — | Directory of pipeline files (daemon mode) |
--runtime | ./eventboat.yaml | Runtime config (telemetry endpoints) |
--data-dir | data | SQLite storage directory |
--ephemeral | false | In-memory store (nothing persists) |
trigger
Manually fire a job pipeline once, optionally with parameters (backfill).
explain
Deterministic walkthrough of a pipeline. With --message, performs real
CEL evaluation and Starlark dry-run on the sample. With --topology,
renders the DAG (mermaid + ASCII).
replay
Re-inject dead letters (--dlq), a spool window (--spool --from N),
or one job run’s dead letters (--job <run-id>) into a live pipeline.
repl
Evaluate CEL predicates and Starlark scripts against one sample message without running a pipeline.
mcp
Start the MCP server for AI agents.
| Flag | Description |
|---|---|
--stdio | Speak MCP over stdin/stdout (for agent hosts) |
--http | Serve MCP over HTTP with Admin REST + SSE + UI |
--config-dir | Deploy pipelines at startup |
3.2 - Configuration
Top-level sections
| Section | Required | Purpose |
|---|---|---|
apiVersion / kind / metadata | ✅ | Resource identity (K8s convention) |
sources | ✅ (≥1) | Topology: where events come from |
transforms | optional | Topology: what happens to events |
sinks | ✅ (≥1) | Topology: where events go |
run | job pipelines only | Job scheduling (mode/schedule/overlap/catchup_window) |
parameters | job optional | Typed job parameters with defaults |
constants | optional | Read-only values visible to scripts and predicates |
hooks | optional | Lifecycle hooks (failure/success → inline sink) |
limits | optional | Per-pipeline resource limits |
edge_defaults | optional | Default edge attributes |
codecs | optional | Named codec declarations |
dlq | optional | Dead-letter policy |
Three-section topology
Nodes are organized by section; edges declared on the downstream side via from:
Edge attributes
Attributes on from elements:
| Attribute | Type | Description |
|---|---|---|
when | string or object | CEL predicate (or {lang: cesql, expr: ...}) |
delivery | object | {retries, backoff, timeout_ms} |
required | bool | false = best-effort (failure doesn’t block siblings) |
buffer | object | {max_events, strategy} |
Variable substitution
${VAR}— environment variable (unset = error)${?VAR}— optional (unset = omit key)${constants.name}— pipeline constant- Applies to all string values
Built-in plugins
Sources
| Name | Key config |
|---|---|
kafka | brokers, topics, group_id |
http_server | listen, max_body_bytes |
cron | expression (5-field) |
file | path (tail) |
sql | driver (mysql/postgres/sqlite), query, cursor, pagination |
Sinks
| Name | Key config |
|---|---|
kafka | brokers, topic |
http | url, timeout_ms |
file | path (JSON lines) |
drop | (none — discards) |
Codecs
| Name | Key config |
|---|---|
json | (none) |
raw | (none) |
csv | columns or header |
avro | schema (inline or file) |
protobuf | descriptor_set (file path) |