Concepts

Event log

Every ingested event is retained with what it triggered - queryable, and streamable live.

Durablex keeps a durable event log: every event it ingests is recorded with what it did. Where triggers answer "what starts a workflow", the event log answers "what came in, and what did each event do".

What's recorded

An event reaches the log two ways: an external POST /events (source: "api") or a workflow's step.emit (source: "emit"). Each record carries the event (name, app, data), when it arrived, and the outcome - the waiters it resumed and the per-workflow fan-out:

{
  "id": "9f2b…",
  "name": "order.created",
  "app": "shop",
  "source": "api",
  "data": { "orderId": "A1", "total": 250 },
  "receivedAt": "2026-06-15T09:00:00Z",
  "woke": 0,
  "triggered": [
    { "workflow": "fulfillment", "runId": "01H…" },
    { "workflow": "audit", "runId": "01H…" }
  ]
}

An event that matched nothing is still recorded with an empty triggered - so a fire-and-forget event that hit no workflow is visible, not lost. A cron firing is not an event: it starts a run directly, so it shows up in runs, not here.

Reading it

GET /events                 # newest first; filter with ?app= ?name= ?limit=
GET /events/{id}            # one event
GET /events/stream          # live tail (Server-Sent Events)

The console's Events view lists the log and live-tails the stream. The stream is a best-effort live view - a slow or reconnecting client can miss events; GET /events is the complete record.

Recording is best-effort on the ingest path: if the log write fails, event delivery still succeeds (the runs are already durable). The log is not auto-pruned yet, and listings return a bounded page.

On this page