All notable changes to rtcStats are documented here, most recent first. This project follows Keep a Changelog and Semantic Versioning.
Tags, reused across releases:
API: the public REST + MCP APIEngine: the analysis engine, observations, deductions and the experience scoreAI: all work around AIDashboard: the dashboard and session viewerWeb Site: the public website (landing, pricing, showcase, blog)KB: the knowledge baseSecurity: security fixes and hardeningChore: user-visible platform changes (performance, domains, infrastructure)
[2.1.0] - Unreleased
Added
- [Dashboard]: Mark sessions recorded from an app that embeds Chromium, show connection certificates with their fingerprint and expiry, expand replaceTrack events in the logs, and badge every device with its connection (USB, Built-in, Bluetooth and others), sharing it across the devices of the same equipment. Times in the session tables follow your date and time format, and the Camera and Video cards show the resolution as a quality label such as 720p.
- [KB]: Ask for a reason after a negative "Was this page helpful?" vote (missing information, outdated instructions, command or example did not work, could not find the right page, something else) plus an optional short comment, stored per article slug in the new
kbArticlesFeedbackReasonstable. The prompt is skippable and the vote is banked before it appears. - [KB]: Show the negative-vote reason breakdown and the latest reader comments per article in the admin KB engagement table, with a link icon on each row that opens the article in a new tab.
- [KB]: Show the "Was this page helpful?" widget on the WebRTC metrics articles too (
/kb/<slug>), which never carried it. It previously appeared only on the nine category article routes, so roughly 60 of the ~430 KB articles could be voted on at all. - [Dashboard]: Settings > Billing shows the full date of each credit purchase, and how many purchased credits you have used and still have available.
- [API]: Session payloads carry three new rtcstats-features facts, matching
rtcstats-server:maxReceivingAudioStreamsandmaxReceivingVideoStreamson each peer connection (the peak number of streams receiving at once), andisScreenshareon video streams. Sessions analysed earlier gain them the next time they are opened. - [KB]: New articles on MOS, connection states and ICE candidate pairs, linked from the session viewer.
Changed
- [KB]: A reader can now change or clear a "Was this page helpful?" vote instead of being locked into the first click: clicking the other thumb switches, clicking the active thumb clears. The counters move by a delta rather than always incrementing, re-sending the same vote is a no-op so a retry cannot double-count, and a count can never be driven below zero by a stale client. Flipping away from a negative vote also retracts the reason that was given with it.
- [AI]: The AI summary of a file uploaded from the dashboard now starts as soon as the upload finishes and appears in the session on its own once it is ready, on the dashboard, share and embed viewers, instead of the viewer giving up after 30 seconds. A short line shows it is being written, and a summary that fails is hidden and retried on a later open. Sessions uploaded through the API still get their summary when first opened.
- [Security]: Stop a signed-in user or a share link holder from restarting the AI summary of a session outside their account.
- [Security]: Restrict the remaining administration endpoints to administrators, and stop a signed-in user from reading the comments of a session outside their account.
- [Security]: Every dashboard API endpoint now requires a signed-in session unless it is explicitly declared public, and a share or embed link no longer opens endpoints beyond the shared session.
- [Security]: Only account owners and admins can change roles, remove teammates, send or cancel invitations, and create or revoke API tokens; a member can still leave a team on their own.
- [Dashboard]: New API tokens last 6 or 12 months (existing unlimited tokens keep working), the Applications list shows who created each token, and the tokens a user created are revoked when they leave the team or delete their account.
- [Dashboard]: The Devices table links a sent track to a device by its track id only: the Unlinked state is replaced by an Other audio source or Other video source row for a sent track that no recorded capture returned, and a sent track whose capture happened before the recording started is shown under its device name. Device bars show how long each device was on when the recording logs it, and are dark when the track was sent.
- [Dashboard]: The Video (inbound) card shows the number of received video streams held the longest, the peak, and a red tick at each video freeze, with a line of the streams actually decoding over the call. The Client tab and the Devices table count every listed item.
- [API]: Credits are now taken one request at a time per account, so concurrent
upload,analyzeandenrichcalls can no longer spend more credits than the account has: the call that misses the last credit returns402no_credits, possibly after the dump was processed. - [Dashboard]: Clearer tooltips that follow the theme, with "Learn more" links to the knowledge base.
- [Dashboard]: A compact, consistent layout for the timeline hover cards.
Fixed
- [AI]: Fix opening a session again while its AI summary was being written restarting the generation, which delayed the summary and slowed the session load.
- [Engine]: Fix an audio observation claiming the remote side sent silence when a Chromium-based app plays incoming audio through WebAudio, which reads no level while the audio is audible. It is now informational on those clients and explains this cause.
- [Engine]: Fix the microphone level and the start of outgoing sound being missing, and outgoing video quality being underrated, when the application attached its microphone or camera to the call after it had started.
- [Dashboard]: Fix the Devices page showing "No microphone" when the microphone was opened before the dump capture started: it now shows the microphone that was sent.
- [Dashboard]: Fix a microphone attached before the recording started being hidden from the Client tab when the same microphone was opened again later in the session.
- [Chore]: Fix deleting a session, from the dashboard or the API, or removing it at the end of its retention period, leaving some of its earlier analysis files in storage: every stored file of the session is now removed.
- [Dashboard]: Fix dashboard uploads not being refused by the server once the account had no credits left.
- [Dashboard]: Fix credits used beyond the monthly allowance before a credit pack was bought being deducted from that pack: the remaining credits shown in the dashboard,
GET /v1.0/quotaand the MCPget_quotatool can read higher. - [Dashboard]: Fix the Credits Usage chart labelling each month one month early for users west of UTC.
- [Dashboard]: Fix sessions recorded by a client that hides addresses, ports or stream identifiers showing raw values (
undefined, port0, empty stream names, a placeholder TURN host) and only one of the gathered local candidates: hidden values now read<masked>, an unidentified network interface reads Not identified, and every candidate is listed. - [API]: Fix
gatheredHostCandidate,gatheredSrflxCandidateandgatheredTurnCandidatereadingfalseon sessions whose candidate addresses and ports were hidden by the client;gatheredMdnsCandidateis now absent when no candidate address is known. Sessions analysed earlier are corrected the next time they are opened. - [Engine]: Fix a connectivity observation firing on sessions recorded without ICE candidate events although a relay candidate was gathered.
[2.0.0] - September, 28th 2026
Added
- [API]: Add the rtcstats-features catalogue to every session payload under
features.client,features.devices,features.globalsandfeatures.audio, with the per-connection and per-track facts folded intopConnectionsandstreams, so dumps uploaded straight to rtcStats carry the same client, connection and track facts thatrtcstats-servercomputes; on every plan and every surface (dashboard, share and embed viewers, REST, MCP,POST /analyze). - [API]: Add the lifetime counters
concealmentEvents,packetsDiscarded,retransmittedPacketsSentandretransmissionRatioto the media entries ofstreams, on every surface. - [Engine]: Add 2 new observations covering connectivity issues.
- [API]: Add read-only application tokens: a read-only token serves every read (sessions, quota, observations, MCP tools) and is refused with
403and the newerrorCodeinsufficient_scopeon the endpoints that spend a credit or delete a session (upload,analyze,enrich,DELETE /v1.0/sessions/{rtcstatsId}). - [Dashboard]: Let you pick the scope of an application token, full access or read-only, when creating it under Settings > Applications, and show the scope of each existing token in the list.
- [API]: Add
maxFileSizeBytesandmaxChunkSizeBytestoGET /v1.0/quotaand the MCPget_quotatool, so a client can read the size it is allowed to upload and how to split it, instead of discovering the limit through a413.maxFileSizeBytesisnullon an account with no limit. - [API]: Add
GET /v1.0/observations/{type}and the MCP toolget_observation_explanation, which return the explanation of one observation type as Markdown sections, with its title, description, severities, tags and related types. No credit is spent and read-only tokens are accepted. - [Dashboard]: Show the periods where an audio or video stream's MOS sits at its minimum as a hatched Bad segment on the Streams timeline, with their duration in the tooltip next to Poor, each labeled with the MOS range it covers, and count them toward the stream's "Mostly poor quality" state.
- [API]: Paginate
GET /v1.0/sessionsand the MCPlist_sessionstool withlimit(1 to 1000, default 100) andpage(default 1). Every response now also carriestotalCount,page,limit,totalPagesandhasMore, so a client can see how many sessions match and walk through all of them. - [Dashboard]: Add a Negotiations section to each connection's details on the Connections page, listing every negotiation and renegotiation with its outcome (completed, failed, no answer, incomplete, rolled back) and, for each signaling call, its result, how long it took, the time since the previous call, the media sections with their SSRCs and the browser error when a call fails.
Changed
- [Dashboard]: The data channel chart now opens on Bytes, shown before Messages.
- [API][Breaking Changes]: The MCP endpoint now requires the application token on every request,
initializeandtools/listincluded: a missing or invalid token is answered with HTTP401and aWWW-Authenticateheader, a plan without API access with403, instead of a tool error after connecting. REST401responses now carryWWW-Authenticatetoo. - [API][Breaking Changes]:
GET /v1.0/sessionsand the MCPlist_sessionstool now return the 100 newest sessions when called withoutlimit, instead of up to 1000. Passlimit(up to1000) andpageto read more. - [Engine]: With the advanced audio MOS, incoming audio the listener could not hear (an audio interruption, no audio released by the jitter buffer, or no audio energy at all) now scores the minimum MOS of 1, and a shorter interruption lowers the MOS in proportion to its duration, so the MOS, audio and experience scores of sessions with audio cuts can go down.
- [API][Breaking Changes]: Remove the documented MOS value
0for an unusable transport (RTT of 15 seconds or more): it is now1, the minimum, so every MOS, includingavgMosand themos_*keys ofaggregatedStats, lies between 1 and 4.5. An unusable transport stays visible throughrtt_*_max_msat 15000 or more. - [API][Breaking Changes]: Remove the
deductionsfield from the session payload of the REST API, MCPget_sessionandPOST /analyzewhile the Deductions layer is reworked; it returns once it is ready. - [AI]: Rewrite the AI summary prompt: it reads only the session facts it needs, follows the media path in each direction, names the origin of a problem on evidence only, and uses the same five-level scale (excellent, good, acceptable, poor, bad) for every score.
- [API]: Remove
mediocrefrom the documented values of the AI summary scoresnetworkScore,mediaScoreanduserScore; the five remaining values are unchanged. - [KB]: Observation explanations now open only inside the app, for a signed-in user or anyone holding a share or embed link, and a reference from one explanation to another opens in place in the same popup instead of sending you elsewhere. The popup now closes with Escape, keeps the page behind it inert while open, and returns focus to whatever you opened it from. The metric explanations behind the KB badges on the charts are now served the same way; the public knowledge base pages are unaffected.
- [API][Breaking Changes]: Remove
GET /v1.0/observations, the catalog of observation types, which now answers410 Gonewith the newerrorCodegoneand aSunsetheader, with or without a token. The observation types are no longer published anywhere:/schemas/vocabulary.jsondrops them too and keeps only the severity, category, tag, score and plan value sets. Read the types you need fromdata.observations[].typeand fromabstract.observationTypesonGET /v1.0/sessions, and treat the set as open. - [KB]: Remove the observation pages from the public website: they no longer appear in the WebRTC Metrics list, its Observations filter, the knowledge base search, the category counts or the sitemap, and an old
/kb/observation-...link now answers410 Gone. The explanations themselves are unchanged and stay one click away in the app, on the session that raised the observation. - [Chore]: Darken the blue accent carried by links, buttons, selected states and the account emails so text on it clears the WCAG AA contrast minimum, on both the light and the dark theme.
- [Dashboard]: Make the knowledge base badge on each chart legend row reachable with the keyboard, as its own stop beside the series toggle.
- [API]: Observations no longer carry the
meaningfield. - [KB]: Align each observation's short explanation in the app with its knowledge base article, so both say the same thing, and correct the explanations of two audio observations.
- [API][Dashboard]:
connectivity, each connection's type, the TURN usage flags and the candidate pair types now describe the local side only: a connection reaching the other party's relay without using its own readsDIRECT/UDPinstead ofTURN/UDP. Same values and shape, not breaking. - [Dashboard]: The Symmetric NAT row of a connection no longer claims a TURN server is needed, and shows its value as a warning rather than an error.
- [Engine]: Raise the connectivity and experience scores of sessions that reached the other party's relay without using their own, since the connectivity score now counts only the relay this endpoint used.
- [Dashboard]: Observation cards now show the count or duration badge on the description line, keeping the timestamp alone on the title line.
- [Dashboard]: Redesign the Connections, Streams, Channels and ICE Connectivity tables: each row shows its state (such as Connected, Failed, Active, Stalled or Unused), its start time and its duration, and each group of rows shares its own time axis with clock times. Order the Connections, Streams and Channels by Time, placing each bar at its real start, or by Duration, starting every bar at zero to compare lengths; in Streams and Channels, Align by Peer start shows how long media took to start after the connection opened.
- [Dashboard]: Redesign the Devices table: rows are grouped by the origin that made the request, with one row per microphone, camera or screen track, its state (Used, Replaced, Unlinked, Not sent, Failed or Listed), the connections that sent it, and a timeline showing the wait for permission and how long each track was sent. A microphone or camera shows Unlinked, rather than Not sent, when a connection sent a track of the same kind that the app likely created from a capture, and it names that connection and track. Devices that belong to the same equipment, such as a webcam and its microphone or a headset's microphone and speaker, are marked as linked. Long device names show on two lines, with the model in parentheses below the name. Repeated identical failures and device listings fold into a single row, USB and default devices are marked with a badge, including the German and French default device prefixes, and long idle periods are folded on the time axis. The System details now sit above the table, which uses the full page width.
- [Engine]: Improve how observations and the device feature flags recognize device hardware, so more peripheral devices are identified correctly.
- [KB]: Knowledge base article pages are lighter to download, with the same content and links.
Fixed
- [Dashboard]: Fix the chart tabs showing a separator between some tabs but not others, and a blue right border on the selected tab of the connection and data channel charts.
- [Dashboard]: Fix STUN and TURN servers configured with an IPv6 address showing
UNKNOWNinstead of their transport and port in a connection's details, and a TURN URL without a port losing itstransportparameter. - [Engine]: Fix some connections that never managed to connect in Chrome being reported as having dropped, rather than as having failed to connect.
- [Engine][API][Dashboard]: Fix peer connections closed before their first statistics sample: they now appear in the session (with
hasStatistics: false) with their real lifetime, state and failure reason, and get the connectivity observations they were missing. A connection closed before it ever tried to connect is no longer scored 0 and no longer lowers the connectivity score. A connection established over UDP no longer raises a false connectivity finding, configuration findings shared by several connections are reported once, the MCP tools also return their result as text, and observation cards in the session viewer are more compact. - [Engine]: Fix four observations covering audio and outgoing media being reported at a fixed severity regardless of how much of the call they actually affected, which also pushed down the experience score of sessions that were barely impacted. Their severity now reflects the scale of what was detected, they carry the measured values that severity was graded on, and a signal too small to matter no longer raises them at all. Along the way, the one covering outgoing media was measuring its signal in the wrong unit, so it could be raised or missed for the wrong reason: it is now correct and applies to video as well as audio, and one audio observation that was repeated on every incoming stream of a connection is reported once.
- [API]: Fix a gzipped dump being measured against the account size limit twice with two different meanings: the chunks against their compressed size, then the assembled file against its decompressed size, so a file accepted chunk after chunk could still fail with
413once fully sent. Only the bytes you upload are measured now, on every ingest path, and the413lands on the chunk that crosses the limit instead of at assemble. - [Security][Dashboard]: Fix dashboard uploads not being checked against the account size limit at all on the server, where the limit was enforced only by the upload page before the first request left the browser.
- [API]: Fix
data.fileSizereporting a different number for the same dump depending on how it was sent: a gzipped body onPOST /analyzeandPOST /enrichreported its compressed size, while every other path reported the dump content size. It is now the dump content size everywhere. - [API]: Fix
POST /v1.0/uploadanswering500instead of400invalid_requestwhen the assemble request carries a non-stringfileName. - [API]: Fix
data.fileNamechanging after a session was re-analyzed; it now keeps its upload-time value. - [Engine]: Fix two audio observations being raised on calls with no echo problem, by relying only on actual echo measurements.
- [Dashboard]: Fix the session Overview Summary panel showing its values at inconsistent widths, and cutting them off or pushing them outside their card on narrower windows.
- [Dashboard]: Fix the session Overview Insight chart not drawing at all on narrow windows, where its title ran into the Summary heading.
- [Dashboard]: Fix the dark theme serving the light theme's blue accent on several controls, where a hardcoded color overrode the theme value.
- [Engine]: Fix some rtcstats dumps captured after the collecting client reconnected being dated January 1st, 1970, and fix the duration of sessions where no connection produced statistics, which ignored when those connections ended.
- [Engine]: Fix the connectivity observations on ICE server errors pointing at the last failure instead of the first, and always counting a single failing server however many failed.
- [Engine]: Fix the microphone type not being detected when the dump capture started after the microphone was opened.
- [Engine]: Fix a connectivity observation being missed on short connections that closed before candidate gathering finished.
- [Engine]: Fix a connectivity observation raised on ordinary NATs, and also detect it from the connection in use.
- [Dashboard]: Fix the session Overview hiding its score cards when no score could be computed, and offering an upgrade on an empty experience score to plans that already include it.
- [Dashboard]: Fix the Microphone and Camera widgets of the Devices page showing a broken device name, such as "Standard - Desktop Microphone)", when the model name in the device label contains its own parentheses or the label starts with a German or French default device prefix.
[1.10.0] - September, 7th 2026
Added
- [Engine]: Introduce Deductions, automatic root-cause analysis that explains the likely reason behind a call's connectivity or audio problems.
- [Engine]: Add 11 new observations covering connectivity and audio issues.
- [Web Site]: Add a
/comparesection comparing rtcStats to the alternatives: webrtc-internals, watchRTC, callstats.io, ObserveRTC, and building it yourself. - [Web Site]: Add a
/trustTrust center gathering the security, privacy, compliance, availability and API lifecycle answers a security review asks for, and a/compliancepage covering the data held, its location, its retention, the sub-processors involved, and which certifications rtcStats does and does not have. - [Dashboard]: Show the last packet sent and last packet received times for each ICE candidate pair in the Connections panel.
- [API]: Add per-account rate limits on the public API and MCP tools: over the limit, REST returns
429withRetry-Afterand MCP tool calls return a tool error, and every response emitted after the rate check carriesX-RateLimit-Limit,X-RateLimit-RemainingandX-RateLimit-Reset. - [API]: Complete the OpenAPI spec (every
errorCodevalue with its meaning and an example, the code returned by each error response, the403and429responses, the rate-limit headers) and add an agent quickstart tollms.txt, so a client can branch on the code rather than on the message. - [KB]: Add an IT specifications and requirements page for the open source
rtcstats-server, for infrastructure and security reviews.
Changed
- [API][Breaking Changes]: Group deductions by issue in the API and MCP response (one entry per issue holding its ranked causes) instead of one flat entry per cause, and drop the
title,polarityandsourcefields from each deduction. - [API]: Shorten the deprecation notice window to 6 months for a version and 3 months for an individual endpoint or field, and add the release blog post and changelog
[Breaking Changes]tag as additional deprecation-signalling channels. - [Engine]: Broaden an existing connectivity observation to also flag ICE restarts and re-offers made right after a call connects.
- [AI]: Leave unused peer connections and streams out of the AI summary input, for a more focused summary.
- [Dashboard]: Redesign the dashboard sessions table and session-viewer tabs for higher information density and a better fit on laptop screens, remove the redundant Connections "Error type" row now covered by observations, and move the Quick start checklist into the sidebar.
- [KB]: Redesign article pages with a persistent section rail, table of contents, last-updated dates, and a "start here" section on the knowledge base home.
- [Security]: Require an explicit confirmation click for sign-up instead of an email link that opens automatically (closing an automated-scanner bypass), and extend CAPTCHA protection to sign-in, password reset, and invite acceptance.
- [Dashboard]: Redesign the Streams, Pairs and Channels charts for long calls, which run from ten minutes to several hours: a multi-hour session now reads as clearly as a short one, each metric shows its range around a thinner mean line rather than a solid block of points, and dragging across the time axis zooms into a window at full detail.
- [Dashboard]: Simplify the Streams, Pairs and Channels chart tooltips and give each unit its own decimal precision.
- [Dashboard]: Relabel the Connections Pair Information traffic rows as Bitrate (Outgoing) and Bitrate (Incoming).
- [KB]: Rewrite the
rtcstats-serverrequirements and operations guide around a before-production checklist and a production readiness path. - [Web Site]: Reorganize the footer into Product, Resources and Company columns, and surface the Compare page and the Trust center from the header, footer, pricing and open source pages.
Fixed
- [API]: Fix an unexpected failure of
GET /v1.0/sessions/{rtcstatsId}returning an HTML error page instead of the documented{ error, errorCode }body withother_issue. - [API]: Fix an oversized or malformed
multipart/form-datachunk on/v1.0/upload,/v1.0/analyzeand/v1.0/enrichreturning an empty500instead of a documented error: a chunk above the 10 MB request body limit now returns413file_too_large, and an unparsable one400invalid_request. - [API]: Fix an empty or malformed JSON assemble body on
/v1.0/uploadreturning an empty500instead of400invalid_request. - [Security]: Stop
DELETE /v1.0/sessions/{rtcstatsId}returning the raw database error text in its500body; it now returns a fixed generic message like every other route, with the real cause logged server-side only. - [Engine]: Fix streams that stall right after capture starts being misreported, and stop already-flagged stalled streams from producing extra, noisy observations.
- [Engine]: Fix connection-failure observations not firing when a call's ICE connects but negotiation never fully completes.
- [Engine]: Fix the experience score showing a low, misleading value instead of unavailable for sessions that never made a real call, and fix the connectivity score being skipped or computed incorrectly when a session's timestamps were invalid.
- [Engine]: Fix the call date missing on sessions where no peer connection produced statistics.
- [Dashboard]: Fix inbound media byte counts not being recorded for received streams.
- [Dashboard]: Fix Highcharts failing to render on the session-viewer Overview page after visiting Settings then Billing, or an admin chart, earlier in the session.
- [Dashboard]: Fix layout glitches in the sessions table (Title column collapsing) and the Logs tab (a stray double separator).
- [Dashboard]: Fix the Logs tab crashing when expanding an SDP event whose audio or video section carried no resolvable codec, as happens with sections rejected during a renegotiation.
- [Dashboard]: Fix the Logs tab scrolling slowly on sessions with many events.
- [Dashboard]: Fix candidate-pair charts and observation badges resolving to the wrong peer connection when two peer connections reused the same pair ID.
- [KB]: Fix broken links across the knowledge base.
- [Chore]: Fix web site, knowledge base, and blog pages being needlessly slow by making them cacheable at the edge instead of re-rendering on every request.
[1.9.2] - August, 30th 2026
Changed
- [SECURITY]: Extend Turnstile/CAPTCHA protection to
/signin(password and magic link),/lost-password, and/accept-invite, matching the coverage already enforced on/register.
[1.9.1] - August, 27th 2026
Changed
- [SECURITY]: Require an explicit
POSTfrom a "Confirm sign up" click instead of the emailed link'sGETcompleting signup, closing a bypass where automated email-security scanners could confirm accounts without the owner's action; add Cloudflare Turnstile groundwork to/register.
[1.9.0] - August, 3rd 2026
Added
- [Engine]: Add 7 new observations covering network and connectivity issues.
- [Dashboard]: Show custom application trace events from
rtcstats-jsin the Logs tab. - [API]: Accept the same chunked upload protocol used by
/uploadonPOST /analyze, so large dumps can be analyzed too. - [API]: Add
POST /v1.0/enrich, a lightweight endpoint returning scores and observations only, metered like/analyze.
Changed
- [Dashboard]: Render the session viewer as soon as the summary responds, loading devices, timeline, and logs in the background.
- [Web Site]: Retheme the site to the Signal Blue brand color and polish the landing page (hero motion, CTA accessibility, contrast).
- [KB]: Reorganize the knowledge base home page into tiers with a promoted category trio and a metrics reference band.
- [Dashboard]: Redesign the session-viewer cards (CPU, Buffering, Latency, Connectivity, Microphone, Speaker, Webcam, Video) with downsampled sparklines, threshold zones, and a unified color system.
- [API][Breaking Changes]: Stop returning internal
schemaVersion,analysisVersion,observationsVersion, andyoutube_urlfrom session responses, and expose the processor version asprocessorVersioninstead. - [API][Breaking Changes]: Rename the
durationfield todurationInSecondsin sustained-loss and connectivity-loss indicators, and round numeric values across session responses (timestamps to whole milliseconds, others to at most 2 decimals). - [Security]: Harden the upload chunk store against prototype-pollution and cross-account key collisions.
Fixed
- [Dashboard]: Fix the sessions table Date and Imported-at columns not sorting correctly.
- [API]: Apply the account's MOS computation settings on
POST /v1.0/analyzeeven without?save=true. - [Engine]: Fix phantom MOS scores being computed on streams with no media.
- [Dashboard]: Fix
addTrack/ontrackevent details rendering as raw objects instead of a readable summary in the Logs tab. - [Dashboard]: Fix TURN TCP/TLS detection being applied outside relay candidate pairs.
- [Dashboard]: Fix a Highcharts crash (
missingModuleFor: arearange) on session-viewer charts and dashboard stat cards. - [Dashboard]: Apply the brand color consistently on light-theme pages (sign-in, register, password reset, invite).
[1.8.0] - July, 13th 2026
Added
- [Dashboard]: Add dark and light themes with a toggle, persisted per user.
Changed
- [Dashboard]: Redesign the Overview stat cards (Audio/Video In/Out) with a min-to-max range track and hover detail, tiered Jitter/RTT units, and aligned call-start timelines across Streams, Data channels, and sessions list stat cards.
- [API][Breaking Changes]: Rename every
aggregatedStatskey to a<metric>_<scope>_<agg>_<unit>shape (e.g.rtt_out_audio_avg_ms) and add P5, P95, and standard-deviation variants; the former unitless keys are removed. - [Chore]: Make
rtcstats.comthe primary domain;www.rtcstats.comnow redirects to it.
Fixed
- [API]: Fix
POST /upload,/analyze, and the dashboard upload returning500instead of415when the uploaded file can't be parsed. - [Dashboard]: Fix downloading a session whose file is missing from storage returning
500instead of404. - [Engine]: Fix MOS not dropping to 0 when round-trip time reaches 15 seconds or more.
- [Engine]: Fix an audio-delivery observation's percentage being computed over the wrong sample set.
[1.7.0] - June 22th, 2026
Added
- [Web Site]: Add a
/supportpage, a homepage "What's new" section, and a dedicated/integrations/mcphub page. - [API]: Serve the public API from a dedicated
api.rtcstats.comhost, and addGET /v1.0/observations, a catalog of every observation type with its severity and tags. - [Dashboard]: Add a Quick start checklist to the dashboard, and show available bandwidth and traffic for each ICE candidate pair in the Connections panel.
Changed
- [Dashboard]: Reorganize session-viewer tabs (Overview, Timeline, Session, Content, Client, Logs) and regroup widgets accordingly.
- [API]: Add per-type identifiers (
ssrcId,labelId,sid) to the observationsource; the top-levellabelis deprecated. - [API][Breaking Changes]: Rename the observation
flagfield totype, and theobservations/observationFlagsfilters toobservationTypes.
Fixed
- [Engine]: Fix per-second rate and per-frame metrics assuming a fixed 1-second polling interval, throwing off values on sessions polled at a different rate.
- [Dashboard]: Fix the connectivity score not displaying for peer connections that never negotiated or connected.
- [Web Site]: Fix the header Resources dropdown rendering behind page content.
[1.6.0] - June, 1st 2026
Added
- [Dashboard]: Show session geolocation and an IPv4/IPv6 indicator on Overview and Connectivity, and add a Security section (TLS version, DTLS direction, ciphers) to the Peer Connection pane.
- [Engine]: Add 2 new observations covering configuration issues.
- [API]: Accept richer filters on
GET /v1.0/sessionsand MCPlist_sessions(name, tags, browser version, conference/session ID, severity and score thresholds), plus a denormalizedabstractsummary on each session; also serve a Markdown API reference at/api-docs.md. - [Dashboard]: Add summary stat cards, a Score column, and OS/Client filters to the dashboard sessions table.
- [Dashboard]: Add a dashboard "Client" screen with a media timeline of call phases, device acquisitions, and observations.
Changed
- [Dashboard]: Replace the Overview Areas tag strip with a treemap, and let logged-in users browse the homepage and other static pages.
- [Engine]: Fire performance-limiting observations based on absolute duration too, not only their share of the call.
- [Dashboard]: Simplify the free-plan sessions page to a single "needs attention" total with a paid-plan lock badge instead of per-session scores.
Fixed
- [Dashboard]: Fix audio levels going wrong when an outbound stream changes its media source mid-session.
- [Dashboard]: Fix STUN/TURN entries not rendering in the Connectivity table when an ICE server's
urlswas a single string instead of an array. - [Engine]: Fix a connectivity observation firing even though the selected ICE pair already used UDP.
- [Dashboard]: Fix corrupt log timestamps producing a negative call duration, and surface the real parsing error instead of a generic "Parsing issue" message.
- [Security]: Block non-admin users from fetching another account's session summary or dump.
- [Web Site]: Fix the header showing the account name instead of the signed-in user's display name, and return users to the page they requested after sign-in instead of the dashboard.
[1.5.0] - May 1st, 2026
Added
- [Dashboard]: Show geolocation for TURN/STUN candidates and pairs, and log device changes, track endings, and
getUserMediaerrors. - [Engine]: Add new observations covering audio and device issues.
- [Dashboard]: Let users leave feedback on a session, with email notifications.
- [KB]: Render Mermaid diagrams in articles.
- [Web Site]: Add an Open Source page and a Resources navigation menu.
Changed
- [API][Breaking Changes]: Rename
sessionIdtortcstatsIdandembed_urltoembedUrl(Enterprise only) everywhere on the public API and MCP; addrtcstatsUrland, on/quota,accountName/accountPlan; omit rather than null these fields when not applicable. - [Security]: Harden against header injection from client-supplied identity headers, stop logging
Authorizationvalues in plaintext, and add CSP/X-Frame-Optionsheaders on non-embed routes.
Fixed
- [Engine]: Fix simulcast-related observations counting more than once per peer connection.
[1.4.0] - April 20th, 2026
Added
- [Dashboard]: Add an embeddable viewer; Enterprise accounts can expose sessions in an iframe with a domain allowlist.
- [API]: Add session list/get/delete and quota endpoints, and turn the MCP endpoint into a full MCP server.
- [Engine]: Add 5 new observations covering network and video issues.
- [KB]: Add FAQ, how-to, privacy/compliance, and embeddable-viewer articles.
Changed
- [Dashboard]: Rework the free and trial plans (limits, counters, upgrade prompts) around a startup/developer trial flow.
- [Web Site]: Add more showcase examples and refresh pricing, homepage, and onboarding copy.
Fixed
- [Dashboard]: Fix stray chart lines, wrong per-stream timestamp references, and an "Excellent" MOS badge showing when MOS could not be computed.
- [Engine]: Remove an audio-processing observation that proved unreliable on Linux.
- [Dashboard]: Fix password recovery, an unintended logout of every session on password change, the Settings tab resetting on refresh, and incomplete cleanup on account deletion.
- [Security]: Stop sessions from being exposed through the embeddable viewer when the feature is disabled or the request comes from an untrusted domain.
[1.3.0] - March 27th, 2026
Added
- [Dashboard]: Add the Experience Score (a composite per-session score) and a Connectivity score with a visual connection timeline.
- [Engine]: Add a user-selectable MOS algorithm, an improved Opus-oriented and video MOS, a tag cloud, and new observations covering connectivity issues.
- [Dashboard]: Show peer role, content type, and simulcast/SVC indicators in the Streams table, and add outgoing webhooks configurable from account Settings.
- [Web Site]: Add more public showcase sessions and videos.
Fixed
- [Engine]: Fix ICE-server detection when multiple servers share one URL entry, and improve relay-only protocol inference.
- [Engine]: Fix MOS computation regressions and candidate-pair RTT/STUN handling when values were missing.
[1.2.0] - March 9th, 2026
Added
- [API]: Launch the public API (
/upload,/analyze,/mcp) with an OpenAPI spec and documentation page. - [Dashboard]: Add application tokens (Settings, Applications) to authenticate API requests.
- [Engine]: Add new observations covering performance and video issues.
- [Dashboard]: Show rtcstats client, user, conference, and session metadata in Session Details, and add tags and descriptions to sessions.
- [KB]: Add full-text search and a redesigned knowledge base.
- [AI]: Support newer Anthropic models for AI summary generation.
Fixed
- [Engine]: Fix a missing duration on an audio observation and a null framerate value.
- [Dashboard]: Fix handover timestamps, double scrollbars, and sessions table pagination and height issues when filtering.
- [KB]: Fix article content and search inside the article popup.
[1.1.1] - February 26th, 2026
Added
- [Web Site]: Add 6 new showcase sessions and videos.
[1.1.0] - February 16th, 2026
Added
- [Dashboard]: Give new accounts 5 gold credits to try Observations and AI summary.
- [Engine]: Add 5 new observations covering connectivity and security issues.
- [Dashboard]: Show time-to-first-candidate connection metrics, support moving a dump between accounts, show an error for AEC-only uploads, and add a YouTube banner on public shares.
- [Web Site]: Add a showcase page featuring the first publicly shared sessions and videos.
Changed
- [Web Site]: Refresh pricing to introduce gold credits and rtcstats-format support on the free plan.
Fixed
- [Dashboard]: Fix some rtcstats event logs not displaying, or displaying incorrectly.
[1.00] - January 25th, 2026
Added
- [AI]: Add automatic, background AI call-summary generation.
- [Engine]: Add 6 new observations covering device, audio, and connectivity issues.
- [Dashboard]: Detect and surface the media server or stack in use (Pion, PJSIP, Pixel Streaming, ICE-Lite) in Session Details.
Changed
- [Dashboard]: Skip AI summary generation on free accounts.
Fixed
- [Engine]: Fix RTT/MOS handling of null values and inconsistent RTT aggregation.
- [Dashboard]: Fix incorrect upload/email error messages and the password-recovery redirect, and crashes triggered by missing user-agent data or missing peer connections.
[0.13.2] - January 16th, 2025
Fixed
- [Dashboard]: Fix a crash when parsing rtcStats files.
[0.13.1] - January 13th, 2025
Fixed
- [Dashboard]: Fix a crash parsing rtcStats files generated from Safari.
[0.13.0] - January 12th, 2025
Added
- [Engine]: Add 9 new observations covering video and performance issues.
- [Dashboard]: Group local candidates and show network interface info in Peer Connections, and add video resolution/framerate, encoder/decoder (including hardware acceleration), and scalability-mode/RID details.
- [Dashboard]: Detect and surface additional media servers (Asterisk, Janus, MediaSoup, OpenAI, Jambonz, MediaMTX), and send an email notification when an upload fails.
- [Web Site]: Add full responsive design for tablet and mobile.
Fixed
- [Dashboard]: Fix several crashes (observations processing, public sharing, MIME-type parsing), and improve packet-loss and unused-stream detection accuracy.
[0.12.1] - December 17th, 2025
Fixed
- [Engine]: Fix a network observation misclassifying streams with an unrecognized codec type.
[0.12.0] - December 08th, 2025
Added
- [Dashboard]: Add public sharing: make any session viewable via a link, no account required.
- [Engine]: Add new observations covering network quality for all streams.
- [KB]: Overhaul the knowledge base with articles for every statistic and observation, and a clearer layout.
Fixed
- [Dashboard]: Fix inconsistent user-agent parsing for Safari/Firefox rtcStats-format uploads.
[0.11.0] - November 24th, 2025
Added
- [KB]: Add a fully integrated, publicly accessible knowledge base with contextual links from charts and observations.
- [Dashboard]: Show every ICE candidate pair state reached, with time spent in each.
- [Engine]: Add 5 new observations covering connectivity and audio issues.
Changed
- [Dashboard]: Redesign the Streams page, and merge ICE candidate pairs into their Peer Connection for easier drill-down.
Fixed
- [Dashboard]: Fix accounts not switching automatically when opening a link from an account you were invited to.
[0.10.0] - November 10th, 2025
Added
- [Engine]: Add new observations covering connectivity issues.
- [Dashboard]: Compute and show aggregated audio MOS in the Overview pane.
Changed
- [Dashboard]: Activate the file retention/expiration policy, with a banner warning before files expire.
[0.9.0] - October 28th, 2025
Added
- [Dashboard]: Redesign the session view into focused panes: Overview, Connections, Streams, Devices, and Logs.
- [Engine]: Add new observations covering connectivity and security issues.
Changed
- [Dashboard]: Show pending invitations directly at sign-in instead of requiring the emailed link.
[0.8.0] - October 13th, 2025
Added
- [Engine]: Add many new observations for audio streams.
- [Dashboard]: Show the connection setup timeline (disconnections, churns, handovers), and add email invitations for team members.
Changed
- [Dashboard]: Block uploading dump files older than M138, and improve the Logs view with peer selection, filters, and infinite-loading.
[0.7.0] - September 25th, 2025
This version is compliant with the new dump format introduced in M132 (JSON based).
Added
- [Dashboard]: Add email/password sign-in.
- [Engine]: Add the first observations.
[0.6.0] - September 11th, 2025
Added
- [Engine]: Add new observations covering connectivity and data channel issues.
- [Dashboard]: Limit upload size, and allow uploading zipped dump files.
[0.5.4] - September 5th, 2025
No public-facing changes in this release.
[0.5.3] - September 4th, 2025
Fixed
- [Dashboard]: Fix a regression where being already signed in did not redirect away from the sign-in page.
[0.5.2] - September 4th, 2025
Fixed
- [Web Site]: Fix incorrect developer-plan yearly and monthly pricing.
[0.5.1] - September 4th, 2025
No public-facing changes in this release.
[0.5.0] - September 4th, 2025
Polish pass on the previous version based on early feedback.
Added
- [Dashboard]: Show a band for audio interruptions, and add retention-based deletion of old session files.
- [Web Site]: Add the homepage pyramid explaining rtcStats' levels of computation, an integrations page, and Terms of Service / Privacy Policy pages.
Fixed
- [Engine]: Fix aggregated statistics computations, mainly packet loss.
[0.4.0] - August 26th, 2025
Added
- [Web Site]: Add the product page explaining rtcStats' architecture.
- [Dashboard]: Add billing purchase history and a usage chart, and direct download of the raw dump and computed summary.
Changed
- [Dashboard]: Show bandwidth/CPU-limitation bands and MOS on stream charts, with an annotation when the media source changes.
Fixed
- [Dashboard]: Fix a duplicated summary file caused by bad URL encoding, and duplicate entries corrupting stream charts.
[0.3.0] - August 21th, 2025
Added
- [Dashboard]: Add stream and device aggregation views, sign-in with GitHub, and monthly credit limits with usage counters.
[0.2.0]
Added
- [Dashboard]: Add a Logs view, data-channel charts, and dump-file download.
Fixed
- [Dashboard]: Fix an endless loop when switching accounts.
[0.1.0] - Initial Release
Added
- Initial release of rtcStats: WebRTC dump analysis and visualization, authentication and account management, team collaboration, real-time data processing, interactive charts, file upload and processing, and a dashboard with analytics.
This changelog follows Keep a Changelog: entries are grouped under Added, Changed, or Fixed for each release, tagged by area (see the legend at the top), and written for readers rather than as a commit log. Version numbers follow Semantic Versioning.