🌐 Website · 📝 Blog · 🎥 P2P/SFU Demo · 🎙 Discord
We build the full WebRTC network/protocol ecosystem in Rust — from low-level RTC protocols up to a browser-ready SFU, signaling server, and streaming ingest/egress. Everything is dual-licensed MIT / Apache-2.0.
Our cores are Sans-I/O: pure state machines with no sockets, no threads, and no clock of their own. The caller owns all I/O. That buys deterministic tests without a network, an async layer that isn't welded to one runtime, and — as it turns out — a media server built from the very same trait.
- sansio — the small
sansio::Protocoltrait everything else is written against. - rtc — the Sans-I/O WebRTC core: ICE · STUN · TURN · mDNS · DTLS · SCTP · DataChannel · SRTP · RTP/RTCP · SDP.
- sfu — a Sans-I/O SFU (Selective Forwarding Unit) media server for group calls on top of
rtc. - signaling — a Sans-I/O signaling protocol implementation for both P2P and SFU.
- webrtc — the async, runtime-agnostic
PeerConnectionAPI on top ofrtc. - apprtc — P2P/SFU server and web app with automatic P2P↔SFU upgrade/downgrade, live at appr.tc.
Everything is published on crates.io:
AppRTC
Signaling
SFU
WebRTC
RTC
Media
Interceptor
DataChannel
RTP
RTCP
SRTP
SCTP
DTLS
mDNS
STUN
TURN
ICE
SDP
Shared
SansIO
Each webrtc-rs project is developed and released as an independent Rust crate or application. To keep development fast, projects that depend on unreleased changes use Git submodules instead of waiting for every internal crate to be published to crates.io. The nested source layout used by AppRTC is:
apprtc/
├── [signaling]/ # Sans-I/O Signaling repository, AppRTC submodule
| └── signaling-proto # └── signaling-proto crate
└── [sfu]/ # Sans-I/O SFU repository, AppRTC submodule
└── [webrtc]/ # Async WebRTC repository, SFU submodule
└── [rtc]/ # Sans-I/O RTC repository, WebRTC submodule
├── rtc-datachannel # ├── DataChannel crate
├── rtc-dtls # ├── DTLS crate
├── rtc-ice # ├── ICE crate
├── rtc-interceptor # ├── Interceptor crate
├── rtc-interceptor-derive # ├── Interceptor Derive crate
├── rtc-mdns # ├── mDNS crate
├── rtc-media # ├── Media crate
├── rtc-rtcp # ├── RTCP crate
├── rtc-rtp # ├── RTP crate
├── rtc-sctp # ├── SCTP crate
├── rtc-sdp # ├── SDP crate
├── rtc-shared # ├── Shared crate
├── rtc-srtp # ├── SRTP crate
├── rtc-stun # ├── STUN crate
└── rtc-turn # └── TURN crate
This lets AppRTC build and test against the exact in-development SFU, async WebRTC, and RTC revisions while preserving independent repositories, versioning, releases, and crates.io publication. Published consumers continue to use the corresponding crates.io versions; the submodule layout is a development workflow for cross-repository changes and integration testing.
Contributors and pull requests are always welcome, and there is plenty that is well-scoped and open — simulcast, publish/subscribe, and congestion control in sfu, plus interop and performance work everywhere. Sans-I/O means you can usually test your change without a network. Come say hi on Discord.
Built with 💖. Sponsor the projects via:
github.com/sponsors/webrtc-rs
·
opencollective.com/webrtc-rs
·
patreon.com/WebRTCrs
