From 9fd6b06a3f403abf4c2a0af3650954a92dbd11ea Mon Sep 17 00:00:00 2001 From: Russell Ballestrini Date: Wed, 3 Jun 2026 19:28:23 -0400 Subject: [PATCH] =?UTF-8?q?zebra-spaces:=20lock=20listeners=20into=20DJ=20?= =?UTF-8?q?mode=20=E2=80=94=20no=20per-speaker=20opt-out?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per fox: 'lock them into DJ mode unconditionally.' Stream button is no longer rendered on listener rows for any other peer. Visibility rule reverts to {self|host} — same as the post-kick/ban gating — and listeners get auto-enrolled into the HTTP Ogg/Opus path without any escape hatch. Host can still flip individual speakers room-wide, and every speaker still has their self-monitor button. --- web/zebra-spaces.html | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) 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');