Own your WebRTC observability pipelineOpen source and self-hosted

rtcstats-js and rtcstats-server capture and extract important KPIs of every session's stats, run inside your own infrastructure. Self-host the whole collection layer and plug it into whatever you already run.

Three packages. One clear job each.

The collection layer is small and honest: a client SDK, a collector, and a feature extractor. All MIT-licensed, all yours to run.

rtcstats-js

MITClient SDK

Wraps the WebRTC APIs in your app and streams getStats metrics plus your own custom events over a single WebSocket for the life of every session.

Runs: in the browser / your app

View rtcstats-js →

rtcstats-server

MITCollector

Receives session metrics over WebSocket, anonymizes IPs by default, and writes dumps to your own S3-compatible storage.

Runs: your infrastructure, behind a load balancer

Requirements & operations →

rtcstats-features

MITProcessing

Pulls dumps from storage, extracts KPIs and per-session features, and writes them to PostgreSQL. Runs as its own process.

Runs: your infrastructure

View rtcstats-features →

Your data never leaves your infrastructure

Two processes you run: rtcstats-server collects and anonymizes, rtcstats-features turns dumps into KPIs. It all stays in your infrastructure. Sending results to rtcstats.com is optional.

rtcstats-js

browser / app

WSS
Your infrastructure

Load balancer

rtcstats-server

1..N · writes S3 + PostgreSQL

S3

rtcstats files

rtcstats-features

1..M · pulls S3 · writes PostgreSQL

PostgreSQL

KPIs + features

optional

rtcstats.com

optional destination

rtcstats-server and rtcstats-features run as separate processes, so you scale them independently.

Your data, to do as you please

Self-hosting is not the compromise you accept to avoid a SaaS. It is what keeps your privacy and enables powerful enrichment and querying.

You own the data

The collection layer writes to your own S3-compatible storage and PostgreSQL, with IP anonymization on by default. Nothing leaves your network unless you forward it, so you stay the data controller for residency and privacy.

Nothing sits in the call path

The collector is a sidecar. It reads getStats, it never proxies your media or wedges itself between peers. If rtcstats-server stops, your calls keep running.

Send only what you choose

Sample at random, target a user or a region, trigger on a threshold, or forward on complaint. The selection rules are yours, and most sessions can stay entirely in-house.

Enrich it with what you already have

Join session records against your own context, from user tier to build version, and pull KPIs and per-session features into the dashboards, warehouse, and alerting you already run.

The fastest credible start

Install rtcstats-js, wrap your WebRTC code, and point it at your own rtcstats-server. That is the entire client-side integration. Deploying the server is a separate step, and it is documented.

npm install @rtcstats/rtcstats-js
import { wrapRTCStatsWithDefaultOptions } from '@rtcstats/rtcstats-js';
// Wrap before you create any RTCPeerConnection
const trace = wrapRTCStatsWithDefaultOptions();
trace.connect('wss://your-domain.example.com/' + window.location.pathname);
const pc = new RTCPeerConnection();

Full setup, server deployment, and configuration live in the integration guide and the repository README.

Put your WebRTC data to work

Session KPIs land in your PostgreSQL, raw dumps in your S3. From there the tools you already run take over: dashboards, alerts, and charts, all on your own terms.

Chart quality in your own BI tool

KPIs and per-session features land in PostgreSQL, so point Grafana, Metabase, or plain SQL at it and build the quality dashboards you want. No new UI to learn.

Alert on regressions

Wire the metrics in the database into the alerting you already run. Catch a packet-loss spike by region or app version the moment it starts.

Investigate a specific call

Every session's raw dump sits in your S3, the complete getStats timeline. Inspect it, diff it, or feed it into your own tooling to see exactly what happened.

Slice by your own dimensions

Join session features against your own data, from user tier to build version, and answer questions a hosted tool never could, because it never had that context.

See the data structure and analysis docs for the schema and query examples.

Maintained by WebRTC practitioners

rtcStats is built and maintained by three people who have spent years in WebRTC, across the standards, the engines, and the analysis. Source, releases, license, and issue tracker are all public.

Want the analysis brain on top?

The open-source layer captures and stores everything. rtcStats adds the analysis: automated observations, an experience score, and plain-English summaries of what went wrong. You can get it two ways, and both let you keep your data where you want it.

Send it to rtcstats.com

Point rtcstats-server at rtcstats.com and forward the sessions you choose. Hosted analysis, dashboards, and team workflow, with a free tier to start.

See plans and pricing →

Run it on your own infrastructure

Prefer that nothing leaves your stack? Run the same enrichment engine on-premise under an annual license, entirely self-managed.

Talk to us about on-premise →

FAQ

Questions developers ask

  • No. rtcstats-js and rtcstats-server are a complete, self-hosted collection pipeline. rtcstats.com is an optional analysis layer on top of the dumps you choose to send it.
  • No. The open-source packages do not call rtcstats.com or send any telemetry. Data goes only where you configure rtcstats-js and rtcstats-server to send it.
  • Nothing, unless you forward it. rtcstats-server stores anonymized dumps in your own storage. Only the specific sessions you send to rtcstats.com are forwarded.
  • The whole open-source monorepo: rtcstats-js, rtcstats-server, and rtcstats-features. You can self-host, modify, and integrate them freely.
  • Yes. You choose which stored dumps are sent for analysis on rtcstats.com. The rest stay in your infrastructure.
  • Any Linux host or container behind a load balancer that terminates TLS. Deployment guides are in the knowledge base.
  • Community support runs through GitHub issues. Premium support plans are also available.
  • The rtcstats.com analysis platform is a commercial service. Managed and on-premise options are covered on the pricing page or by contacting the founders.

It is yours to run

Clone the repo, read the docs, and self-host the whole collection layer. No signup, no sales call.