This page covers the most common runtime issues with olcRTC, how to diagnose them, and what to change in your configuration to fix them.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.
key required or invalid key
key required or invalid key
Symptom: olcRTC exits immediately with
key required or invalid key.Cause: The crypto.key field is missing, empty, or not a valid 64-character hex string. The key must be the same on both the server (mode: srv) and client (mode: cnc).Fix:-
Generate a valid key:
This produces exactly 64 hex characters (32 bytes).
-
Set the key in both YAML files:
-
Alternatively, store the key in a file and reference it:
Do not set both
crypto.keyandcrypto.key_fileat the same time. - Verify both sides use the identical key string.
SOCKS5 proxy not listening
SOCKS5 proxy not listening
Symptom: The client starts, appears to connect, but nothing listens on the expected SOCKS5 port.
curl --socks5-hostname 127.0.0.1:8808 ... fails with “connection refused”.Cause: One or more of the following:- The YAML is configured as
mode: srvinstead ofmode: cnc socks.hostorsocks.portare wrong- The process exited before binding (check logs)
-
Confirm the client YAML has
mode: cnc: -
Confirm the SOCKS5 fields are set:
-
Check the logs for errors during startup. With
debug: trueyou will see a log line when SOCKS5 begins listening. -
If you set
socks.hostto a non-loopback address (anything other than127.0.0.1,::1, orlocalhost), you must also setsocks.userandsocks.pass. olcRTC enforces this to prevent accidentally exposing an open proxy on the network:
Jitsi does not connect — both sides just wait
Jitsi does not connect — both sides just wait
Symptom: Both
srv and cnc start with the Jitsi provider, but neither side establishes the tunnel. The logs show waiting for peer in room indefinitely.Cause: Jitsi’s Jicofo conference controller only sends a Jingle session-initiate once at least two participants are present in the same MUC room. A single olcRTC instance sitting alone in the room will wait forever for Jicofo to start the Jingle negotiation.Fix:-
Make sure both
srvandcncare running and pointed at the same room ID (the samehttps://host/roomURL). - Both sides must start within a reasonable time of each other. After the XMPP/BOSH session idle timeout (~60 seconds), Prosody may close the connection if no traffic is exchanged. olcRTC’s internal XMPP keepalive (ping every 25 seconds) prevents this, but only while the process is running.
- If you start the server and wait a long time before starting the client, Jicofo may have already cleaned up the empty conference. Restart the server if needed.
Always verify which Jitsi server is reachable in your network by opening the instance URL in a browser. If the page does not load, that server is blocked. See
docs/examples/jitsi.instances.yaml in the repository for a list of public instances.WbStream + datachannel not working (tunnel silent)
WbStream + datachannel not working (tunnel silent)
Symptom: The tunnel appears to connect (This is the recommended approach for most users.Fix (option B — use a moderator token):If you have a WbStream account with moderator rights, set To grant moderator in the WbStream UI: open the participants list → click the three dots next to the entry → press Moderator (required on both server and client sides).In the guest flow, the obtained guest token is logged once at startup — you can copy it into
cnc and srv both show they are up), but no data flows. SOCKS5 connections time out immediately.Cause: In the normal WbStream guest flow, access tokens are issued with canPublishData=false. The SCTP data channel opens successfully, but the SFU does not route data through it. The tunnel is structurally up but silently drops all payload.Fix (option A — change transport):Switch to a transport that does not require data channel publish rights:auth.token to your account token on both sides:auth.token to reuse the same identity on the next run.seichannel ack timeout
seichannel ack timeout
Symptom: The log shows
seichannel ack timeout repeatedly. The PeerConnection is formally alive, but no data gets through.Cause: The provider is throttling, delaying, or not routing the H.264 video stream carrying the SEI NAL payloads. This is especially common on self-hosted Jitsi instances where Jicofo periodically cuts or delays upstream video when there is no active video receiver in the room (from Jicofo’s perspective, the sender is sending video but nobody is watching it).Fix:-
Change transport. Switch to
datachannel(for Jitsi) orvp8channel(for WbStream or Telemost): -
Change provider. If you need
seichannel, usewbstream— it is the most stable provider for SEI-based transport. -
Note that
seichannelis not supported by Telemost at all (fails E2E tests). Do not use this combination.
ffmpeg not found
ffmpeg not found
Symptom:
videochannel transport fails to start with an error like exec: "ffmpeg": executable file not found in $PATH.Cause: The videochannel transport requires ffmpeg to encode video frames. It is not bundled with olcRTC.Fix:-
Install
ffmpegusing your system package manager: -
Or specify the full path to the
ffmpegbinary in your YAML: -
Also note: the
tilecodec forvideochannelrequires a resolution of exactly 1080×1080:
High latency or slow tunnel throughput
High latency or slow tunnel throughput
Symptom: The tunnel works but is noticeably slower or has higher latency than expected.Cause and fixes:
-
Transport choice. Speed ranking from fastest to slowest:
datachannel>vp8channel>seichannel>videochannel. Switch to the fastest transport that works for your provider. -
vp8channel batch/fps settings. Tune the batch size and FPS for throughput:
-
traffic.max_payload_size. If set, this limits the encrypted message size. Larger values allow more data per message:
-
traffic pacing delays. If
traffic.min_delay/traffic.max_delayare set, they add artificial send delay. Remove them or set to0: -
DNS resolution. Ensure
net.dnspoints to a fast DNS server:
Session keeps rebuilding (reconnect loop)
Session keeps rebuilding (reconnect loop)
Symptom: The tunnel connects and then repeatedly tears down and reconnects every few minutes. Logs show reconnect messages cycling.Cause: The liveness/control stream ping-pong is not completing within the configured timeout, or the session lifetime limit is being hit.Fix:
-
Check liveness settings. The default values work for most networks. If you are on a high-latency connection, increase the timeout:
-
Check lifecycle.max_session_duration. If set, this causes a planned rebuild after the given time:
Setting this also causes clean session ends to restart automatically so both sides can resync. If you do not need planned rebuilds, remove this field.
-
Check failover profiles. If
profiles:is configured, the supervisor rotates through them on failure. Ensure the profile order and settings match on both server and client. -
Enable
debug: trueto see exactly which liveness check is failing.
Cannot bind SOCKS5 on a non-loopback address
Cannot bind SOCKS5 on a non-loopback address
Symptom: olcRTC exits with an error when Then connect with:
socks.host is set to 0.0.0.0 or a LAN IP.Cause: olcRTC enforces that if socks.host is not a loopback address (127.0.0.1, ::1, or localhost), then socks.user and socks.pass must be set. This prevents accidentally creating an open SOCKS5 proxy accessible from the network or the internet.Fix:Set credentials alongside the non-loopback host:Multiple instances conflicting with each other
Multiple instances conflicting with each other
Symptom: Running two olcRTC client or server instances on the same machine causes them to interfere with each other, or only one works.Cause: Each olcRTC instance needs its own isolated configuration. Sharing a room ID means both instances join the same WebRTC room and may receive each other’s traffic. Sharing a SOCKS5 port means the second bind fails.Fix:Each instance must have:Run them separately:
- A unique room ID — different
room.idvalue per instance pair - A unique SOCKS5 port — different
socks.portper client instance - Its own YAML config file — pass each config file as a separate argument
Enabling Debug Logging
Adddebug: true to the top level of your YAML config:
jitsi: joining MUC/jitsi: MUC joined— Jitsi connection progressjitsi: session-initiate received— Jingle negotiation started (peer joined)jitsi: bridge open— colibri-ws channel readyvp8channel: peer confirmed— VP8 transport peer latchedlivekit reconnect— LiveKit reconnect attempts- Liveness ping/pong lines — control stream health
Container / Script-Based Deployments
If you are running olcRTC inside a container or via a shell script, use these commands to inspect the running state:debug: true to the config and redirect logs to a file: