Browser ↔ Python (aiortc) peer, no TURN. Classifies whether STUN hole-punching worked or a relay would have been required.
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).
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.