# STUN and TURN servers Calls connect peers directly. STUN helps each side discover its public address; TURN relays the media when a direct path is blocked (strict firewalls, symmetric NAT, some mobile networks). ## Defaults Quibble ships working defaults so calls just work with no setup: - **STUN:** Cloudflare (`stun:stun.cloudflare.com:3478`) - free, no account. - **TURN:** Metered's shared open relay - free, no account. The default TURN is shared by every Quibble user and is rate-limited. It is fine for trying things out, but for reliable calls under strict networks, use your own. ## Which servers need an API key? STUN is usually keyless. TURN almost always needs credentials, because relaying traffic costs bandwidth. Common providers: | Provider | Needs key? | Notes | |----------|-----------|-------| | Metered (shipped default) | No (shared key baked in) | Rate-limited, shared by everyone | | Metered (your own) | Yes | Free tier; sign up for a username + credential | | Twilio | Yes | Pay per GB | | Cloudflare Realtime TURN | Yes | Requires a token | | Self-hosted coturn | You set it | Full control, no third party | ## Use your own server Open **Settings → STUN/TURN** and fill in: - **TURN Server** - e.g. `turn:your.host:3478` - **Username** and **Password / API key** - from your provider Your TURN server then replaces the shared default. Settings are stored locally on your device. To set a default for every client a server hands out, start the server with `TURN_URL`, `TURN_USERNAME`, and `TURN_CREDENTIAL` (or a full `QUIBBLE_ICE_SERVERS_JSON` list). See [server.md](server.md).