diff --git a/web/zebra-spaces.html b/web/zebra-spaces.html
index 5ad8d17..f3bc109 100644
--- a/web/zebra-spaces.html
+++ b/web/zebra-spaces.html
@@ -4112,18 +4112,16 @@ function renderRoom(){
* the targeted speaker from WebRTC subscribe → HTTP Ogg/Opus tap.
* Visibility rule:
* - SELF row: always (self-monitor — preview what listeners hear)
- * - OTHER rows: host (room-wide control), OR listener (their own
- * playback choice — listeners are auto-enrolled into DJ mode
- * on join for glitch-free playback; the button lets them opt
- * back to low-latency WebRTC per-speaker if they want)
- * Speakers/cohosts intentionally get only self-monitor — no peer-
- * level stream toggle so the host's room-wide model stays simple. */
+ * - OTHER rows: host only (room-wide control)
+ * Speakers/cohosts get self-monitor only. Listeners get NO button
+ * at all — they're locked into DJ mode unconditionally for the
+ * glitch-free playback fox: 'epic, never choppy'. */
if (canSpeak(m.role) && m.pubkey){
let mPubHex = '';
try { mPubHex = hex(unb64(m.pubkey)); } catch(_){}
if (mPubHex){
const isSelf = (m.uuid === myUUID);
- const canStreamThisRow = isSelf || myRole === 'host' || myRole === 'listener';
+ const canStreamThisRow = isSelf || myRole === 'host';
if (canStreamThisRow){
const sb = document.createElement('button'); sb.className = 'small';
const on = streamMode.has(mPubHex);
@@ -4661,8 +4659,8 @@ logLine('', 'ready — pick a handle, type a rendezvous code, enter the space');