Do Not Disturb overwrites your status message with "dnd", and the "dnd" stays after you switch back #283

Closed
opened 2026-10-04 19:50:20 -04:00 by jared · 3 comments
Owner

What happens

  • Choosing Do Not Disturb sends status_msg: "dnd" (src/app/hooks/usePresenceUpdater.ts:122-124, setUnavailable('dnd')). Any custom status the user had ("🎮 Gaming") is replaced.
  • Other clients (Element, FluffyChat) show the literal text "dnd" as the status.
  • Switching back to Auto keeps it. Verified: after DND → Auto, the server still has {"presence":"online","status_msg":"dnd"}. resolveStatus() reads the server status back and treats "dnd" as the user's message.

Introduced by bd8e116c (2026-05-30).

Fix ideas

  • Synapse ships MSC3026 busy presence (org.matrix.msc3026.busy_presence is advertised on production, currently false; enable experimental_features.msc3026_enabled). Map DND → presence: "busy" where supported, otherwise unavailable without touching status_msg, and keep the DND flag in Lotus account data.
  • Never write a status message the user didn't type, and on leaving DND restore the previous one.

Related: #282 (Invisible/Idle/DND don't stick — same hook).


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.

**What happens** - Choosing **Do Not Disturb** sends `status_msg: "dnd"` (src/app/hooks/usePresenceUpdater.ts:122-124, `setUnavailable('dnd')`). Any custom status the user had ("🎮 Gaming") is replaced. - Other clients (Element, FluffyChat) show the literal text **"dnd"** as the status. - Switching back to **Auto** keeps it. Verified: after DND → Auto, the server still has `{"presence":"online","status_msg":"dnd"}`. `resolveStatus()` reads the server status back and treats "dnd" as the user's message. **Introduced by** bd8e116c (2026-05-30). **Fix ideas** - Synapse ships MSC3026 busy presence (`org.matrix.msc3026.busy_presence` is advertised on production, currently `false`; enable `experimental_features.msc3026_enabled`). Map DND → `presence: "busy"` where supported, otherwise `unavailable` **without** touching `status_msg`, and keep the DND flag in Lotus account data. - Never write a status message the user didn't type, and on leaving DND restore the previous one. Related: #282 (Invisible/Idle/DND don't stick — same hook). --- _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: mediumarea: settings labels 2026-10-04 19:50:20 -04:00
Author
Owner

Decision (Jared, 2026-10-04): enable MSC3026 on Synapse (matrix#19) and map Do Not Disturb to presence: "busy". Stop writing "dnd" into status_msg. Keep unavailable as the fallback for homeservers without MSC3026 (check org.matrix.msc3026.busy_presence in /versions).

**Decision (Jared, 2026-10-04):** enable MSC3026 on Synapse (matrix#19) and map Do Not Disturb to `presence: "busy"`. Stop writing "dnd" into `status_msg`. Keep `unavailable` as the fallback for homeservers without MSC3026 (check `org.matrix.msc3026.busy_presence` in `/versions`).
Author
Owner

Partly fixed by #355: leaving DND now restores your real status instead of keeping "dnd", and Settings no longer shows "dnd" as your status. Still open: while you're in DND, other clients show the literal "dnd". That needs MSC3026 busy presence on the homeserver (LotusGuild/matrix#19).

Partly fixed by #355: leaving DND now restores your real status instead of keeping "dnd", and Settings no longer shows "dnd" as your status. Still open: while you're in DND, other clients show the literal "dnd". That needs MSC3026 busy presence on the homeserver (LotusGuild/matrix#19).
Author
Owner

Re-tested on current lotus (local Synapse, aud_bob: custom status "🎮 Gaming" → Do Not Disturb → Auto):

custom: online/"🎮 Gaming" | in DND: online/"dnd" | back to Auto: online/"🎮 Gaming"
  • Leaving DND is fixed: the custom status comes back (pickHeartbeatStatus no longer adopts the dnd sentinel).
  • Still open, while in DND:
    • The status text is dnd, replacing "🎮 Gaming". Element and FluffyChat show the literal "dnd".
    • Presence read back as online rather than unavailable. Other Lotus clients only render DND for unavailable + dnd, so they show it as Online with the status "dnd". Worth a look alongside #282.

Without a server change there's nowhere else to put DND that other users can see: account data is private, and any other status encoding is junk text in other clients. The clean fix is MSC3026 busy presence:

  1. Enable experimental_features: { msc3026_enabled: true } on Synapse. Production advertises org.matrix.msc3026.busy_presence: false.
  2. Then send presence: "org.matrix.msc3026.busy" for DND and leave status_msg alone.

That's a production config decision, so this is left for the owner rather than done in a client PR.

🤖 Claude Code

Re-tested on current `lotus` (local Synapse, aud_bob: custom status "🎮 Gaming" → Do Not Disturb → Auto): ``` custom: online/"🎮 Gaming" | in DND: online/"dnd" | back to Auto: online/"🎮 Gaming" ``` - **Leaving DND is fixed:** the custom status comes back (`pickHeartbeatStatus` no longer adopts the `dnd` sentinel). - **Still open, while in DND:** - The status text *is* `dnd`, replacing "🎮 Gaming". Element and FluffyChat show the literal "dnd". - Presence read back as `online` rather than `unavailable`. Other Lotus clients only render DND for `unavailable` + `dnd`, so they show it as Online with the status "dnd". Worth a look alongside #282. Without a server change there's nowhere else to put DND that other users can see: account data is private, and any other status encoding is junk text in other clients. The clean fix is **MSC3026 busy presence**: 1. Enable `experimental_features: { msc3026_enabled: true }` on Synapse. Production advertises `org.matrix.msc3026.busy_presence: false`. 2. Then send `presence: "org.matrix.msc3026.busy"` for DND and leave `status_msg` alone. That's a production config decision, so this is left for the owner rather than done in a client PR. 🤖 Claude Code
jared closed this issue 2026-10-19 02:44:21 -04:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: LotusGuild/cinny#283