Skip to main content

Documentation 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.

The fastest way to get olcRTC running is through the bundled srv.sh and cnc.sh scripts. Everything runs inside a Podman container — the scripts clone the source, build the binary inside a container, generate a config, and launch the process. No manual Go installation or build toolchain is required on the host. All you need upfront is git and curl; Podman is installed automatically if it is missing.
olcRTC is in Beta. Always verify that the video call service you choose is accessible in your network before relying on it.

Prerequisites

git

apt install git

curl

apt install curl

Podman (optional — auto-installed by the script)

You do not have to install Podman manually. The script installs it automatically if it is missing. To install it yourself:
apt install podman

SWAP (machines with less than 4 GB RAM)

If the machine has less than 4 GB of RAM, the container build may run out of memory and crash. Enable a swap file before proceeding:
sudo fallocate -l 4G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile

Full Workflow

1

Generate a shared encryption key

This key encrypts all tunnel traffic. Generate it once on any machine and keep it — you will paste the same value on both the server and the client.
openssl rand -hex 32
# d823fa01cb3e0609b67322f7cf984c4ee2e294936fc24ef38c9e59f4799...
The key is also saved automatically to ~/.olcrtc_key after the first server run and reused on subsequent runs.
2

Clone the repository

Clone on both the server machine and the client machine:
git clone https://github.com/openlibrecommunity/olcrtc --recurse-submodules
cd olcrtc
3

Run srv.sh on the server machine

On the machine whose internet connection the traffic should exit through (VPS, remote server, home PC):
./script/srv.sh
The script installs Podman if needed, builds the binary in a container, and then asks a series of interactive questions.

srv.sh flags

FlagEffect
--branch=<name>Use a different repository branch instead of master
--no-cachePurge the Go cache (~/.cache/olcrtc) before building — forces a clean rebuild
./script/srv.sh --no-cache                # build from scratch
./script/srv.sh --branch=dev --no-cache   # branch dev, no cache

Prompt: Carrier selection

Select carrier:
  1) jitsi
  2) telemost
  3) wbstream
Enter choice [1-3, default: 1]:
ChoiceNotes
jitsiDefault and recommended. Stable on datachannel, no registration required, easy to self-host.
telemostYandex Telemost. Requires Yandex account registration. Note: Telemost removed datachannel support — use vp8channel or videochannel.
wbstreamWbStream (stream.wb.ru). Requires WbStream registration. Use vp8channel, seichannel, or videochannel.

Prompt: Transport selection

Select transport:
  1) datachannel
  2) videochannel
  3) seichannel
  4) vp8channel
Enter choice [1-4, default: 1]:
ChoiceNotes
datachannelDefault and fastest. Lowest latency. Stable with Jitsi.
vp8channelWorks with Telemost and WbStream; fast but higher latency than datachannel.
seichannelWorks with WbStream; slow but low latency.
videochannelWorks with WbStream reliably and Telemost when possible; slowest and highest latency.
Recommended combo: jitsi + datachannel. Alternative: wbstream + vp8channel.
WbStream + datachannel does not work in the normal guest flow. WbStream issues guest tokens with canPublishData=false, so the data channel does not route data. Use vp8channel, seichannel, or videochannel with WbStream.

Prompt: Jitsi server URL (jitsi carrier only)

Enter a Jitsi room URL (https://HOST/ROOM).
Pick a HOST from docs/examples/jitsi.instances.yaml and verify it opens in a browser.
Pick any public or self-hosted Jitsi Meet instance that opens in your browser. A list of known public instances is in docs/examples/jitsi.instances.yaml.

Prompt: Room options (jitsi carrier only)

Room options:
  1) Auto-generate new room (recommended)
  2) Use specific room name or URL
Enter choice [1-2, default: 1]:
  • Auto-generate (recommended) — the script picks a random room name on the chosen server.
  • Specific — enter a room name (myroom) or a full URL (https://meet.example.org/myroom).
For telemost and wbstream, the Jitsi menu is not shown. Instead, the script asks for a Room ID directly — create a room on the provider’s website (telemost.yandex.ru or stream.wb.ru) and paste its ID.

Prompt: DNS server

DNS server [default: 8.8.8.8:53]:
Press Enter to use the default (8.8.8.8:53). Change only if you have a specific requirement (e.g., 77.88.8.8:53 for Yandex DNS).

Prompt: SOCKS5 egress proxy

Use SOCKS5 proxy for egress? (y/N):
Press Enter if the server connects to the internet directly. Enter y if the server itself should route its outbound connections through an external SOCKS5 proxy, then provide the address and port.

Prompt: Transport-specific settings — videochannel

Video codec:
  1) qrcode
  2) tile (requires 1080x1080)
Enter choice [1-2, default: 1]:
  • qrcode — QR codes; configurable resolution; stable but slower.
  • tile — tile codec; requires 1080×1080 resolution; Reed-Solomon support; faster but less stable.
The script then prompts for width/height, QR error correction level, fragment size (or tile parameters), FPS, bitrate, and hardware acceleration (none / nvenc). Press Enter to accept the defaults.

Prompt: Transport-specific settings — vp8channel

VP8 FPS [default: 25]:
VP8 batch size (frames per tick) [default: 1]:
Press Enter to accept the defaults (25 FPS, batch size 1).

Prompt: Transport-specific settings — seichannel

SEI FPS [default: 60]:
SEI batch size (frames per tick) [default: 64]:
SEI fragment size in bytes [default: 900]:
SEI ACK timeout in milliseconds [default: 2000]:
Press Enter on all — the defaults are optimal for most networks.

Prompt: Config comment/label

Enter a comment for the config (default: olc - t.me/openlibrecommunity):
This string becomes the label embedded in the olcrtc:// URI. Press Enter to use the default or type a custom label.
4

Read the server output

After a successful start, the script prints everything you need to configure the client:
[+] Server started successfully!

Container name: olcrtc-server-xxxxxxxx
Carrier:        jitsi
Transport:      datachannel
Room ID/URL:    https://meet.example.org/olcrtc-xxxxxxxx
Encryption key: d823fa01cb3e0609b67322f7cf984c4ee2e294936fc24ef38c9e59f4799...

uri: olcrtc://jitsi?datachannel@https://meet.example.org/olcrtc-xxxxxxxx#<key>$olc - t.me/openlibrecommunity
Save the Room ID/URL, the encryption key, and the olcrtc:// URI. You will need the Room ID and key when running the client. The key is also saved to ~/.olcrtc_key and reused automatically on subsequent server runs.
5

Run cnc.sh on the client machine

On your local machine (laptop, home PC):
git clone https://github.com/openlibrecommunity/olcrtc --recurse-submodules
cd olcrtc
./script/cnc.sh
Answer the same questions as on the server. Carrier, transport, and Room ID must match the server exactly. When the script asks for the encryption key:
Enter Encryption Key (hex):
Paste the 64-character hex key printed by srv.sh.

SOCKS5 binding

SOCKS5 ip [default: 127.0.0.1]:
SOCKS5 port [default: 8808]:
SOCKS5 username (leave empty to disable auth):
Press Enter for IP and port — the proxy starts on 127.0.0.1:8808. If you want password protection, enter a username; the script will then ask for a password. When binding to an address outside 127.*, a username and password are required.After a successful start:
[+] Client started successfully!

Container name: olcrtc-client-xxxxxxxx
Auth:           jitsi
Transport:      datachannel
Room ID/URL:    https://meet.example.org/olcrtc-xxxxxxxx
SOCKS5 proxy:   127.0.0.1:8808
6

Verify the tunnel

Send a request through the SOCKS5 proxy. The response should show your server’s IP address, not your local IP:
curl --socks5-hostname 127.0.0.1:8808 https://icanhazip.com
To route all shell traffic through the proxy temporarily:
export all_proxy=socks5h://127.0.0.1:8808
curl https://icanhazip.com

Container Management

View running containers

podman ps --filter name=olcrtc

Follow logs

podman logs -f olcrtc-server-xxxxxxxx   # on the server
podman logs -f olcrtc-client-xxxxxxxx   # on the client

Stop a specific container

podman stop olcrtc-server-xxxxxxxx
podman stop olcrtc-client-xxxxxxxx

Stop all olcRTC containers at once

podman stop $(podman ps -q --filter name=olcrtc)

Updating a Running Instance

A running container does not update itself — it keeps the binary that was built when it started. To move to the latest code:
cd olcrtc
git pull --recurse-submodules          # pull the latest scripts
podman stop olcrtc-server-xxxxxxxx     # stop the old server container
./script/srv.sh --no-cache             # rebuild from scratch and restart
--no-cache is optional but guarantees a completely clean rebuild. Use the same carrier, transport, Room ID, and key as before. The server key in ~/.olcrtc_key is reused automatically.

Multiple Instances on One Machine

Each run of srv.sh or cnc.sh creates a container with a unique name (olcrtc-server-<random>), so multiple instances do not conflict:
./script/srv.sh   # first server — e.g. jitsi + datachannel
./script/srv.sh   # second server — e.g. wbstream + vp8channel
On the client, run a separate cnc.sh for each server, using a different SOCKS5 port for each:
./script/cnc.sh   # first client  — port 8808 (default)
./script/cnc.sh   # second client — set port 8809 when prompted

Build docs developers (and LLMs) love