01 — Real-time audio + video infrastructure

Real-time audio and video. The whole system, in Rust.

videocall.rs is a full-stack system for real-time audio and video, written in Rust. Relay servers, a meetings API with auth and host controls, a browser client, a native CLI, metrics, Helm charts. Run meetings in the browser. Stream from embedded devices with the CLI. Self-host the whole thing. MIT / Apache-2.0.

Live
AUDIO + VIDEOOPUS + VP9, PURE RUSTWEBTRANSPORT / WSTLS / QUIC ENCRYPTEDMIT / APACHE-2.0

Three ways to test

Try it, run it, build on it. Three ways in, ordered by how far you want to go: stream from a device, run the whole stack, or embed the client.

Stream a camera in two commands

For the roboticist with a Pi on the desk. No browser, no build — just a camera and a meeting id.

cargo install videocall-cli
videocall-cli stream --user-id cam-01 --meeting-id your-meeting-id --video-device-index 0

Then open app.videocall.rs in any browser and pick any meeting id — swap it in for your-meeting-id in the command above so the Pi's camera and your browser land in the same call.

The whole system on your machine

For evaluating the full stack end to end — media servers, meeting API, and UI — before you commit to anything.

git clone https://github.com/security-union/videocall-rs.git
cd videocall-rs
make dev

The entire stack — Postgres, NATS, the relays, meeting-api, and the UI — runs natively with hot reload. Open localhost:3001/meeting/you/demo. You are in the call. Going to production? The repo ships Helm charts.

Embed the client in your own app

For building a custom client on the same transport and media pipeline, compiled to WebAssembly.

cargo add videocall-client

// then, in your Rust/WASM app:
use videocall_client::{VideoCallClient, VideoCallClientOptions};

let mut client = VideoCallClient::new(VideoCallClientOptions {
    user_id: "cam-01".into(),
    meeting_id: "demo".into(),
    webtransport_urls: vec!["https://localhost:4433".into()],
    websocket_urls: vec!["ws://localhost:8080".into()],
    enable_webtransport: true,
    // …peer + connection callbacks and tuning — see docs.rs
});
client.connect().unwrap();

Transport negotiation, encoding, and peer rendering are handled; you own the UI. The full options struct and callbacks are on docs.rs.

Built in the open

Read the code, file issues, or send a patch.

490+ COMMITS20+ CONTRIBUTORS170 FORKS
View on GitHub

Relays around the world, one mesh

  • Subject per meeting

    Each meeting is a NATS subject. A relay publishes a frame once and every relay subscribed to that meeting receives it.

  • Relay to relay

    Participants can land on different relay servers anywhere in the world. NATS carries the media between them, so they still share one meeting.

  • Scale out

    Add relay servers to add capacity. WebSocket and WebTransport relays scale independently behind a load balancer.

Powered byNATS

One system, end to end

A mesh plane forwards media over NATS. A separate control plane handles auth, meeting lifecycle, host controls, and the waiting room. Browser, native, and CLI clients. Pure-Rust Opus and VP9. Prometheus metrics.

01Clients

Browser to embedded board

A Dioxus web client in the browser, compiled to WebAssembly — no install. videocall-cli streams from embedded Linux boards like the Raspberry Pi and Jetson.

02Control plane

Sign in, get admitted

meeting-api handles auth and SSO, meeting lifecycle, host controls, and the waiting room before a single frame moves. Prometheus metrics export across the stack.

03Media pipeline

Codecs written in Rust

Opus audio and VP9 video, encoded and decoded in pure Rust. A NetEQ adaptive jitter buffer runs in every browser client.

04Transport

QUIC first, WebSocket as backup

WebTransport over QUIC where the network allows it, an automatic WebSocket fallback where it does not. Encrypted in transit with TLS 1.3, and every connection is authorized with a JWT. No ICE, STUN, TURN, or SDP.

05Mesh plane

One publisher, every relay

Relay servers forward every media frame over the NATS mesh. One publisher, every subscriber — the mesh in the band above.

Runs where your hardware runs

From a browser tab to an embedded Linux board. Chromium and Safari on the desktop and on iOS, and headless capture on a Raspberry Pi or Jetson.

Chrome
Safari
Brave
Edge
Raspberry Pi
Linux
Chromium
Mac OS
iOS

Open source, built in Rust

Transparent development, from the transport layer up. Read the code, run it yourself, and extend it.

Our mission

Make real-time audio and video accessible, performant, and reliable through open-source infrastructure that anyone can read, run, and extend.

Open source first
Transparency and community-driven development, in the open.
Built with Rust
One language from server to browser, for performance and reliability.

Contribute

We are not hiring. We take code. Pick an issue, send a patch, argue with us on Discord.

Growing where it's measured

Open source, and used in production. Numbers sourced straight from the repository.

1.7K
GitHub stars
170
Forks
490+
Commits
20+
Contributors

Run it yourself, or have us run it

Self-host the entire stack, or let us operate it for you.

Self-Hosted

Free

Deploy and manage your own instance with full control.

  • Complete source code
  • Kubernetes Helm charts
  • Community support
  • You manage updates and security
Get the Helm chart
Recommended

Enterprise

Custom

Tailored deployments for organizations with specific requirements.

  • Custom SLA terms
  • Dedicated support team
  • Custom feature development
  • On-premise deployment options
Contact sales