Skip to content

CDC

Change data capture for one tenant at a time. Tails are per-tenant — bind /api/v1/t/:tenant/… (or Studio's tenant switcher) and stream that tenant's committed row mutations.

Capability: Status (Live CDC — Yes). Wire shapes and auth: HTTP API.

WebSocket vs HTTP poll

Same path: GET /api/v1/t/:tenant/tail.

ModeHowWhen
WebSocketRequest includes Upgrade: websocket; auth via ?token= (browsers cannot set WS auth headers)Preferred live push — Studio tries this first
HTTP pollOrdinary GET; response {"cursor":…,"events":[…]}Fallback when WS is unavailable; or any simple client

Optional query: ?after=<lsn> (resume), ?collection=<name> (filter).

Studio live mode prefers WebSocket, reconnects with backoff from the last cursor, and falls back to ~1.5s HTTP poll if the socket never opens.

LSN resume

Each event carries an advancing write-frame lsn. Resume with after=<that lsn> to receive only later events (gapless within retained history). The HTTP poll also returns a tip cursor — poll again with after=<cursor> to stream forward without repeats.

WebSocket sends a first hello frame (type, tenant, cursor), then one text frame per event (same event object shape as HTTP).

Events are served from a bounded in-process ring (WAL checkpoints recycle log segments). If a consumer falls behind retention, reload a full snapshot of the collections you care about, then resume from the new tip — Studio does a fresh connect path rather than inventing missing history.

Event fields (operator view): lsn, op (upsert / delete), collection, id. Exact JSON: HTTP — CDC tail.

Snapshot pin

Studio time-travel sets the Eelden-Snapshot header on API calls. While a named snapshot is pinned, live CDC is off — you're looking at the past, not the live tip. Clear the pin to resume live mode.

Cross-tenant read models

There is no cross-tenant ACID and no engine-wide CDC multiplex. across tenants(…) does not execute yet (Status).

App-layer pattern: emit CDC from each tenant, maintain a read model, coordinate with sagas. Isolation rules: Tenants.

Pre-alpha. Local-first. Stdlib-only Rust engine. Tenant concerns shifted left into the database.