<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Eventboat</title><link>https://eventboat.dev/</link><description>Recent content on Eventboat</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Sat, 05 Sep 2026 01:32:49 +0800</lastBuildDate><atom:link href="https://eventboat.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>v0.2.0-rc1</title><link>https://eventboat.dev/blog/release/v0.2.0-rc1/</link><pubDate>Fri, 04 Sep 2026 00:00:00 +0000</pubDate><guid>https://eventboat.dev/blog/release/v0.2.0-rc1/</guid><description>&lt;p&gt;We&amp;rsquo;re excited to announce &lt;strong&gt;v0.2.0-rc1&lt;/strong&gt;, the first release candidate of&#10;Eventboat — the agent-native event router.&lt;/p&gt;&#10;&lt;h2 id="whats-in-the-box"&gt;What&amp;rsquo;s in the box&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Agent-native&lt;/strong&gt;: MCP server with 15 tools covering the full lifecycle&#10;(catalog → verify → test → explain → deploy → status → trigger → tail →&#10;dead-letter replay)&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Zero-custom-language&lt;/strong&gt;: CEL predicates (K8s standard) + Starlark&#10;transforms (Python dialect, sandboxed, deterministic)&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Reliability engine&lt;/strong&gt;: spool + settle + checkpoint on SQLite, seven&#10;invariant tests, kill -9 resume from watermark, dead-letter store with&#10;replay&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Job pipelines&lt;/strong&gt;: cron scheduling, catchup windows, overlap policies,&#10;typed parameters with backfill&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Extension ladder&lt;/strong&gt;: CEL → Starlark → WASM (wazero) → gRPC&#10;out-of-process plugins&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;CESQL dialect&lt;/strong&gt;: optional CloudEvents interop, official TCK 100%&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;LSP&lt;/strong&gt;: editor diagnostics, completion, and hover for pipeline YAML&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;CLI&lt;/strong&gt;: 11 commands on &lt;a href="https://github.com/lynx-go/commands"&gt;lynx-go/commands&lt;/a&gt;&#10;with &lt;code&gt;--json&lt;/code&gt; output for agents and CI&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="quick-start"&gt;Quick start&#10;&lt;/h2&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-dab3946b-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="2"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-dab3946b-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go install github.com/eventboat/eventboat/cmd/eventboat@v0.2.0-rc1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;eventboat help&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="whats-next"&gt;What&amp;rsquo;s next&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;DNS for eventboat.dev is being configured&lt;/li&gt;&#10;&lt;li&gt;npm/PyPI/crates defensive registrations&lt;/li&gt;&#10;&lt;li&gt;Feedback from early users drives the v1.0 scope&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;→ &lt;a href="https://github.com/eventboat/eventboat/blob/main/CHANGELOG.md"&gt;Full changelog&lt;/a&gt;&lt;/p&gt;</description></item><item><title>CLI Reference</title><link>https://eventboat.dev/docs/reference/commands/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://eventboat.dev/docs/reference/commands/</guid><description>&lt;h2 id="overview"&gt;Overview&#10;&lt;/h2&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-0748f80e-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="console" data-td-line-count="14"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-0748f80e-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat [--json] verify --config &amp;lt;pipeline.yaml&amp;gt; [--strict]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat [--json] test &amp;lt;testfile-or-dir&amp;gt; [...]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat run --config &amp;lt;pipeline.yaml&amp;gt; [--data-dir DIR] [--ephemeral]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat run --config-dir &amp;lt;dir&amp;gt; [--runtime runtime.yaml]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat [--json] trigger --config &amp;lt;job.yaml&amp;gt; [--parameters &amp;#39;{&amp;#34;from&amp;#34;:&amp;#34;...&amp;#34;}&amp;#39;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat [--json] jobs list --config &amp;lt;job.yaml&amp;gt; [--limit N]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat [--json] jobs show &amp;lt;run-id&amp;gt; --config &amp;lt;job.yaml&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat [--json] explain --config &amp;lt;pipeline.yaml&amp;gt; [--message f.json] [--topology]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat [--json] replay --config &amp;lt;pipeline.yaml&amp;gt; (--dlq | --spool --from N | --job &amp;lt;run-id&amp;gt;) [--dry-run]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat repl [--message sample.json] [--cel &amp;#39;expr&amp;#39; | --script f.star]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat lsp&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat [--json] plugin catalog&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat [--json] plugin schema &amp;lt;name&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat mcp (--stdio | --http) [--config-dir &amp;lt;dir&amp;gt;] [--data-dir DIR]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="verify"&gt;verify&#10;&lt;/h2&gt;&#10;&lt;p&gt;Statically validate a pipeline. Checks schema, topology invariants&#10;(no cycles, no orphans, source has no in-edges, sink has no out-edges,&#10;at least one source→sink path), CEL predicate compilation, Starlark&#10;script compilation, job configuration, and semantic lint.&lt;/p&gt;</description></item><item><title>Installation</title><link>https://eventboat.dev/docs/get-started/installation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://eventboat.dev/docs/get-started/installation/</guid><description>&lt;h2 id="prerequisites"&gt;Prerequisites&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Go 1.25+ (for building from source)&lt;/li&gt;&#10;&lt;li&gt;No runtime dependencies — everything is compiled into one binary&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="install"&gt;Install&#10;&lt;/h2&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-991cd0f4-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-991cd0f4-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go install github.com/eventboat/eventboat/cmd/eventboat@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Verify:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-991cd0f4-fence-1" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-991cd0f4-fence-1-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;eventboat help&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;You should see the help screen with 11 commands listed.&lt;/p&gt;&#10;&lt;h2 id="whats-in-the-binary"&gt;What&amp;rsquo;s in the binary&#10;&lt;/h2&gt;&#10;&lt;div class="td-table-scroll td-table-scroll--static"&gt;&#10;&lt;table&gt;&#10; &lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th scope="col"&gt;Component&lt;/th&gt;&#10; &lt;th scope="col"&gt;Included&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;Engine (spool/settle/checkpoint)&lt;/td&gt;&#10; &lt;td&gt;✅&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;CLI (verify/test/run/trigger/jobs/explain/replay/repl/lsp/plugin/mcp)&lt;/td&gt;&#10; &lt;td&gt;✅&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;Built-in sources (kafka/http_server/cron/file/sql)&lt;/td&gt;&#10; &lt;td&gt;✅&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;Built-in sinks (kafka/http/file/drop)&lt;/td&gt;&#10; &lt;td&gt;✅&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;Built-in codecs (json/raw/csv/avro/protobuf)&lt;/td&gt;&#10; &lt;td&gt;✅&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;MCP server (15 tools)&lt;/td&gt;&#10; &lt;td&gt;✅&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;LSP (diagnostics/completion/hover)&lt;/td&gt;&#10; &lt;td&gt;✅&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;Admin REST + SSE + read-only UI&lt;/td&gt;&#10; &lt;td&gt;✅&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;OpenTelemetry (OTLP + Prometheus)&lt;/td&gt;&#10; &lt;td&gt;✅&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;SQLite storage (pure Go, no CGO)&lt;/td&gt;&#10; &lt;td&gt;✅&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="next-steps"&gt;Next steps&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="../first-pipeline/"&gt;Write your first pipeline&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="../../reference/commands/"&gt;CLI reference&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>What is Eventboat?</title><link>https://eventboat.dev/docs/introduction/overview/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://eventboat.dev/docs/introduction/overview/</guid><description>&lt;p&gt;Eventboat routes events through directed acyclic graphs (DAGs) of transforms —&#10;from &lt;strong&gt;sources&lt;/strong&gt; (Kafka, HTTP, cron, SQL, files) to &lt;strong&gt;sinks&lt;/strong&gt; (Kafka, HTTP, files),&#10;with at-least-once delivery, dead-lettering, and replay.&lt;/p&gt;&#10;&lt;p&gt;It is &lt;strong&gt;agent-native&lt;/strong&gt;: every capability is accessible through MCP (Model Context&#10;Protocol), CLI, and a language server — so AI agents can write, verify, deploy,&#10;and operate pipelines autonomously.&lt;/p&gt;&#10;&lt;h2 id="what-makes-it-different"&gt;What makes it different&#10;&lt;/h2&gt;&#10;&lt;div class="td-table-scroll td-table-scroll--static"&gt;&#10;&lt;table&gt;&#10; &lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th scope="col"&gt;Dimension&lt;/th&gt;&#10; &lt;th scope="col"&gt;Approach&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;strong&gt;Predicates&lt;/strong&gt;&lt;/td&gt;&#10; &lt;td&gt;CEL (Kubernetes standard) — zero custom DSL, huge training corpus&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;strong&gt;Transforms&lt;/strong&gt;&lt;/td&gt;&#10; &lt;td&gt;Starlark (Python dialect, sandboxed, deterministic)&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;strong&gt;Verification&lt;/strong&gt;&lt;/td&gt;&#10; &lt;td&gt;Four machine gates: verify, test, explain, operate&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;strong&gt;Reliability&lt;/strong&gt;&lt;/td&gt;&#10; &lt;td&gt;Seven invariant tests, spool/settle/checkpoint engine on SQLite&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;strong&gt;Jobs&lt;/strong&gt;&lt;/td&gt;&#10; &lt;td&gt;Cron scheduling, catchup windows, typed parameters, backfill&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;strong&gt;Extension&lt;/strong&gt;&lt;/td&gt;&#10; &lt;td&gt;CEL → Starlark → WASM → gRPC out-of-process plugins&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;strong&gt;Interop&lt;/strong&gt;&lt;/td&gt;&#10; &lt;td&gt;CESQL dialect (CloudEvents), official TCK 100%&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="the-one-line-pitch"&gt;The one-line pitch&#10;&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Eventboat lets AI agents build and run event pipelines that don&amp;rsquo;t lose messages —&#10;because machines verify every step before it goes live.&lt;/p&gt;</description></item><item><title>Architecture</title><link>https://eventboat.dev/docs/introduction/architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://eventboat.dev/docs/introduction/architecture/</guid><description>&lt;h2 id="three-layer-model"&gt;Three-layer model&#10;&lt;/h2&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-a40c6ace-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="" data-td-line-count="3"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-a40c6ace-fence-0-viewport" data-td-code-viewport&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;YAML (+overlay) → Config (typed) → Static IR → Runtime Engine&#10; ↓&#10; Source → Transform → Sink plugins&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Config layer&lt;/strong&gt;: YAML parsing, strict schema validation, variable substitution&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Static IR&lt;/strong&gt;: validated DAG + precompiled CEL programs + Starlark programs + schema&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Runtime&lt;/strong&gt;: spool + settle + checkpoint engine, consuming only the IR&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="reliability-model"&gt;Reliability model&#10;&lt;/h2&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-a40c6ace-fence-1" data-td-code data-td-code-auto-id&#10; data-td-language="" data-td-line-count="3"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-a40c6ace-fence-1-viewport" data-td-code-viewport&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;source → [spool: append-only durable queue] → in-memory DAG → sinks&#10; │ │&#10; └── checkpoint ←── settle tracker ←── terminal states&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Spool&lt;/strong&gt;: every message hits SQLite before the DAG sees it (invariant 1)&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Settle&lt;/strong&gt;: each message settles when all branches reach terminal state&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Checkpoint&lt;/strong&gt;: advances only over settled prefix (invariant 2)&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Crash recovery&lt;/strong&gt;: kill -9 → restart → replay from checkpoint, never lose (invariant 3)&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Dead letters&lt;/strong&gt;: exhausted retries → DLQ store with query + replay CLI&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="seven-invariant-tests"&gt;Seven invariant tests&#10;&lt;/h2&gt;&#10;&lt;p&gt;Each has a dedicated test that must pass in CI:&lt;/p&gt;</description></item><item><title>Configuration</title><link>https://eventboat.dev/docs/reference/configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://eventboat.dev/docs/reference/configuration/</guid><description>&lt;h2 id="top-level-sections"&gt;Top-level sections&#10;&lt;/h2&gt;&#10;&lt;div class="td-table-scroll td-table-scroll--static"&gt;&#10;&lt;table&gt;&#10; &lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th scope="col"&gt;Section&lt;/th&gt;&#10; &lt;th scope="col"&gt;Required&lt;/th&gt;&#10; &lt;th scope="col"&gt;Purpose&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;apiVersion&lt;/code&gt; / &lt;code&gt;kind&lt;/code&gt; / &lt;code&gt;metadata&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;✅&lt;/td&gt;&#10; &lt;td&gt;Resource identity (K8s convention)&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;sources&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;✅ (≥1)&lt;/td&gt;&#10; &lt;td&gt;Topology: where events come from&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;transforms&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;optional&lt;/td&gt;&#10; &lt;td&gt;Topology: what happens to events&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;sinks&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;✅ (≥1)&lt;/td&gt;&#10; &lt;td&gt;Topology: where events go&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;run&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;job pipelines only&lt;/td&gt;&#10; &lt;td&gt;Job scheduling (mode/schedule/overlap/catchup_window)&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;parameters&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;job optional&lt;/td&gt;&#10; &lt;td&gt;Typed job parameters with defaults&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;constants&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;optional&lt;/td&gt;&#10; &lt;td&gt;Read-only values visible to scripts and predicates&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;hooks&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;optional&lt;/td&gt;&#10; &lt;td&gt;Lifecycle hooks (failure/success → inline sink)&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;limits&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;optional&lt;/td&gt;&#10; &lt;td&gt;Per-pipeline resource limits&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;edge_defaults&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;optional&lt;/td&gt;&#10; &lt;td&gt;Default edge attributes&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;codecs&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;optional&lt;/td&gt;&#10; &lt;td&gt;Named codec declarations&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;dlq&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;optional&lt;/td&gt;&#10; &lt;td&gt;Dead-letter policy&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="three-section-topology"&gt;Three-section topology&#10;&lt;/h2&gt;&#10;&lt;p&gt;Nodes are organized by section; edges declared on the downstream side via &lt;code&gt;from&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Your First Pipeline</title><link>https://eventboat.dev/docs/get-started/first-pipeline/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://eventboat.dev/docs/get-started/first-pipeline/</guid><description>&lt;h2 id="the-three-section-format"&gt;The three-section format&#10;&lt;/h2&gt;&#10;&lt;p&gt;Every Eventboat pipeline is a single YAML file with three top-level sections:&#10;&lt;code&gt;sources&lt;/code&gt;, &lt;code&gt;transforms&lt;/code&gt;, and &lt;code&gt;sinks&lt;/code&gt; — connected by &lt;code&gt;from&lt;/code&gt; edges.&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-9cb32f8c-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="yaml" data-td-line-count="19"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-9cb32f8c-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;eventboat/v3&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Pipeline&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;my-first-pipeline }&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ingest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cron&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;*/5 * * * *&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;}&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# every 5 minutes&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;transforms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;ingest]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; payload.greeting = &amp;#34;hello from eventboat&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; payload.timestamp = meta.ingest_time&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;sinks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;console&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;hello]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{}&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# discard (demo)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="verify-gate-1"&gt;Verify (gate 1)&#10;&lt;/h2&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-9cb32f8c-fence-1" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-9cb32f8c-fence-1-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;eventboat verify --config pipeline.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Output: &lt;code&gt;pipeline.yaml: 0 error(s), 0 warning(s)&lt;/code&gt;&lt;/p&gt;</description></item></channel></rss>