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.

olcRTC (OpenLibreCommunity RTC) is an encrypted TCP-over-WebRTC tunnel that disguises your network traffic as an ordinary video call. Instead of connecting directly to a VPS or proxy IP — which may be blocked — olcRTC routes all TCP traffic through allowed WebRTC/SFU services such as Jitsi Meet, Yandex Telemost, or WbStream. To any network observer, the connection looks like normal participation in a video call. Inside the tunnel, all payload is additionally protected with a shared XChaCha20-Poly1305 key and multiplexed with smux. olcRTC runs on Linux, macOS, Windows, and Android (via gomobile) and can be embedded as a Go library.
olcRTC is currently in Beta. For issues and community support, visit t.me/openlibrecommunity.

Tunnel Flow

Traffic flows from your application through a local SOCKS5 proxy, into the olcRTC client (cnc), across a WebRTC/SFU service, and out through the olcRTC server (srv) to the internet:
app
  -> SOCKS5 127.0.0.1:8808
   -> olcrtc cnc
    -> WebRTC/SFU service
     -> olcrtc srv
       -> internet
Inside the tunnel, the layering is:
SOCKS CONNECT
  -> smux stream
   -> XChaCha20-Poly1305
    -> transport
     -> engine
      -> WebRTC/SFU

Modes

olcRTC accepts a single YAML configuration file and runs in one of three modes:
olcrtc server.yaml
olcrtc client.yaml
ModePurpose
srvServer side — accepts tunnel streams and dials TCP connections to target addresses on behalf of the client
cncClient side — listens on a local SOCKS5 port; browsers, curl, sing-box, and other apps connect to it as an ordinary proxy
genCreates Room IDs for providers that support room creation

Auth Providers

The auth.provider field selects the service and the credential flow used to join a room. The term carrier still appears in internal logs and the public API as a historical alias.
ProviderEngineNotes
jitsijitsiJitsi Meet room URL; no registration required; easy to self-host. Public instances are listed in docs/examples/jitsi.instances.yaml.
telemostgoolomCredentials obtained via the Yandex Telemost API; separate registration required. Telemost removed datachannel support.
wbstreamlivekitCredentials obtained via the WbStream API; separate registration required.
noneset via engine.nameDirect engine mode with a manual engine.url and engine.token.
Recommended combination: jitsi + datachannel. No registration, stable data path, lowest latency. Alternative: wbstream + vp8channel.

Transports

net.transport defines how tunnel bytes are packed into a WebRTC primitive.
TransportHow data is carriedMain scenario
datachannelNative byte/data path of the engineSimplest and fastest; stable with Jitsi
vp8channelKCP over VP8-like video framesMain video path for WbStream and Telemost
seichannelPayload in H264 SEI NAL units with ACK/retryFallback for WbStream / Jitsi
videochannelQR/tile frames via ffmpeg with ACK/retryExperimental visual transport

Encryption

internal/crypto uses XChaCha20-Poly1305. The shared key is configured as a 64-character hex string and must be identical on both the server and the client:
openssl rand -hex 32
# d823fa01cb3e0609b67322f7cf984c4ee2e294936fc24ef38c9e59f4799...
smux runs on top of the encrypted muxconn. The first smux stream is reserved for the handshake and the control protocol.

Handshake Protocol

After the WebRTC connection is established, olcRTC performs a lightweight handshake:
CLIENT_HELLO -> SERVER_WELCOME
CONTROL_PING <-> CONTROL_PONG
If CONTROL_PONG does not arrive several times in a row, the runtime either rebuilds the smux session or hands control to the failover supervisor. The failover supervisor (internal/supervisor) supports multiple profiles[] in the YAML config — for example, wbstream + vp8channel first, then jitsi + datachannel. Active smux streams do not migrate when the profile changes; new connections pick up on the next profile.

Repository Structure

PathContents
cmd/olcrtcCLI entrypoint
cmd/olcrtc-cgoc-shared entrypoint
pkg/olcrtcEmbeddable client/engine API
pkg/olcrtc/tunnelEmbeddable server tunnel API
mobilegomobile bindings for Android
internal/configYAML parsing, crypto.key_file
internal/app/sessionDefaults, validation, routing into srv/cnc/gen
internal/authProvider-specific credential flows
internal/engineSFU/signaling implementations
internal/transportdatachannel/vp8/sei/video transports
internal/serverServer-side smux, handshake, TCP dial
internal/clientSOCKS5 listener, client-side smux
internal/controlLiveness ping/pong
internal/supervisorFailover profiles
docsDocumentation and YAML examples

Public API

pkg/olcrtc returns a net.Conn-like object on top of the auth/engine stack:
sess, err := olcrtc.New(ctx, olcrtc.Config{
    Auth:   "jitsi",
    // Instances: see docs/examples/jitsi.instances.yaml
    RoomID: "https://meet.example.org/myroom",
})
if err != nil {
    return err
}
conn, err := sess.Dial(ctx)
pkg/olcrtc/tunnel embeds the server side and exposes hooks:
srv := tunnel.New(tunnel.Config{
    Transport: "datachannel",
    Carrier:   "jitsi",
    // Instances: see docs/examples/jitsi.instances.yaml
    RoomURL:   "https://meet.example.org/myroom",
    KeyHex:    "<64-char hex>",
    DNSServer: "8.8.8.8:53",
})
err := srv.Run(ctx)
The Carrier field in this API is kept for compatibility with existing integrations; semantically it maps to the auth.provider name.

Ready-Made Clients

ClientPlatformNotes
owenewans/owenclaveAndroid (fork of exclave)Main client. Supports all common protocols plus olcrtc, the olcrtc:// URI format, and subscriptions
venterum/veilAndroid (fork of v2rayNG), Material 3VMess, VLESS, Shadowsocks, Trojan, SOCKS, WireGuard, Hysteria2 + olcrtc
alananisimov/olcboxAndroid, iOS, macOS, Windows, LinuxAll providers, all transports, split tunneling, TUN/proxy modes

Script Quickstart

Get running in minutes with srv.sh and cnc.sh — Podman-based scripts that build and launch server and client automatically.

Manual Build

Build the olcRTC binary natively with Go 1.26+ and mage. Covers all distros, all mage targets, and running server and client from YAML configs.

Build docs developers (and LLMs) love