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