Architecture
Browsers carry the call. Servers coordinate the call.
WebRTC — audio is sent peer-to-peer using RTCPeerConnection. We use opus codec and audio-first by default.
STUN — helps browsers discover their public IP. Public Google STUN is fine for dev; bring your own in production.
TURN — only used when peer-to-peer cannot connect (strict NATs, corporate firewalls, blocked UDP). Configure NEXT_PUBLIC_TURN_URL/USERNAME/CREDENTIAL.
Signaling — Socket.io server on a separate port. It only exchanges setup messages (offer, answer, ICE candidates, call state). It never sees audio.
AI receptionist — when AI answers, the browser opens an OpenAI Realtime session over WebRTC using a short-lived client secret. The AI joins the call as a regular peer.