Room Widgets v1 follow-ups: capability-approval consent prompt, Jitsi/stickerpicker types, account-data widgets, per-widget popout #205

Closed
opened 2026-09-17 23:25:32 -04:00 by jared · 3 comments
Owner

Migrated from LOTUS_TODO.md on 2026-09-17 (the file is now reference-only).

Room Widgets v1 follow-ups:** capability-approval consent prompt (let widgets request send/read room events); Jitsi/stickerpicker special types; account-data (user/sticker) widgets; per-widget popout / always-on-screen. Requires the prod CSP frame-src widening (done in matrix/cinny/nginx.conf → nginx -s reload) or external widgets are blocked.

_Migrated from `LOTUS_TODO.md` on 2026-09-17 (the file is now reference-only)._ Room Widgets v1 follow-ups:** capability-approval consent prompt (let widgets request send/read room events); Jitsi/stickerpicker special types; account-data (user/sticker) widgets; per-widget popout / always-on-screen. Requires the prod CSP `frame-src` widening (done in `matrix/cinny/nginx.conf` → **`nginx -s reload`**) or external widgets are blocked.
jared added this to the Features 2026-Q4 milestone 2026-09-17 23:25:32 -04:00
jared added the enhancementpriority: lowarea: navigation labels 2026-09-17 23:25:32 -04:00
Author
Owner

Capability-approval consent prompt: shipped (c1661e48)

  • Room widgets can now ask for more than display-only access. A prompt names the widget, the host that runs it and who added it, and lists each request in plain words (e.g. "Send messages of type “m.text” in this room · as you"). Reading is pre-ticked; sending is not. Deny, Escape or clicking away grants nothing extra.
  • Scope is only the widget's own room. These are never offered, and the driver refuses them again at send time:
    • other rooms' timelines (timeline:*)
    • to-device messages
    • account data
    • uploads
    • user-directory search
    • delayed events
    • writing protected state: power levels, join rules, history visibility, encryption, membership, ACLs, aliases, tombstone, widgets
  • "Remember my choice for this widget on this device" is stored per viewer in localStorage and tied to the widget URL, so a changed URL asks again.
  • Driver and live events: the driver implements send, timeline and state reads, and relation reads. The view feeds the room's live (decrypted) events and state updates, which ClientWidgetApi forwards only when the widget holds the capability.

Verified in Chromium with a cross-origin test widget against a local Synapse:

  • the prompt never showed the power-levels or timeline:* requests
  • after allowing send and read, the widget's message landed on the server, and its power-levels write was refused ("Cannot send state events of this type")
  • the widget received a live message sent by another client
  • after a reload, the remembered choice skipped the prompt

Unit tests cover the classifier: automatic vs asked vs denied, and the protected-state list.

prompt

Still open on this issue: Jitsi/stickerpicker special types, account-data (user/sticker) widgets, per-widget popout / always-on-screen.

## Capability-approval consent prompt: shipped (`c1661e48`) - [x] **Room widgets can now ask for more than display-only access.** A prompt names the widget, the host that runs it and who added it, and lists each request in plain words (e.g. "Send messages of type “m.text” in this room · as you"). Reading is pre-ticked; sending is not. Deny, Escape or clicking away grants nothing extra. - [x] **Scope is only the widget's own room.** These are never offered, and the driver refuses them again at send time: - other rooms' timelines (`timeline:*`) - to-device messages - account data - uploads - user-directory search - delayed events - writing protected state: power levels, join rules, history visibility, encryption, membership, ACLs, aliases, tombstone, widgets - [x] **"Remember my choice for this widget on this device"** is stored per viewer in localStorage and tied to the widget URL, so a changed URL asks again. - [x] **Driver and live events:** the driver implements send, timeline and state reads, and relation reads. The view feeds the room's live (decrypted) events and state updates, which ClientWidgetApi forwards only when the widget holds the capability. **Verified** in Chromium with a cross-origin test widget against a local Synapse: - the prompt never showed the power-levels or `timeline:*` requests - after allowing send and read, the widget's message landed on the server, and its power-levels write was refused ("Cannot send state events of this type") - the widget received a live message sent by another client - after a reload, the remembered choice skipped the prompt Unit tests cover the classifier: automatic vs asked vs denied, and the protected-state list. ![prompt](https://code.lotusguild.org/attachments/310791a1-629e-4b54-bca7-460151bf33ce) Still open on this issue: Jitsi/stickerpicker special types, account-data (user/sticker) widgets, per-widget popout / always-on-screen.
Author
Owner

Owner decision (2026-10-20): build popout (#441, merged) and always-on-screen (#443). Don't build Jitsi or stickerpicker widget types or account-data widgets: low value, since Lotus has its own calls and sticker packs.

This issue closes once #443 merges.

Owner decision (2026-10-20): build **popout** (#441, merged) and **always-on-screen** (#443). Don't build Jitsi or stickerpicker widget types or account-data widgets: low value, since Lotus has its own calls and sticker packs. This issue closes once #443 merges.
Author
Owner

Done: popout (#441) and always-on-screen (#443) are merged. The other items were declined by the owner (see above). Closing.

Done: popout (#441) and always-on-screen (#443) are merged. The other items were declined by the owner (see above). Closing.
jared closed this issue 2026-10-20 22:22:31 -04:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: LotusGuild/cinny#205