@autter/* npm packages are convenience wrappers, not requirements. Autter Runtime’s ingest API is built on open standards — OTLP/HTTP for servers and a small, documented JSON payload for browsers — so any codebase in any language can send telemetry with nothing but its own ecosystem’s OpenTelemetry SDK, or a plain HTTP request.
There are two integration surfaces. Pick per service:
The default endpoint is
https://otlp.autter.dev; self-hosters substitute their own domain. Auth on every request: Authorization: Bearer <key> (or x-autter-key: <key>), using a server key (autter_rt_…) for OTLP and either key kind for /v1/browser.
Servers: any language with an OpenTelemetry SDK
OTLP/HTTP is OpenTelemetry’s standard export protocol. Every official OTel SDK — Python, Ruby, Go, Rust, Java, .NET, PHP, Erlang/Elixir, Swift, C++ — can export to Autter with configuration only, usually just environment variables:pip, gem, go get, cargo, Maven/Gradle, NuGet, Composer, …) and enable its auto-instrumentation. Per-language snippets for Go, Rust, Python, and friends live in Stack integrations.
How the signals map:
- Errors — a span with an
exceptionevent (record_exception/RecordErrorin every SDK) orERRORstatus becomes an error occurrence, fingerprinted and grouped server-side. - Warnings/info — add an
autter.severityattribute ("fatal" | "error" | "warning" | "info") to the exception event; the occurrence is stored with that severity instead oferror. - Usage — HTTP-server spans and the standard
http.server.request.durationhistogram fold into per-minute request/error/latency rollups automatically.
No OTel SDK at all?
If a language or environment has no OTel SDK, or you can’t add dependencies, you have two options:1
Run an OpenTelemetry Collector
Run the Collector (a single static binary) next to your app, speaking whatever you can emit — syslog, Prometheus, Jaeger, Zipkin, file logs — and point its OTLP/HTTP exporter at Autter with the bearer-token header. No app changes beyond what you already emit.
2
POST OTLP/JSON directly
OTLP has a JSON encoding, so a hand-rolled HTTP request works from anything that can speak HTTPS — curl included:That’s a complete error report from a shell script. Swap
curl for your language’s HTTP client and you have an integration in ~30 lines with zero dependencies.Browsers: without @autter/runtime-browser
The tiny tracker is just a convenience around POST /v1/browser. The payload contract (version: 1) is stable and small enough to hand-roll — from vanilla JS, a browser extension, a WebView, or any non-npm frontend toolchain:
browserPayloadSchema in packages/otlp-ingester/src/normalize-browser.ts — the code is the contract.
AI-assisted setup works for non-npm codebases too
The agent skills are not npm-specific —npx is only the installer for the skill files (any machine with Node can run it once; the target codebase doesn’t need Node at all). The skills include Python, Go, Rust, and a generic any-OTel-language guide:

