"Mute for 1 hour" mutes the room on every device but only the device that set it ever unmutes it #333

Closed
opened 2026-10-05 23:31:52 -04:00 by jared · 0 comments
Owner

Timed mutes write a server-side push rule (the room is muted for every client, including mobile push via other apps). The unmute is a local timer: muteTimers.ts keeps {roomId, unmuteAt} in this browser's localStorage (MUTE_TIMERS_KEY), and MuteTimerRestore (ClientNonUIFeatures.tsx:363) unmutes on that device, on its next start, or via a setTimeout while it's open.

Consequences:

  • Mute for 1 hour on the laptop, then close it. The room stays muted on the phone (and in Element X or FluffyChat push) until the laptop's Lotus is opened again, possibly days later. Other devices show it as plainly "Muted", with no end time.
  • Log out on that device and the room stays muted forever. The timer list is kept as a "preference" through logout (plaintextCaches.ts lists io.lotus.mute_timers as not swept), but it only acts for whoever logs in next on that browser.
  • It's the same pattern as #300 (custom status auto-clear only works on the device that set it).

Fix: store the timers in account data (io.lotus.mute_timers, { [roomId]: unmuteAt }). Every Lotus client then shows "Muted until 15:30" and the first one online after expiry unmutes; deleting the entry stops the others too. Optionally write the expiry into the push rule itself as an extra field, so a future server or bot could honour it.


Found in the October 2026 client audit (Playwright against a local Synapse + LiveKit stack, plus code reading). Code refs are at cinny 30e2dbcd, cinny-desktop 8f67ec7, element-call 3b0050e8.

Timed mutes write a **server-side** push rule (the room is muted for every client, including mobile push via other apps). The *unmute* is a local timer: `muteTimers.ts` keeps `{roomId, unmuteAt}` in **this browser's localStorage** (`MUTE_TIMERS_KEY`), and `MuteTimerRestore` (ClientNonUIFeatures.tsx:363) unmutes on that device, on its next start, or via a `setTimeout` while it's open. **Consequences:** - Mute for 1 hour on the laptop, then close it. The room stays muted on the phone (and in Element X or FluffyChat push) until the laptop's Lotus is opened again, possibly days later. Other devices show it as plainly "Muted", with no end time. - Log out on that device and the room stays muted forever. The timer list is kept as a "preference" through logout (`plaintextCaches.ts` lists `io.lotus.mute_timers` as not swept), but it only acts for whoever logs in next on that browser. - It's the same pattern as #300 (custom status auto-clear only works on the device that set it). **Fix:** store the timers in account data (`io.lotus.mute_timers`, `{ [roomId]: unmuteAt }`). Every Lotus client then shows "Muted until 15:30" and the first one online after expiry unmutes; deleting the entry stops the others too. Optionally write the expiry into the push rule itself as an extra field, so a future server or bot could honour it. --- _Found in the October 2026 client audit (Playwright against a local Synapse + LiveKit stack, plus code reading). Code refs are at cinny `30e2dbcd`, cinny-desktop `8f67ec7`, element-call `3b0050e8`._
jared added the bugpriority: lowarea: notifications labels 2026-10-05 23:31:52 -04:00
jared closed this issue 2026-10-18 02:22:22 -04:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: LotusGuild/cinny#333