Open source · OpenTelemetry-native · self-hosted

No vendor should tell you how to observe your own system.

ouo11y is Open Unified Observability: real user sessions, errors, crashes, traces and replay from web and mobile, joined to your backend in one place. Built on OpenTelemetry, open source, and yours to change.

ouo11y · say "oh-you-oh-eleven-why", or just "ouo"

What we stand for

Six promises, written down.

These are the rules we build by. If ouo11y ever breaks one of them, it is a bug: tell us on GitHub.

Open source

SDKs, collector, plugin and deploy files are Apache-2.0; the session service is AGPL-3.0. Read it, run it, fork it.

OpenTelemetry compliant

Every signal is OTLP with OTel semantic conventions. No proprietary wire format, no private agent. Leaving ouo11y loses neither your data nor your instrumentation.

End-to-end, unified

One dashboard for the whole story: the tap, the request, the backend spans, the log line and the replay of what the user saw.

Everything customizable

Your collector pipeline, your storage, your dashboards, your sampling, your retention. Defaults that work, and no knob we hide from you.

Our SDK is optional

Use @ouo11y/browser to start in five minutes, or instrument with plain OpenTelemetry and rrweb. ouo11y reads both the same way.

ouo.* is temporary

Where OTel has no convention yet, we use an ouo. prefix. When OTel defines one, we move to it and say so in the changelog.

One dashboard, the whole story

From a user's tap to the database, and back.

Most tools show you a chart per team. ouo11y shows you what happened to one person: W3C Trace Context joins browser and mobile spans to your backend spans, and every signal carries the same session.id.

Web appour SDK or plain OTelMobile appReact Native · iOSYour backendany OTel SDKOTel Collectorouo11y distributionor your own buildLokievents · logsTempotracesMimirmetricsrum-apisessions · health · replayGrafanaone dashboard:timeline · traces · replay

What did the user see?

Session replay that seeks to the moment of the error, with inputs masked by default.

Why was it slow?

The browser's fetch span is the root of the backend trace, so a slow checkout opens straight into the slow query.

Is this release healthy?

Healthy, errored and crashed sessions per platform and version, minutes after you ship.

Your instrumentation, your call

Use our SDK, or don't.

ouo11y reads OpenTelemetry. Our SDK is a shortcut, not a requirement: anything that sends the same OTLP signals gets the same sessions, traces and replays.

The shortcut: @ouo11y/browser

Five minutes. Sessions, errors, Web Vitals, fetch tracing and replay, with the conventions already right.

import { initRUM } from "@ouo11y/browser";

initRUM({
  endpoint: "https://otel.example.com",
  projectId: "web-store",
  projectToken: "pt_...",
  service: { name: "web-store", version: "1.4.2" },
  replay: { enabled: true },
});

Use the SDK →

Do it yourself: plain OpenTelemetry

The OTel JS SDK, rrweb and web-vitals. Not one line of ouo code in your app.

// what ouo11y needs, and nothing else
resource   service.name, service.version
every span session.id, user.id
log events session.start · exception
           http.request.failed · web_vital
           navigation · session.end
replay     rrweb chunks → collector :4319
transport  OTLP/HTTP → collector :4318

Read the contract → · Tiny Shop example

OTel first, ouo second

Every ouo. attribute is a placeholder.

You will see ouo. in our code and your data where OpenTelemetry has no convention yet. That prefix is a promise, not a brand: when OTel defines the attribute, or tells us how to do it the OTel way, we switch, ship both names during a migration window, and document it.

See the full list and its status →

TodayOTel status
session.id, user.idalready OTel
web_vital eventbrowser.web_vital, in development
navigation eventbrowser.navigation, in development
ouo.exception.fatalno convention yet
ouo.session.end_reasonno convention yet

Open by design

Run it where your data lives.

Kubernetes with Helm, a single VM with Docker, or your laptop with Compose. It lands in the Grafana, Loki, Tempo and Mimir you may already run. Anything you embed in your own app is Apache-2.0.

Browser, React Native and iOS SDKsApache-2.0
Grafana app pluginApache-2.0
Collector distribution, Helm chart, deploy filesApache-2.0
Examples and guidesApache-2.0
rum-api (session service)AGPL-3.0

Talk to us.

Questions, a pilot on your own infrastructure, or a strong opinion about OpenTelemetry: we read every email.