Back to Blog

August Updates v1.9: Self-Hosted Enrichment, New Observations & Open-Source Guides

rtcStats v1.9 brings self-hosted enrichment via the rtcstats-enrichment server, four new observations, and a new Open Source section in the Knowledge Base.

Posted by

August Updates v1.9: Self-Hosted Enrichment, New Observations & Open-Source Guides

Welcome to v1.9.0 of rtcStats! This release takes the same analysis brain that powers rtcstats.com and lets you run it in your own infrastructure, adds a fresh batch of Observations to catch stalled streams and sustained packet loss, and opens a brand new Open Source section in the Knowledge Base to guide your self-hosted setup.

Same signals, now yours to host. 🏠

🚀 Major Improvements

> Welcome rtcstats-enrichment 👋

The engine that computes rtcStats Observations and scores, @rtcstats/rtcstats-processor, can now run entirely in your own infrastructure. The new rtcstats-enrichment server is a small REST service that takes a WebRTC dump and returns just the enrichment: the Experience Score plus audio, video and connectivity scores and the Observations, in a clean JSON. No session is stored, nothing leaves your walls.

It is the same brain rtcstats.com runs, packaged so it can take a seat next to your own database. Point your rtcstats-server at it, or call it directly, and enrich the sessions you already collect so the raw dumps and the derived insight live together, on your terms.

The /v1.0/enrich endpoint in the rtcStats API referenceThe /v1.0/enrich endpoint in the rtcStats API reference

Prefer to try it against the hosted API first? Send a dump to POST /v1.0/enrich and see what you get.

The scores come back as an Experience Score out of 100 alongside audio, video and connectivity on the MOS scale, with the Observations flattened into SQL-friendly rows you can write straight into your own database.

The Open Source section of the Knowledge Base walks through standing rtcstats-enrichment up next to your own stack. Want a hand, or more detail? Reach us at support@rtcstats.com.

> Four New Observations 🔍 (Developer Plan)

The Observations engine gained four new signals, all aimed at failures that are easy to miss in raw stats:

  • Sustained packet loss: flags an outgoing or incoming media stream that stayed lossy for a sustained period, escalated to high severity when the loss is severe or long.
  • Stalled before capture: flags an inbound stream that was already stalled when the capture started, replacing the misleading "stalled stream" report on streams that never really began.
  • Stalled outbound stream: flags an outbound stream whose packetsSent counter froze after media flowed, or never moved at all during the whole capture.
  • Brief connectivity interruption: flags a short, recovered stall on the active connection path when STUN checks on the selected candidate pair briefly go unanswered.

The session viewer Observations panel showing the new sustained packet loss observationThe session viewer Observations panel showing the new sustained packet loss observation

> A New Open Source Section in the Knowledge Base 📚

Running the open-source stack yourself just got a lot easier to follow. The Knowledge Base has a brand new Open Source section that walks the whole journey, from prerequisites to day-two operations: what machine you need, how to instrument your client with rtcstats-js, how to deploy rtcstats-server on AWS or DigitalOcean, how to scale it behind a load balancer, how to secure it with JWT and configure it for privacy, and how to enrich and query the data it collects.

Whether you are standing up a private installation or wiring in our open-source components, there is now a guided path from zero to a working, enriched pipeline.

The new Open Source section in the rtcStats Knowledge BaseThe new Open Source section in the rtcStats Knowledge Base

🛠️ Other Enhancements

> Faster Long Calls ⚡

Long sessions now open far quicker. The session viewer renders as soon as the main summary responds, and the heavier devices, timelines and logs sub-resources stream in afterwards behind loading placeholders, so a 30 minute or 1 hour call shows its content almost immediately instead of waiting for everything to load at once. The summary charts at the top are downsampled to the chart resolution too, so long calls render as readable lines instead of an overplotted mess.

> JSON-First Logs and Custom App Events 📋

The Logs page reads much more cleanly. Event content is summarized by type, and expanded panels render as uniform key/value tables at every depth with arrays shown as indexed chip rows, so you can scan an event without wading through raw text. Custom application events also make their debut: the :-prefixed trace calls emitted by rtcstats-js now show up in the Logs with their own Custom filter and an APP badge, so your own app signals (a user rating, a feature flag, a business event) sit right next to the WebRTC traces.

> Refreshed Scorecards and Stream Tables 📊

The session viewer widgets got a broad visual refresh. The CPU card leads with the worst state and its share of the call, the Buffering and Latency cards replace threshold guides with red danger zones and an "X% is over Yms" caption, and the Connectivity chart becomes a connection band that flips shade on every handover and carves a red slice on each disconnection. The Streams and Channels tables were redesigned to lead each row with the SSRC, group by peer connection, and share a common timeline origin so bars are directly comparable. A single direction rule now colors the scorecards: outbound media in Signal Blue, inbound in indigo, undirected metrics in neutral slate.

🐞 Bug Fixes

> Honest MOS on Streams with no Media 🎧

MOS no longer scores streams that carry no media. Streams with under five seconds of RTP-active time carry no MOS series or average MOS at all, so a quiet or unused stream no longer inflates the numbers with a phantom score.

📦 Ecosystem Updates

> API & MCP: the new /enrich Endpoint 🔌

  • New POST /v1.0/enrich (Paid Plans). A stateless endpoint that returns only the scores and a trimmed observations projection as well-formatted JSON: experience, audio, video, connectivity and observations scores, per-severity counts, flat observation records and the user-agent data. It is Bearer-authenticated and metered like /analyze (one credit), the session is never stored, and it powers both rtcstats-server's rtcstats.com integration and the standalone rtcstats-enrichment server.
  • Chunked uploads on /analyze and /enrich. Both endpoints now accept the same chunked /v1.0/upload protocol, so dumps above the platform request-body cap can be analyzed or enriched, with ?save=true still honored on /analyze.
  • Homogenized number formats. Numeric values in every session response are rounded consistently: epoch timestamps truncate to a whole millisecond and other numbers keep at most 2 decimals, except for audioLevel, which needs to carry more precision.
  • Slimmer payloads. The internal schemaVersion, analysisVersion and observationsVersion fields are gone from analyze, sessions/{rtcstatsId} and MCP get_session; a single processorVersion now sits at the response envelope, mirroring enrich.

> rtcstats-server (main) 🛠️

Landed on main since the last release:

  • It can now write the observations and scores computed by rtcstats.com straight into its own SQL database, closing the enrichment loop for self-hosted deployments: send a dump, get the insight back, keep it alongside your own records.
  • The rtcstats.com endpoint is configurable and now defaults to api.rtcstats.com (the previous URL keeps working), and embed URLs for sessions stored on rtcstats.com are fixed.
  • Configuration in YAML is supported out of the box through node-config, and TLS setup no longer requires ssl.capath to be set.
  • Empty uploads are rejected with a clear 422 instead of being silently dropped, making a misconfigured client easy to spot.

> rtcstats-js (main) 📡

The current release is v2.3.0.

Already on v2.3.0? You are still on top, nothing to do here. You have the latest published version, so enjoy the existing features while these main improvements bake for the next release.

If not, see the v1.8 release notes for the full changelog.


We're excited to see how you use the new self-hosted rtcstats-enrichment server and the new observations to get deeper insight into your WebRTC sessions, wherever you choose to run them! As always, the latest version of rtcstats-js is available - make sure you're up to date to get the best out of these new features.

Happy debugging! 💎