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:
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:
This is a thread-per-core system that isolates the data plane from the control plane. It follows a shared-nothing design, keeping the fast path lock-free and cache-local.

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.4.0 --dev
Open Port Requirements:
Note: The
--devflag used above configures PulseBeam to use port 3478 to avoid requiring root privileges. In production (running without--dev), WebRTC traffic defaults to standard port 443 (UDP/TCP).
Other options:
cargo run --release -p pulsebeamRun 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:7070/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.
PulseBeam exposes an internal debug HTTP server on http://localhost:6060.
http://localhost:6060/metricshttp://localhost:6060/debug/pprof/profile?seconds=30http://localhost:6060/debug/pprof/profile?seconds=30&flamegraph=truehttp://localhost:6060/debug/pprof/allocsCPU profiling measures CPU usage, not wall time. For meaningful results, profile while the server is under load.
View CPU profiles with:
go tool pprof -http=:8080 cpu.pprof
Or view as a flamegraph on a browser by specifying flamegraph=true to the URL query.
You can view the full roadmap here.
$ claude mcp add pulsebeam \
-- python -m otcore.mcp_server <graph>