RTCRtpScriptTransform (the
tap that lifts encoded Opus frames out of the browser’s codec — see
WebRTC diversion), and
WebCodecs (the decoder behind downlink playback). Support for all three is
uneven across browsers, so this page tells you exactly where the full path runs,
where it partly runs, and what to do when it does not.
This page is about the browser SDK (@telequick/sdk) running in a web page.
Native SDK cores (Python, Go, Rust, Java, .NET) reach the media plane through a
shared QUIC transport and already ship a QUIC-to-WebSocket fallback ladder —
the browser does not have that fallback yet. That gap is the honest story below.
The short answer
Chromium family
Full path. Chrome, Edge, and other Chromium-based browsers (Brave, Arc,
Opera) run capture, publish, subscribe, and playback end to end.
Firefox
Uplink works, downlink needs your own decoder. Capture and publish run;
the bundled player relies on a Chromium-only decoder.
Safari
Not yet. The encoded-frame tap ships only in Safari Technology Preview.
Use a telephony leg today, or wait for the planned fallback.
Support matrix
Honest as of this writing — browser support is moving quickly, so treat the version floors as a guide and feature-detect at runtime (the SDK does this for you).| Capability | What it powers | Chromium (Chrome / Edge) | Firefox | Safari |
|---|---|---|---|---|
| WebTransport | Media + data over QUIC on :443 | Yes (97+) | Yes (114+) | Preview only |
RTCRtpScriptTransform | Encoded-Opus uplink tap (in a Worker) | Yes (110+) | Yes (133+) | Technology Preview |
WebCodecs AudioDecoder | Bundled downlink player (Opus decode) | Yes | Partial / no | No |
MediaStreamTrackProcessor | Frame-level media helpers | Yes | No | No |
getUserMedia + loopback WebRTC | Mic capture + browser Opus encoder | Yes | Yes | Yes |
| Full browser SDK voice path | Capture → publish → subscribe → play | Yes | Uplink only | No |
serverCertificateHashes (dev cert) | Local-dev QUIC without a public CA | Yes | Yes | No |
Why each browser lands where it does
Chromium — the reference target
Chromium — the reference target
Everything the browser SDK needs is stable in Chromium: WebTransport carries
MoQT objects,
RTCRtpScriptTransform runs in a Worker to lift encoded Opus
off the loopback sender, and the WebCodecs AudioDecoder feeds an
AudioWorklet ring buffer for playback. If you build and test in Chrome or
Edge, you are on the path we exercise most.Firefox — uplink yes, bundled player no
Firefox — uplink yes, bundled player no
Firefox has both WebTransport (114+) and
RTCRtpScriptTransform (133+), so
capturing and publishing microphone audio works. What is missing is the
downlink half: the bundled Opus player is built on WebCodecs
AudioDecoder, which is Chromium-only in practice. To hear audio in Firefox
you supply your own decode-and-render path (for example, decode Opus in
WebAssembly and push PCM into an AudioWorklet) and subscribe to the
downlink track yourself. Publishing your voice into a call works today.Safari — waiting on the encoded tap
Safari — waiting on the encoded tap
The encoded-frame tap the uplink depends on ships only in Safari
Technology Preview, and WebTransport is still behind a preview flag. Until
both land in stable Safari, the browser SDK media path does not run there.
Your options today: route those users over a telephony leg
(SIP / PSTN) instead of
in-browser media, or wait for the planned browser fallback described below.
What the SDK does when a capability is missing
The browser SDK feature-detects and refuses rather than degrading silently. This is deliberate: a half-working audio path is worse than a clear error you can branch on.captureMicrophone(...)checks for encoded-transform support first and throws if it is absent, before it ever touches the microphone.- Connecting with encoded transform required will reject the session on a browser that cannot provide it.
The fallback story (what exists, what is planned)
The stack’s standing transport rule is QUIC and MoQT first-class, with WebSocket and WebRTC as required fallbacks. Here is where each rung actually stands for browsers, told straight:QUIC / WebTransport — shipped (Chromium, Firefox uplink)
The primary path. MoQT rides WebTransport on the shared
:443 listener,
using the moqt-16 subprotocol. This is what the matrix above measures.WebSocket media fallback — native cores only, not browser yet
The native SDK cores fall back from QUIC to a WebSocket media rung when
UDP is blocked or a TCP proxy sits in the way. That ladder is not wired
into the browser SDK — treat browser WebSocket media as planned, not
shipped.
WebRTC media fallback — server side exists, browser leg planned
The engine can terminate a real WebRTC leg server-side (ICE-lite with
in-process DTLS-SRTP), which is how a UDP-blocked or Safari client would
eventually reach the media plane. The server capability is in place; wiring
it into the browser SDK as an automatic fallback is planned, not yet
available.
Until the browser WebSocket and WebRTC rungs land, the practical fallback for
a non-Chromium browser is a telephony leg — dial the user in, or let them
dial a provisioned number — so the audio path is SIP/RTP rather than in-browser
media. See Transport to telephony.
Local development gotchas
WebTransport and the dev-certificate flow are strict about the environment. These trip people up before any compatibility question:- Secure context required. Serve over HTTPS (or
localhost, which browsers treat as secure).RTCRtpScriptTransform, WebTransport, andgetUserMediaall refuse to run on an insecure origin. - Use
127.0.0.1, not::1. The IPv6 loopback literal breaks the QUIC handshake during local testing; the IPv4 loopback works. - Short-lived ECDSA dev cert. For local QUIC without a public CA, pass the
certificate fingerprint via
serverCertificateHashes. The certificate must be ECDSA and valid for no more than 14 days — browsers reject longer-lived certs on that code path. This flow is unavailable in Safari. - Multi-brand SNI in production. The WebTransport listener presents
per-brand certificates by SNI; connect to the tenant’s own host
(
<workspace-id>.webrtc.telequick.dev/relay.telequick.dev) so the right certificate is selected.
Related
Browser audio capture
Capture and encode microphone audio, and publish it as a MoQT track.
WebRTC diversion
Borrow the browser’s Opus encoder and divert encoded frames onto QUIC.
RTCRtpScriptTransform
The Worker tap that makes the encoded-frame path — and its E2EE — possible.
WebTransport
The browser-native QUIC path for media and data.
Mobile app transport
Where native mobile clients stand today.
Transport to telephony
The SIP/PSTN fallback for browsers that can’t run the media path.