WebRTC STUN-only connectivity test

Browser ↔ Python (aiortc) peer, no TURN. Classifies whether STUN hole-punching worked or a relay would have been required.

1  End-to-end test (browser ↔ daemon)

2  NAT mapping probe (browser only, no daemon)

Queries several public STUN servers and compares your reflexive (public) port. Same port everywhere = cone NAT (STUN-friendly). Different ports = symmetric NAT (a peer behind another hard NAT would need TURN).

3  Pair with a remote peer (relay signaling via delta)

The real cross-NAT test: two external peers — this browser and a laptop running client.py --pair — with delta only relaying the signaling (not a peer). Start ./client.py --pair on the laptop, then tap Join here (or just open the #pair= link it prints). Disable Tailscale on both sides.

Log