Documentation | Issues | Discord
PulseBeam is an open source, general-purpose WebRTC SFU server for connecting browsers, mobile, and IoT clients. We believe real-time application development shouldn't be complicated, nor should it rely on heavy architectures with many moving parts. PulseBeam reduces this friction by adhering to these core design goals:
- Support all WebRTC clients.
- Keep the architecture simple, but not simpler.
- Natively support vertical and horizontal scaling.
- Provide client SDKs strictly for convenience, not necessity.
- Require minimal configuration.
If your client device speaks WebRTC, it can communicate with PulseBeam.
PulseBeam is opinionated about media handling to prioritize battery efficiency, hardware support, and predictable performance:
- Video: H.264 Baseline profile up to Level 4.1
- Audio: Opus
- Data Channel: Planned
The architecture is highly inspired by SDN architecture.
The following quickstart assumes that you have a Linux machine. As a fallback, you can go to https://pulsebeam.dev/#quickstart and check the "fallback" toggle.
Docker/Podman (recommended):
docker run --rm --net=host ghcr.io/pulsebeamdev/pulsebeam:pulsebeam-v0.2.23Open Port Requirements:
- TCP/3000: HTTP signaling
- UDP/3478: WebRTC traffic (Multiplexed)
- TCP/3478: WebRTC over TCP fallback (Multiplexed) — Planned
Other options:
- Binary: download from Releases
- Source:
cargo run --release -p pulsebeam
Run the following snippet in the browser console:
const pc = new RTCPeerConnection();
const stream = await navigator.mediaDevices.getUserMedia({ video: true });
const transceiver = pc.addTransceiver("video", {
direction: "sendonly",
// Define scalability layers (low, medium, high)
sendEncodings: [
{ rid: "q", scaleResolutionDownBy: 4, maxBitrate: 150_000 },
{ rid: "h", scaleResolutionDownBy: 2, maxBitrate: 400_000 },
{ rid: "f", scaleResolutionDownBy: 1, maxBitrate: 1_250_000 },
],
});
transceiver.sender.replaceTrack(stream.getVideoTracks()[0]);
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
const res = await fetch("http://localhost:3000/api/v1/rooms/demo", {
method: "POST",
headers: { "Content-Type": "application/sdp" },
body: offer.sdp
});
await pc.setRemoteDescription({ type: "answer", sdp: await res.text() });Go to https://codepen.io/lherman-cs/pen/pvgVZar, then put "demo" as the room to connect to.
- ✅ Prototype: Rust SFU + demo apps
- ✅ Bandwidth estimator, simulcast support
- 🚧 Top-N audio selection, Data channel, Web Client SDK
- 📅 HTTP API & Webhooks (events)
- 📅 Multi-node / cascading SFU support
- 📅 Extensions: recording, SIP, AI agents