Call quality issues
Can't join a call#
Symptom: clicking Join does nothing or returns an error.
Causes:
- Browser permissions: microphone / camera not granted. Click the camera icon in the address bar to allow. After granting, refresh the call.
- LiveKit unreachable from your network: corporate firewall
blocking UDP/WebRTC. The call panel shows
SW_CALL_LIVEKIT_UNREACHABLE. Admin: checkSCAIWAVE_LIVEKIT_URLand that the LiveKit instance accepts connections from your network. - Already in another call elsewhere: the client can only be in one call at a time. Leave the other first.
One-way audio#
You can hear them; they can't hear you. Or vice versa.
- Mic muted: check the mute button — sometimes auto-muted on join if the room has > 4 participants.
- Wrong input device: ScaiWave defaults to the OS default mic. Switch via the call panel's ⚙️ menu → Audio.
- OS-level mute: Windows / macOS sometimes have separate app-level mute. Check OS sound settings.
Echo#
Almost always one participant not using headphones with their mic. The SFU does AEC but not perfectly when there's a hardware loop.
Quick test: mute everyone except the suspected loud one; echo should disappear when you find them.
Video freeze#
- Tab is in the background and the browser is throttling. Refocus the tab.
- Bandwidth low. LiveKit's adaptive bitrate should handle it; if not, the ⚙️ menu → Video → cap at 360p to force a lower bitrate.
- Hardware acceleration glitch (Linux + nouveau is the common
culprit). Force CPU encode via
chrome://flags.
Screen share not visible#
The sharer started, you see "X is sharing" but no video.
- Browser permission for screen share isn't system-level the way camera is — usually permission was denied at the OS picker. Sharer: re-click Share screen, pick a source, allow.
- ScaiWave's PiP popout doesn't render screen share on Firefox (the Document PiP API isn't available there). View in the main window.
Recording missing#
Started a recording but it doesn't appear in the room afterwards.
- LiveKit egress can take up to a minute after the call ends before the file is finalised and the webhook fires.
- Check
GET /v1/calls/{id}/recordings— if empty after 5 minutes, admin checks LiveKit egress logs and MinIO bucket permissions.
Transcription empty / nonsensical#
- Audio quality too low (very quiet, lots of background noise).
- Wrong language hint — ScaiGrid's speech model picks better when given a hint via the Language picker before starting.
Where to look (admin)#
- LiveKit's logs: webhook activity, egress status.
- ScaiWave logs:
swp.call.*events, anySW_CALL_LIVEKIT_UNREACHABLE. - ScaiGrid logs: transcription job status.