For those who prefer a native binary without Podman or containers, olcRTC can be built directly on the host using the standard Go toolchain andDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/openlibrecommunity/olcrtc/llms.txt
Use this file to discover all available pages before exploring further.
mage. This approach gives you full control over the binary, makes it easy to integrate with systemd, and lets you cross-compile for other platforms. You need Go 1.26+, mage, and git.
olcRTC is in Beta. Always verify that the video call service you choose is accessible in your network before relying on it.
SWAP Recommendation
If your machine has less than 4 GB of RAM, the build may crash. Enable a swap file first:Build and Run
Install Go 1.26+
- APT Pinning (Debian 13+)
- Go SDK Path (any Ubuntu/Debian)
This is the recommended approach on Debian 13+. It pulls Go from the
testing repository without polluting the rest of the system.Install mage
mage is the build system used by olcRTC — similar to Add Verify:
make but written in Go.~/go/bin to your PATH so the shell can find mage:Build the binary
Build for the current platform:Cross-compile for all supported platforms at once (Linux amd64/arm64, Windows amd64, macOS amd64/arm64, FreeBSD amd64/arm64, OpenBSD amd64/arm64):The resulting binary is placed in
build/:Generate the encryption key
Generate a 64-character hex key. This is done once on the server; the same key must be used on both server and client.Save this output — you will need it for both config files.
Run the server
On the server machine (VPS, remote server, etc.). Create a YAML config file, then run the binary with it.The server joins the room as a participant (without camera or microphone) and waits for the client. Note that Jicofo does not issue a session-initiate until a second participant joins — this is a Jitsi quirk, not an olcRTC issue.To see every connection in the logs, add Example debug output:
- jitsi + datachannel (recommended)
- wbstream + vp8channel (alternative)
debug: true to your YAML:Run the client
On your local machine. After startup, SOCKS5 listens on For Android, owenewans/owenclave reads the
auth.provider, net.transport, room.id, and crypto.key must match the server exactly.- jitsi + datachannel (recommended)
- wbstream + vp8channel (alternative)
- With SOCKS5 auth
127.0.0.1:8808.olcrtc:// URI directly — no YAML or binary needed on the device.All Mage Targets
Build
| Target | What it does |
|---|---|
mage build | Build the olcrtc binary for the current platform → build/olcrtc-<os>-<arch> |
mage cross | Cross-compile for all supported platforms (Linux, Windows, macOS, FreeBSD, OpenBSD; amd64 + arm64) |
mage mobile | Build the Android AAR via gomobile → build/olcrtc.aar |
mage clean | Remove the build/ directory |
Code Quality
| Target | What it does |
|---|---|
mage vet | Run go vet on the whole module |
mage lint | Run golangci-lint ./... |
mage tidy | Run go mod tidy and go mod verify |
mage deps | Run go mod download |
Tests
| Target | What it does |
|---|---|
mage test | Unit tests in -short mode — fast, no network |
mage testFull | All unit tests + local e2e with -race; no real providers |
mage e2e | Smoke matrix against real providers |
mage stress | Stress matrix against real providers (~6 hours) |
mage soak | Real-provider throughput soak (long) |
mage localSoak | In-memory throughput soak — no network required |
Pipelines
| Target | What it does |
|---|---|
mage check | build + vet + lint + testFull — run before every commit |
mage all | check + e2e — full pre-merge pipeline |
mage nightly | all + stress — nightly CI (~6 hours) |
mage everything | nightly + soak + localSoak — full validation (12+ hours) |
Help
mage help (or mage -l) lists all available targets. Running mage with no arguments also prints the target list — Help is the default target.
E2E Environment Variables
Fine-tune test runs through environment variables:| Variable | Applies to | Default | Description |
|---|---|---|---|
E2E_CARRIERS | e2e, stress | all | Comma-separated list of carriers to test (e.g. jitsi,wbstream) |
E2E_TRANSPORTS | e2e, stress | all | Comma-separated list of transports to test |
E2E_TIMEOUT | e2e | 30m | Per-test timeout |
E2E_STRESS | e2e | — | Set to any value to enable stress mode inside e2e |
E2E_STRESS_DURATION | e2e | — | Stress duration when E2E_STRESS is set |
STRESS_BULK_DURATION | stress | 15m | Duration of the bulk-transfer phase per case |
STRESS_ECHO_DURATION | stress | 15m | Duration of the echo phase per case |
STRESS_CASE_TIMEOUT | stress | 35m | Hard timeout per stress case |
STRESS_TIMEOUT | stress | 6h | Hard timeout for the entire stress run |
SOAK_CARRIERS | soak | telemost,jitsi,wbstream | Carriers to soak |
SOAK_TRANSPORTS | soak | datachannel,vp8channel | Transports to soak (real provider soak) |
SOAK_TRANSPORTS | localSoak | all | Transports to soak (local in-memory soak) |
SOAK_DURATION | soak, localSoak | 10m (6m local) | How long to soak |
SOAK_CHAOS | localSoak | — | Enable chaos mode in the local soak |
Updating the Binary
A running process does not update itself. To apply new code:1. Pull the latest source
2. Rebuild
3. Stop the old process
If running in a terminal, pressCtrl+C. If running in the background:
4. (Optional) Install to a system path
If you copied the binary outside ofbuild/, update the copy:
5. Restart with the same config
auth.provider, net.transport, room.id, crypto.key, and socks.port are unchanged.
Multiple Instances on One Server
Run as many olcRTC server instances as needed — each uses its own YAML file and runs in its own process.tmux pane, or systemd service: