Articles
8 write-ups on how WebRTC behaves once real networks get involved.
2026
WebRTC behind a firewall: TURN over TLS on port 443
Calls that fail on corporate networks usually need TURN over TLS on 443. How to configure it, confirm it works, and why it should stay the last resort.
turnice5 minWebRTC E2EE with SFrame: what your SFU can still read
SFrame hides WebRTC media from the SFU, not the metadata. Your server still sees who spoke, when and how loudly, from the audio level header extension.
dtls6 minWebRTC bitrate stuck low? maxBitrate is only a ceiling
You set maxBitrate to 2.5 Mbps and WebRTC sends 700 kbps. The congestion controller picks the rate. How GCC decides, and which getStats fields show why.
rtp6 minWhy WebRTC video freezes, and how getStats tells you
WebRTC video freezes come from loss, keyframe waits, jitter or dropped frames. The getStats counters that tell them apart, and the fix for each.
rtp6 minWebRTC DTLS handshake failed: how to find out why
ICE says connected, then connectionState goes to failed. That is the DTLS handshake, and RTCDtlsTransport's error event names the exact cause.
dtls5 minStop munging SDP: the WebRTC APIs that replace it
Editing SDP before setLocalDescription breaks the WebRTC spec and still works in every browser. The API that replaces each munge, and the one case with none.
sdp4 minFaster WebRTC call setup with iceCandidatePoolSize
iceCandidatePoolSize gathers STUN and TURN candidates before the offer exists. In Chromium it cut gathering from 456ms to 2ms. It only works once.
iceturn4 minFast WebRTC reconnection without a full ICE restart
When a phone moves from Wi-Fi to cellular, an ICE restart costs a full offer/answer. Against your own SFU there are faster ways to move the call.
ice6 min