Rust WebRTC SFU core. HTTP signaling. Modular services. If your client speaks WebRTC, it can talk to PulseBeam.
Designed from the ground up to be simple, reliable, and easy to extend.
Fast, memory-safe, and concurrent without garbage collector pauses.
WHIP/WHEP-compatible, extended for multi-party use cases. No WebSockets required.
Any client that speaks WebRTC can connect directly. Thin SDKs will exist for convenience.
Features like recording, analytics, or AI live outside the core as separate processes.
H.264 Baseline up to L4.1, Opus audio, and wide hardware acceleration support.
AGPL-3.0 for server, Apache-2.0 for client libraries. Internal use is welcome.
Get your first real-time stream running in under a minute.
The server must be running before the clients can connect.
This demo accesses your webcam and sends the stream to your local PulseBeam server.
// Core publisher logic
const pc = new RTCPeerConnection();
// 1. Get user's video and add it to the connection
const stream = await navigator.mediaDevices.getUserMedia({ video: true });
const trans = pc.addTransceiver("video", { direction: "sendonly" });
trans.sender.replaceTrack(stream.getVideoTracks()[0]);
// 2. Create an SDP offer and send it to your local server
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
});
// 3. Set the remote description with PulseBeam's answer
const answer = await res.text();
await pc.setRemoteDescription({ type: "answer", sdp: answer });
Open this in a new browser tab to subscribe to the video stream.
// Core viewer logic
const pc = new RTCPeerConnection();
// 1. Set up the connection to receive video
pc.addTransceiver("video", { direction: "recvonly" });
// 'remoteVideo' is a <video> element
pc.ontrack = e => remoteVideo.srcObject = e.streams[0];
// 2. Create an SDP offer to signal intent to receive
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
});
// 3. Set the remote description with PulseBeam's answer
const answer = await res.text();
await pc.setRemoteDescription({ type: "answer", sdp: answer });
If you prefer not to use Docker, you can run the server from a binary or source code.
We're just getting started. See what's planned for the future.
Working basic audio/video Rust SFU + browser demos.
Bandwidth estimation, data channels, and video simulcast.
Simulation testing, end-to-end tests, and production hardening.
Recording agents, analytics services, and a JavaScript SDK.
Built-in clustering and cascading SFU capabilities.
Join the community and start building your real-time application today.