control.capnp) over the control port (typically TCP 6363) and reuses one TCP connection per process. Install the package for your stack, connect once, and reuse the client. Deep dives link to the full language guides.
Prefer SDKs over raw sockets—the clients ship retries, pagination helpers, and
typed payload handling so product teams can focus on domain logic.
plugin[:mode[:priority]]), and accept per-call overrides so you can fan out to analytics, webhooks, or custom workers without rebuilding the client.
See it, shape it
“See It (L-G-S), Shape It (C-A-P-A-R)” is the EventDBX shorthand for the operational verbs—short, visual, sticky, and a clear split between reads and writes. See It — read actionslist– paginate across aggregates (or staged aggregates) with consistent filters and limits.get– fetch the latest aggregate state, metadata, and Merkle information in one call.select– return a filtered subset of fields or dot-paths from aggregate state without transferring the full payload.
create– register a brand-new aggregate and seed the first event via the control plane.apply– append a new event to an existing aggregate after running schema validation.patch– submit JSON Patch documents that adjust historical payloads.archive– mark aggregates read-only so they remain queryable but reject new events.restore– flip archived aggregates back to active, allowing writes again.
JavaScript
- Native Node-API addon that speaks Cap’n Proto over TCP with Noise by default.
- Promise-first API with async iterables for streaming reads; optional per-call token/publish targets.
- Retries/backoff and verbose/non-verbose mutation responses.
- Deep dive to JavaScript SDK
Python
- Synchronous TCP client; handshake happens on construction and reuses one socket.
- Noise XX on by default; toggle with
no_noise/EVENTDBX_NO_NOISEfor lab setups. - Optional retries and verbose/non-verbose mutation responses; includes admin helpers for schemas/tenants.
- Deep dive to Python SDK
Java
- Blocking control client mirroring Node parity (
create,apply,patch, reads). - Noise transport via the bundled
snownoisenative library; retries/backoff configurable. - Publish targets, per-call token overrides, and Jackson-based JSON handling.
- Deep dive to Java SDK
PHP
- Native FFI wrapper over the Rust control client; Noise on by default, configurable per client.
- Per-call publish targets and token overrides; methods return JSON payloads/envelopes.
- Requires building the bundled native library before first use.
- Deep dive to PHP SDK
.NET
- Async-first TCP client with Noise enabled by default; dispose with
IAsyncDisposable. - Methods return JSON strings plus cursor metadata; per-call token overrides supported.
- Snapshot and schema/tenant admin helpers mirror the control plane.
- Deep dive to .NET SDK
Go
- Synchronous client returning JSON strings; configure connect/read timeouts in
Config. - Noise NNpsk0 enabled by default; set
EVENTDBX_NO_NOISEorUseNoiseto disable in labs. - Pagination with cursors for aggregates/events plus snapshots and schema/tenant admin helpers.
- Deep dive to Go SDK
Rust
- Tokio-native async client with Noise XX enabled by default and configurable timeouts.
- Request/response builders keep payloads/metadata strongly typed via
serde_json. - Per-call publish targets, notes, and token overrides for scoped mutations.
- Deep dive to Rust SDK
Common patterns
- Config from env: Provide host/port/token/tenant via environment variables so deployments stay portable; most clients also expose explicit option fields.
- Connect once: Create one client per process/tenant, reuse the TCP socket, and close/dispose on shutdown to release cursors cleanly.
- Publish targets: Route writes to specific plugins with
plugin[:mode[:priority]]; omit targets to fan out to all enabled plugins. - Retries/timeouts: Opt into retries/backoff for transport errors and tune connect/request timeouts for your SLOs.
- Per-call scope: Override tokens per request when scoping permissions to a user session without rebuilding the client.
control.capnp to build your own.