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
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
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
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
Load balancer
rtcstats-server
1..N · writes S3 + PostgreSQL
S3
rtcstats files
rtcstats-features
1..M · pulls S3 · writes PostgreSQL
PostgreSQL
KPIs + features
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-jsimport { wrapRTCStatsWithDefaultOptions } from '@rtcstats/rtcstats-js';// Wrap before you create any RTCPeerConnectionconst 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.