Change Log
Version 0.0.2
15.10.2026
🔄 Coming from aiortc? Install wrtc[aiortc], change from aiortc to from webrtc.aiortc, and your code runs on Chrome’s engine. See the migration guide
⚡ Data channels 14x faster (57 to 812 Mbps), 47x over 10 connections, with 88% less CPU per MB
🪶 80% less memory per audio connection, 27% less per data channel connection, 1450 connections instead of 200
📊 Benchmarks against aiortc, Pion, libdatachannel and webrtc-rs: against aiortc, connections open 5–7x faster, a data channel moves 4.5–9x more data, and audio costs less CPU
🧪 Test coverage up to 93.4% for C++ and 99.0% for Python, with the bugs it found fixed
Add an aiortc compatibility layer with a migration guide by @MarshalX in #245
Add benchmarks against four WebRTC libraries, with results and charts by @MarshalX in #242
Add a benchmarks page to the docs, linked from the README and the docs home by @MarshalX in #243
Speed up data channels: callbacks run on the network thread, every queued UDP datagram is read on a read event by @MarshalX in #243
Wake event loops through the mailbox’s eventfd or pipe instead of the Dispatcher thread: a native event reaches Python in 45 instead of 84 µs (p50), the Dispatcher stays for Windows by @MarshalX in #243
Skip empty gathering phases: setup without trickle takes 5 instead of 125 ms by @MarshalX in #243
Drop the RTC event log, share one receive buffer per thread, stop listening on TCP and regathering by @MarshalX in #243
Play Janus streams without an audio output, as on servers by @MarshalX in #239
Fix
balancedandmaintain-frameratenever lowering the resolution by @MarshalX in #243Fix active TCP candidates rejected as a bad port by @MarshalX in #243
Fix data channel messages arriving before the channel is announced, and a channel released before its last message is sent by @MarshalX in #243
Fix sends from the
datachannelhandler lost before the channel opens by @MarshalX in #247Fix SFrame video recovery, and H.264 and AV1 with raw packetization by @MarshalX in #240
Fix descriptions lost and
iceGatheringStatereadingcompleteafterclose()by @MarshalX in #240Fix key frame requests of a removed script transform never settling by @MarshalX in #240
Fix the received
captureTimecounted from the NTP epoch by @MarshalX in #240Fix rollback allowed in the pranswer states by @MarshalX in #240
Fix a
ValueErrorinset_parametersfor a codec without a MIME type by @MarshalX in #240Fix
maxMessageSizeof a dropped or closed SCTP transport by @MarshalX in #240Fix remote video sent on to another connection, and a local description missing the candidates gathered after the remote one was read by @MarshalX in #245
Fix a loop closed while its drain was scheduled never being released by @MarshalX in #241
Fix a closing connection and its channels being active but unbound, and loop release by @MarshalX in #244
Fix a watched loop’s state never released after the loop closes by @MarshalX in #247
Fix an abort when a task queue is deleted from its own task by @MarshalX in #247
Fix flaky waits in tests on free-threaded builds and slow cores by @MarshalX in #241
Run tests in parallel and fix the test races it exposes by @MarshalX in #247
Version 0.0.1
12.10.2026
🔌 The whole WebRTC API is bound. Every interface, every method, every dictionary: all 154 binding issues of the tracker are done, and the API goes beyond them
🎞 Media processing that not every browser ships yet: MediaStreamTrackProcessor, VideoTrackGenerator and MediaStreamTrackGenerator, with the VideoFrame and AudioData of WebCodecs
🔐 WebRTC Encoded Transform: the encoded frames of senders and receivers in Python with RTCRtpScriptTransform, and end-to-end encryption with SFrame
🎥 H.264 without bundling it: VideoToolbox on macOS, offered by default, and Cisco’s OpenH264 binary on request elsewhere
🚀 Field trials and WARP: DTLS 1.3, SNAP and SPED cut round trips off connection setup
⚡ libwebrtc M152, pre-built wheels for Linux (x86_64 and aarch64), macOS and Windows, CPython 3.9 – 3.15, free-threaded 3.14t and 3.15t too
🧪 The public API follows the WebIDL of the specifications and runs the original web-platform-tests
📚 Fully reworked docs website: a new theme, guides, examples and the full API reference
What is bound, by specification:
WebRTC:
RTCPeerConnection,RTCDataChannel,RTCRtpTransceiver,RTCRtpSender,RTCRtpReceiver,RTCDtlsTransport,RTCIceTransport,RTCSctpTransport,RTCDTMFSender,RTCCertificate,RTCIceCandidate,RTCSessionDescription, with every method, attribute, event and dictionaryWebRTC Extensions: standalone
RTCIceTransport, RTP header encryption, and moreWebRTC Statistics: 19 typed stats objects in
RTCStatsReportWebRTC Encoded Transform:
RTCRtpScriptTransform,RTCEncodedVideoFrame,RTCEncodedAudioFrame, and SFrame (RFC 9605)Media Capture and Streams:
MediaStream,MediaStreamTrackwith constraints, settings and capabilities, andMediaDeviceswith a synthetic camera and microphoneMediaStreamTrack Insertable Media Processing:
MediaStreamTrackProcessor,VideoTrackGenerator, andMediaStreamTrackGeneratorWebCodecs:
VideoFrameandAudioDataStreams:
ReadableStream,WritableStreamandTransformStream, with piping and async iteration
In numbers: 229 public classes, 50 enums with the string values of the specifications, 18 exceptions named after their DOMException, and the camelCase names of the specifications next to the snake_case ones.
Migrate to prebuilt libwebrtc M152, scikit-build-core and single cibuildwheel CI by @MarshalX in #191
Split wheel builds per Python version and cache libwebrtc by @MarshalX in #196
Support free-threaded Python with
cp314tandcp315twheels, add CPython 3.15 by @MarshalX in #232Implement WebRTC spec APIs and event ordering for WPT by @MarshalX in #195
Add MediaStreamTrackProcessor, track generators and WebCodecs frames by @MarshalX in #197
Align WebIDL dictionaries with the spec as typed models by @MarshalX in #212
Align the public API with the WPT WebIDL by @MarshalX in #214
Type event handlers per event, add listener management methods by @MarshalX in #215
Add H.264 through Cisco’s OpenH264 binary, downloaded on request by @MarshalX in #218
Add H.264 on macOS through VideoToolbox, offered by default by @MarshalX in #219
Encode H.264 with our own VideoToolbox session: AutoLevel, no rate freeze, High for Chrome by @MarshalX in #233
Match browsers on SDP munging, connection states,
setParametersand close by @MarshalX in #227Replace
to_asyncwithcall_native, drop its timeout by @MarshalX in #206Add the OpenAI GPT-Live voice chat example by @MarshalX in #198
Add field trials, connect the GPT-Live example with WARP, skip loopback candidates by @MarshalX in #225
Play Janus streams in stereo by munging the Opus answer by @MarshalX in #234
Rework the docs website with guides, examples and the API reference by @MarshalX in #217
Run original web-platform-tests through a PythonMonkey shim by @MarshalX in #193
Compare the public API with the WPT WebIDL by @MarshalX in #211
Add strict clang-format and clang-tidy, fix all findings by @MarshalX in #203
Type check with Pyrefly at full strictness, fix findings by @MarshalX in #213
Make CI wheel builds and PyPI publish safe to retry by @MarshalX in #226
Retry and cache CI downloads, build the sdist in each wheel job by @MarshalX in #230
Run isolated tests as functions instead of code strings by @MarshalX in #228
Add an unattended bug hunt with stacks, crash triage and C++/Python coverage by @MarshalX in #231
Update the licence holder and headers, rebuild third-party licences for M152 by @MarshalX in #220
Fix wrapper ownership: shared_ptr lifetimes, no factory leaks or dangling observers by @MarshalX in #194
Fix the GC deadlock by releasing wrappers off libwebrtc threads by @MarshalX in #199
Fix deadlocks, leaks and crashes found by sanitizers and chaos tests by @MarshalX in #200
Fix
set_parametershanging when libwebrtc drops the callback by @MarshalX in #208Fix sender and receiver leaks by releasing handlers of ended tracks by @MarshalX in #216
Fix callback crashes, exit hangs and thread churn in the native layer by @MarshalX in #223
Fix stream, track and event-loop bugs, and a wrapper deadlock by @MarshalX in #224
Release tasks stranded by a closed test loop by @MarshalX in #229
Rebuild object lifetime: unreferenced connections, channels and live tracks stay alive while they have handlers or pending work, native threads never run Python, wrappers take no attributes by @MarshalX in #232
Fire
endedon remote tracks when a connection closes, keep a failedRTCIceTransportfor an ICE restart by @MarshalX in #232Fix a cancelled operation of a connection breaking the operations queued before and after it by @MarshalX in #217
Fix the docs build with the current
sphinx-faviconby @MarshalX in #217, closes #186
Version 0.0.0.dev9
03.03.2022
Add
RTCDtlsTransportandRTCPeerConnection.add_transceiver, withRtpEncodingParameters,RtpTransceiverInitandMediaTypetransportofRTCRtpSenderandRTCRtpReceiverMediaStreamTrack.kindis aMediaType
Version 0.0.0.dev8
02.03.2022
Add
RTCRtpTransceiver,RTCRtpReceiverandRTCIceTransportget_transceivers,get_sendersandget_receiversofRTCPeerConnectionUnified Plan is the default SDP semantics
Version 0.0.0.dev7
26.02.2022
Fix a segfault of the
MediaStreamfromget_user_mediaCompare Python wrappers by their native objects
Add the test suite with pytest
Version 0.0.0.dev6
10.02.2022
Bind
RTCError,SdpParseErrorand the common exceptions; failed async calls raise themFix a segfault in
RTCPeerConnection.closeAdd the security policy
Version 0.0.0.dev5
09.02.2022
Fix a segfault of
RTCSessionDescription(double destruction)Publish the sdist, include third-party licences in the package
Version 0.0.0.dev4
06.02.2022
Keep one Python wrapper per native object, which fixes many segfaults and bus errors
Fix
MediaStreampointers and the creation ofRTCRtpSenderDocs: favicons, OpenGraph, keyboard navigation and mobile layout
Version 0.0.0.dev3
03.02.2022
Docs on Read the Docs, a README with the logo
Version 0.0.0.dev2
03.02.2022
RTCPeerConnectionwithcreate_offer,create_answer,set_local_description,set_remote_description,add_trackandcloseMediaStream,MediaStreamTrackandget_user_mediaRTCRtpSender, andRTCAudioSourceto send PCM from PythonThe pure Python
webrtcmodule over the nativewrtc, with docsWheels for Linux, macOS (Intel and Apple Silicon) and Windows
Version 0.0.0.dev1
03.01.2022
The first upload: the package skeleton