diff --git a/zebra-report/zebra-audio.html b/zebra-report/zebra-audio.html
index 7d9518a..a1ea82b 100644
--- a/zebra-report/zebra-audio.html
+++ b/zebra-report/zebra-audio.html
@@ -317,13 +317,16 @@ async function reportPath(){
if (!sel) stats.forEach(r=>{ if(r.type==='candidate-pair'&&r.state==='succeeded'&&(r.nominated||r.selected)) sel=r; });
if (!sel){ setPath('path: connecting…', null); return; }
const loc=stats.get(sel.localCandidateId)||{}, rem=stats.get(sel.remoteCandidateId)||{};
- const la=(loc.address||loc.ip||'?')+':'+(loc.port||'?'), ra=(rem.address||rem.ip||'?')+':'+(rem.port||'?');
const relayed = loc.candidateType==='relay'||rem.candidateType==='relay';
- /* show the real endpoints so it's verifiable: host = the two devices' IPs;
- * relay = the TURN server's IP (142.93.73.64) appears on at least one side. */
- setPath('path: '+(relayed?'RELAYED via TURN':'DIRECT P2P')+' — you '+la
- +' ↔ peer '+ra+' ('+(loc.candidateType||'?')+'/'+(rem.candidateType||'?')+')', relayed?'err':'ok');
- logLine('', 'active pair: '+la+' ['+(loc.candidateType||'?')+'] ↔ '+ra+' ['+(rem.candidateType||'?')+']');
+ /* deliberately do NOT surface loc.address/loc.port/rem.address/rem.port —
+ * printing them would dox the peer to anyone who glances at the screen.
+ * candidate types (host/srflx/relay) are abstract enough to show: they
+ * tell you whether you're direct or relayed without leaking an address. */
+ setPath('path: '+(relayed
+ ? 'RELAYED via TURN — a server forwards your (encrypted) audio'
+ : 'DIRECT peer-to-peer — nobody between you')
+ +' ('+(loc.candidateType||'?')+'/'+(rem.candidateType||'?')+')', relayed?'err':'ok');
+ logLine('', 'transport: '+(relayed?'relayed via TURN':'direct peer-to-peer')+' ('+(loc.candidateType||'?')+'/'+(rem.candidateType||'?')+')');
} catch(_){}
}
@@ -641,8 +644,8 @@ else wirePuppet();