Off by default — this is a room monitor, not a call: echo cancellation is tuned for speech and can suppress or distort exactly the ambient sounds you're listening for, and it costs real CPU to run continuously. Turn it on only if you're hearing genuine feedback/echo (e.g. push-to-talk audio being picked back up by the broadcaster's own mic).
Manual (QR code) — the default. No server needed at all: the broadcaster shows a QR code, the listener scans it (or pastes the text backup if scanning fails), then shows an answer QR back. Once that exchange completes, everything else — push-to-talk, video requests, VOX settings, even recovering from a brief network change — happens automatically without another QR scan.
Relay server — needs a signaling server running somewhere reachable by both devices (address entered above). Broadcasters auto-register and listeners pick one from a list, with automatic reconnection if the connection drops. Useful if you don't want to scan a QR each time, or want to reach someone without meeting up with a phone first.
Neither method alone gets through most mobile carriers' NAT. For that
you need a TURN server — add one under Advanced (STUN/TURN)
above. Free option: the Open Relay Project (metered.ca), 500MB/month free.
For full control, self-host coturn on a cheap VPS. TURN works
with both connection methods — it's independent of which one you pick,
though manual/QR mode always needs it configured here in the app, since
there's no server to ask. In relay mode, if the relay server itself is
set up to serve STUN/TURN config, it's applied automatically on connect —
nothing to fill in here at all.
Once connected, listeners get a "Hold to Talk" button to speak back to the broadcaster. Nothing is sent while it's not pressed — not just muted, genuinely no audio data leaves your device until you press it.
Optional, and controlled from this menu (Audio section) rather than by the broadcaster: when enabled, the broadcaster's mic only actually transmits while it detects sound above your chosen sensitivity, saving bandwidth during quiet periods. Your preference is saved on this device and sent to the broadcaster automatically each time you connect.
Works in both connection methods. Listeners get a "Show Video" button with a resolution picker (Low/Medium/High) and, if the broadcaster has more than one camera, a camera picker too. The broadcaster's camera only turns on when requested — genuinely powered off otherwise, not just hidden — and resolution/camera can both be changed live without interrupting the call.
For best reliability, install this as an app ("Add to Home Screen" / the Install button above). In relay mode, allow notification permission when asked — that's what puts a persistent "NiloPhone" notification with a Stop button in your notification shade while connected. Android Chrome generally keeps audio playing when you switch apps or lock the screen; iOS Safari is much more restrictive about background web audio, so keeping the screen awake (toggle above) is the most reliable way to avoid interruptions there — this matters for manual/QR mode too, since a backgrounded or closed tab means starting the QR exchange over again next time.
The host:port your signaling server prints on startup (e.g.
192.168.1.42:3000) — any device on the LAN can run it. If
you're opening this page directly from that server it's filled in
automatically; otherwise enter it manually. The server also prints an
access token on startup — every connection needs it, or
it's rejected before any signaling happens. All the fields above
(address, token, STUN/TURN) are remembered in this browser once set — use
🔗 Copy shareable link to bundle them into one URL you
can send to other devices. The very first time on a new relay server,
tap 🔓 Open relay server page above and accept the
certificate warning there — self-signed certs need that once per
browser, or connections will fail silently.