Common failure modes and how to fix them. Start with the symptom, follow the tree.
Run icey-server --doctor before you start debugging browser symptoms. It prints the same structured preflight report exposed by /api/ready and exits non-zero when the server is not ready to start.
The report checks:
webRootstream modestream modeSymptom: The web UI loads but the peer list is empty or the server peer never appears.
This is a signalling problem, not a media problem. TURN is not involved yet.
/ws.Upgrade and Connection headers. Without them, the WebSocket handshake fails silently and falls back to long-polling or just dies.Symptom: The browser sees the server peer, you click Watch, but video never plays. The UI may show "connecting" indefinitely.
--turn-external-ip is not set, the browser gets an unreachable relay address. This is the cause 90% of the time. See the TURN deployment guide.Active. If it stalls at Connecting, the ICE candidate exchange is failing.--no-turn to rule out TURN as the issue.--source points to a missing file, capture will fail silently and no media will be sent.Symptom: Browser connects, camera is active, but no MP4 files appear in the recording directory.
--record-dir points to a writable location. icey-server creates the directory if needed, but the process still needs permission to create and write files there.Symptom: Everything works on localhost but fails when the browser is on a different network.
--turn-external-ip set to the correct public IP? This is the most common cause. See TURN deployment.nc -u <public-ip> 3478.Symptom: Browser refuses to connect, shows mixed content warnings, or WebRTC fails because the page is not HTTPS.
icey-server --doctor. It validates that both the certificate and key exist and that the keypair can initialize the HTTPS/WSS listen socket.Upgrade and Connection headers for WebSocket passthrough.certbot renew and restart the proxy.Symptom: Session connects but media negotiation fails. Browser console may show SDP errors or codec negotiation failures.
libx264 and libopus support. Run ffmpeg -codecs | grep -E 'x264|opus' to verify.Symptom: Video plays but with noticeable delay or visual artifacts.
ultrafast preset and zerolatency tune. If you changed these, revert to defaults.icey-server is not a monolith — it is an assembly of independent library modules. Debug it in those layers:
http serves the UI and status endpointssymple carries signalling and presencewebrtc owns session control and track send/receiveturn handles relayav handles capture, encode, decode, and muxbase and net hold the runtime together underneathIf something breaks, isolate which layer is failing. Do not treat the binary as one opaque mystery box.
Check the server logs first. Every failure above produces log output that points to the cause. If the logs are not helpful, file an issue at github.com/nilstate/icey-cli with the log output and your config (redact credentials).