Instrumented
the moment you write it.

You don’t wire up tracing — the runtime does. Every mutation, query, subscription, workflow, webhook and AI call auto-emits an OpenTelemetry span and feeds the metric registry. Read it in the in-app dashboard, or export it to whatever you already run.

observability
TypeScript
// nothing to wire — every primitive emits a span
// posts.create.mutation.server.ts
export default async (input, ctx) =>
  ctx.store.insert('posts', input)
//        └─ auto span: mutation.posts.create
//           + voltro_rpc_* metrics, one traceId
//           from the browser through the API

// export: OTEL_EXPORTER_OTLP_ENDPOINT=…  → OTLP
//     or  add @voltro/plugin-prometheus  → /metrics

What you get without instrumenting anything.

OpenTelemetry-native spans

Every primitive emits a span automatically — a per-request waterfall you can read without adding a single tracer call. Modes: console, otlp (auto-detected from OTEL_* env), or off, with an always-on buffer feeding the in-app dashboard.

A metric registry, built in

voltro_rpc_*, voltro_http_*, voltro_ai_* and more land in an Effect MetricRegistry — request counts, latencies, error rates, AI token spend — ready to export or scrape.

In-app traces & time-travel

The always-on buffer powers a Traces dashboard inside the app — inspect a request’s span tree and replay it, no external backend required to start.

Distributed tracing

One traceId flows from the browser through the API and back, so a slow interaction is a single trace end to end — not four disconnected logs you have to correlate by hand.

Export anywhere

plugin-prometheus exposes GET /metrics; plugin-datadog pushes metrics, logs and traces; plugin-sentry sends trace-correlated errors; plugin-logship ships structured logs to Better Stack / Axiom / Loki / any JSON intake.

CLI + DevTools inspection

voltro logs and voltro traces stream from the terminal; the DevTools dashboard surfaces routes, RPC, workflows, schedules, cache, logs, traces and per-plugin panels over /_voltro/inspect/*.

On by default, extensible by seam.

Plugins contribute observability too

Observability isn’t bolted on at the end — it’s emitted by the runtime and every first-party plugin, and a contributeObservability seam lets your own plugins add spans and metrics the same way. Turn it up to OTLP for production, leave it on console in dev, or read the in-app dashboard either way.

Observability spans the whole runtime.

Open the framework. See it for yourself.

Every primitive on this page is in the framework today. Clone the starter, run `voltro dev`, and have it on screen in two minutes.