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.
// 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 → /metricsWhat 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.