Observability
Seeing what your workflows are doing — the embedded control-plane dashboard, OpenTelemetry spans, dependency-free metrics, the Telescope watcher, and the raw diagnostics bus underneath them.
A durable run is a long-lived thing that spans processes, retries and deploys, so "check the logs" is rarely enough. Durable exposes the same lifecycle events through several surfaces; pick the ones that match how you already operate.
Start here
- Control plane — the embedded React dashboard served by NestJS. Lists runs, renders each one as a graph across local and remote steps, and lets you retry and cancel. It is the fastest way to answer "what is this run waiting on?".
Wiring into your stack
- OpenTelemetry — one span per step and one root span per run's first turn, so workflows show up in Jaeger, Grafana or Datadog next to your HTTP traces.
- Metrics — dependency-free run/step counters and duration
percentiles you can hand straight to a
/metricsroute. - Telescope — runs and steps inside nestjs-telescope, alongside your app's requests, queries and jobs.
Underneath
- Diagnostics channel — every engine lifecycle event on the
Node
diagnostics_channelbus. This is the raw feed the surfaces above are built on; subscribe to it when you want to route durable events somewhere none of them cover.
These are additive, not alternatives — a production deployment typically runs the dashboard for humans and OTel or metrics for alerting, off the same event stream.
Drizzle
The Drizzle StateStore adapter for SQLite / libSQL (Turso, edge). Build your drizzle db with the package's schema and pass it to DrizzleStateStore. Schema is owned by drizzle-kit — no auto-schema.
Control plane
The embedded dashboard — a React SPA served by NestJS that lists runs and renders each one as a graph across local and remote steps, with retry and cancel.