diff --git a/zebra-report/zebra-spaces.html b/zebra-report/zebra-spaces.html
index baa49b4..ca8b7b2 100644
--- a/zebra-report/zebra-spaces.html
+++ b/zebra-report/zebra-spaces.html
@@ -3229,6 +3229,14 @@ async function onRoleChanged(prev, next){
inRoleTransition = true;
try {
if (!canSpeak(prev) && canSpeak(next)){
+ /* Listener -> speaker (or cohost/host) is a brand-new mic grab.
+ * Default to MUTED so the user doesn't broadcast whatever was
+ * happening in their room when they accepted. They can click
+ * 'unmute' when they're ready. ensureMicAndUI() reads the
+ * sessionStorage value via applyMuteState, so set it BEFORE
+ * the acquire. */
+ muted = true;
+ try { sessionStorage.setItem(MUTE_STATE_KEY, '1'); } catch(_){}
await ensureMicAndUI();
for (const [uuid, mm] of members){
if (uuid === myUUID) continue;
@@ -3898,8 +3906,8 @@ logLine('', 'ready โ pick a handle, type a rendezvous code, enter the space');