Skip to content

What is this? ​

WebRTC Demo is one video call app built five times: in the browser, on Android, iOS, macOS and Windows. Each one is a native app written with that platform's own tools, and they all talk to the same small servers. Any client can call any other one.

It is not a library. There is nothing to install into your project. It is a set of working apps that you can run, read and copy from.

Who it is for ​

  • You want calls in your app and need to see how the pieces fit together on your platform.
  • You are bringing WebRTC to a platform that is not here yet (Flutter, React Native, Linux, a TV) and need to know exactly what to send so the existing apps can call yours.
  • You want to see how things like E2EE between a browser and a phone, iOS screen sharing in the background, or a small SFU actually work.

What you get ​

FeatureWebiOSAndroidmacOSWindows
1:1 video call, peer to peer✅✅✅✅✅
Group call through your own SFU (optional)✅✅✅✅✅
Chat over a data channel✅✅✅✅✅
Share your screen or a video file✅✅✅✅✅
Virtual backgrounds: blur, pictures and videos✅✅✅✅✅
Face-tracked stickers✅✅✅✅✅
End-to-end encryption, 1:1 and group✅✅✅✅✅
Your own microphone level on your video✅✅✅✅✅
Picture-in-picture✅✅¹✅✅²✅²

¹ On iOS, picture-in-picture works in 1:1 calls only. ² An always-on-top floating window on the Mac and the compact overlay window on Windows.

What is in the repository ​

FolderWhat it is
signaling-server/Node.js WebSocket relay for 1:1 calls. About 150 lines.
sfu-server/Optional Go server for group calls, built on Pion.
web/Vue 3 client.
android/Kotlin and Jetpack Compose.
ios/The iOS and macOS apps, one Xcode project.
windows/WinUI 3 on .NET, with a small C shim over libwebrtc.
effects/Backgrounds and stickers that every app bundles.
tools/Scripts that prepare the backgrounds and draw the app icons.

What keeps them working together ​

The five apps share no code across languages. What lets them call each other is a small contract that every client follows:

  • the JSON messages on the WebSocket, and their order,
  • who makes the offer (always the peer that was in the room first),
  • the E2EE frame format and how the key is derived,
  • the media state message and the 300 ms camera rule,
  • for group calls, the SFU's protocol with two peer connections per client.

Follow it and your client can join a call with any of the five apps. Port to a new platform turns it into a checklist.

How to read these docs ​

  • Quick start gets two clients into a call.
  • How it works has one page per feature. Each page explains the idea once, then shows how every platform does it.
  • Platforms shows where things live in each app's code.
  • Port to a new platform is the checklist for a new client.
  • Reference has every message, the versions in use and the known limits.

The same material, as one long file that also works offline, is in ARCHITECTURE.md.

A demo, not a product ​

The code is meant to show common WebRTC use cases and give you ideas. It may have bugs. Some things a production app needs are left out on purpose: there is no TURN server, no reconnect, no authentication, and the E2EE key goes through the server in plain form. See limitations.