Skip to main content
Autter Runtime is two credentials and three endpoints; everything else is per-stack sugar. Any language with an OpenTelemetry SDK can send server telemetry — point its OTLP/HTTP exporter at the ingester and add the key as a header.

React / SPA / static sites

With a backend (recommended — relay, no key in the bundle):

Static / serverless: same-origin relay (no backend needed)

Direct browser ingest (https://otlp.autter.dev/v1/browser with autter_rtc_…) is cross-origin and ad-blockers silently drop it. You avoid that loss on static sites by deploying the same-origin relay and keeping the tracker on /api/autter-runtime. Deploy to Cloudflare Workers Deploy with Vercel
  • Cloudflare: deploy examples/runtime-relay (wrangler deploy), then route /api/autter-runtime* to it.
  • Vercel: copy examples/runtime-relay/vercel-edge-route.ts to app/api/autter-runtime/route.ts.
  • Init (all relay modes):
Relay contract: POST-only, 64KB cap, Origin forwarded, Cookie stripped, 202 on accept. Set the AUTTER_RUNTIME_KEY secret to forward with your server key. Without a relay (lossy fallback for pure-static only, publishable client key, origin-restricted):
Direct ingest is cross-origin. Ad-blockers silently drop these requests, so expect partial data. Use the same-origin relay above whenever you can deploy a Worker or edge route.
React render errors: wrap with <AutterErrorBoundary> (from @autter/runtime-next, works in any React app). Vue/Svelte/Angular: call captureException(err) from the framework’s error hook (app.config.errorHandler, handleError, ErrorHandler).

Node.js (Express, Fastify, Koa, NestJS)

Relay for your frontend:
ESM-only apps need OpenTelemetry’s loader hook — see the package README.

Next.js

Three files — instrumentation.ts, a relay route, and a client init + boundary. See the package README.

Go

Rust

Python, Java, .NET, or anything else

Standard OpenTelemetry environment variables work with every SDK:
Errors surface as issues when spans carry exception events (every SDK’s record_exception / RecordError does this) or ERROR status. The ingester parses each language’s native stack format (Go, Rust, Java, .NET, Python, JavaScript), so errors group by function and file, not by message alone — the same defect stays one issue and unrelated errors that share a message stay apart. Warnings (any language): add an autter.severity attribute to the exception event — "fatal" | "error" | "warning" | "info" (default error; the Node SDK’s crash marker autter.unhandled: true implies fatal). Warnings share the errors table with a severity column, so they group and aggregate identically:

Sampling guidance (all stacks)

Errors are always worth sending; keep successful-trace sampling at ~1% (OTEL_TRACES_SAMPLER_ARG=0.01). Request/usage metrics are derived server-side from spans and the http.server.duration histogram — no extra setup.

No @autter/* package for your language?

Send telemetry with just an OpenTelemetry SDK, a Collector, or a hand-rolled HTTP request.