The Lightweight Stack for Real-Time Media

Rust WebRTC SFU core. HTTP signaling. Modular services. If your client speaks WebRTC, it can talk to PulseBeam.

Clients
browsers, mobile, embedded
PulseBeam
Rust WebRTC SFU
External Agents
recorders, transcoding, AI

An Opinionated Real-Time Stack

Designed from the ground up to be simple, reliable, and easy to extend.

Rust SFU Core

Fast, memory-safe, and concurrent without garbage collector pauses.

HTTP Signaling

WHIP/WHEP-compatible, extended for multi-party use cases. No WebSockets required.

SDK Optional

Any client that speaks WebRTC can connect directly. Thin SDKs will exist for convenience.

Modular by Design

Features like recording, analytics, or AI live outside the core as separate processes.

Compatibility

H.264 Baseline up to L4.1, Opus audio, and wide hardware acceleration support.

Open Source

AGPL-3.0 for server, Apache-2.0 for client libraries. Internal use is welcome.

Quickstart

Get your first real-time stream running in under a minute.

Step 1: Run the Server

The server must be running before the clients can connect.

$ docker run --rm --net=host ghcr.io/pulsebeamdev/pulsebeam:pulsebeam-v0.1.13

Step 2: Start the Publisher

This demo accesses your webcam and sends the stream to your local PulseBeam server.

Publisher

// 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 Publisher Demo

Step 3: Start the Viewer

Open this in a new browser tab to subscribe to the video stream.

Viewer

// 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 });
Open Viewer Demo

Roadmap

We're just getting started. See what's planned for the future.

Prototype

Working basic audio/video Rust SFU + browser demos.

Enhanced Media Support (Current)

Bandwidth estimation, data channels, and video simulcast.

Core Stability

Simulation testing, end-to-end tests, and production hardening.

Ecosystem Services

Recording agents, analytics services, and a JavaScript SDK.

Multi-Node & Scale

Built-in clustering and cascading SFU capabilities.

Ready to build?

Join the community and start building your real-time application today.