This is the roadmap for the open-source half of Autter Runtime. The Autter backend (issue grouping, incidents, PR/deploy correlation, agent investigations, dashboards) lives in the private Autter monorepo; everything customers install or self-host lives here.
Self-hostable ingest service, packages/otlp-ingester.
Scope
POST /v1/traces— OTLP/HTTP JSON (ExportTraceServiceRequest).- Error spans (status
ERRORorexceptionevents) → fingerprinted error occurrences in ClickHouse (100% kept, 14-day TTL). - All received spans (sampling happens upstream in the SDK) →
runtime_spans(7-day TTL). - Server spans (
SPAN_KIND_SERVER) aggregated per minute intoruntime_metrics_1musage rollups (90-day TTL) — request count, error count, duration sum, keyed by service/environment/release/route.
- Error spans (status
POST /v1/metrics— OTLP/HTTP JSON (ExportMetricsServiceRequest). Recognised HTTP-server duration histograms fold into the same 1-minute rollups; unknown instruments are accepted and dropped (204).POST /v1/browser— the compact browser payload emitted by@autter/runtime-browser(via the customer's same-origin relay): unhandled errors, rejections, manual captures → occurrences; session pings → rollup session counts.- Auth:
Authorization: Bearer <ingest key>(orx-autter-key). Keys resolve to{orgId, repositoryId}via either a staticAUTTER_INGEST_KEYSenv (self-host) or aAUTTER_KEY_VALIDATOR_URLwebhook (Autter cloud), with a 60-second in-process cache. - Sink webhook (optional): fingerprinted occurrences are forwarded to
AUTTER_SINK_URLso a backend can do issue grouping/alerting in Postgres. The ingester itself only writes ClickHouse. - Payload cap (default 1 MB), per-key fixed-window rate limit, graceful degrade when ClickHouse is unreachable (503 on ingest, never crash).
Non-goals for v0.1: OTLP protobuf, logs signal, gRPC, multi-node rate limiting, source maps (symbolication is a backend concern).
OTLP/HTTP protobuf decodeshipped — trimmed proto schema (otlp-proto.ts), verified against the OTel proto exporter; unlocks Go, Rust, Python, Java, .NET SDKs with default settings.gzip request bodiesshipped (body-parser inflation on all parsers).- Redis-backed rate limiting (multi-replica deployments).
/healthzdeep check (ClickHouse ping) + Prometheus/metricsself-telemetry.- Backpressure: buffered ClickHouse inserts with bounded queue + drop policy.
- Container image published to GHCR on tag (
ghcr.io/autter-dev/otlp-ingester).
Zero-dependency, <5 KB gzipped (CI-enforced with size-limit).
- Captures:
window.onerror,unhandledrejection, manualcaptureException(), optionaltrackEvent(name, props)usage signals, session start ping. - API:
initAutterBrowser({ endpoint, service, environment, release }),captureException(),trackEvent(),setUser()(opaque id only),setContext(),flush(). - Batching: flush at 10 events / 5 s / page hidden /
pagehide/ manual;sendBeacon→fetch(keepalive)fallback; fast-flush for unhandled errors. - Hard privacy rules: pathname-only routes, no cookies/DOM/form values/headers/bodies/emails/IP.
- Never sends OTLP from the browser; the compact JSON payload is the contract
with
/v1/browser.
Two halves, one package:
createBrowserRelayHandler({ apiKey })— framework-agnostic handler (Node http / Express / Next.js route): POST-only, ≤64 KB, schema validation, strips forbidden attributes, attaches the private ingest key server-side, forwards async, returns 202. Kills public credentials, CORS and CSP concerns.initAutterServer({ apiKey, endpoint, service, environment, release })— curated OTel:@opentelemetry/api,sdk-node, OTLP proto exporters,instrumentation-http; express/fastify instrumentations as optional peers. Default sampling: errors 100%, successful traces 1%, metrics at 60 s. Never the auto-instrumentation metapackage.
One install command, one config file: server OTel init, browser tracker init,
relay route export, <AutterErrorBoundary>, release metadata from GIT_SHA,
CI source-map upload helper (maps upload to the Autter backend, not here).
- npm packages under the
@autterscope (secure the scope before announcing). - Changesets + GitHub Actions release pipeline; provenance-signed publishes.
- Versioning: independent per package, semver; the browser payload schema and
ClickHouse row schemas carry explicit
versionfields for compatibility. - CONTRIBUTING.md, issue templates, examples/ (next-app, express-app, static-site).
- Opt-in same-origin network tracing (
traceparentpropagation) in the browser tracker — never globalfetchpatching by default. - Web Vitals, failed-request capture.
- Public DSN-style endpoint for static sites (origin allow-list, aggressive rate limits).
- Logs signal (
/v1/logs). - Full OpenTelemetry browser SDK support — only if demanded.
| Interface | Stability |
|---|---|
/v1/traces, /v1/metrics OTLP/HTTP |
OTLP spec-stable |
/v1/browser payload (version: 1) |
additive-only changes |
| ClickHouse table schemas | additive-only; TTLs configurable via env |
Sink webhook payload (version: 1) |
additive-only changes |