Structured analysis of the May-2026 Figma extraction — every screen mapped to a feature, every feature labelled NEW / UPDATE / NO-CHANGE, plus reconstructed user flows, role insights, missing logic, and assumptions.
Multi-party encrypted chat for groups (peer-support, team consult, family, supervision pool).
Key UI
Header with group name + "Supervision On/Off" badge; E2EE banner "Ihre Nachrichten sind Ende-zu-Ende verschlüsselt … niemand außerhalb dieses Chats kann die Nachrichten lesen. Nicht einmal die Online-Beratungs-Plattform."; participant initials row; composer; tools row (Reply directly / Reply in Thread / Mark Text / Forward / Delete / Add).
User actions
Send, reply in thread, mark text, blur PII, forward, delete, invite people, archive, mute, request help, summarize, toggle supervision.
System behaviour (inferred)
Each group is a Matrix room with E2EE; tools are gated by chat-type permissions (anonymous / 1-1 / group / supervision); supervision flag toggles a system message and audit trail.
Active call notice in chat: "Currently Active Call → Join Video Call"
Purpose
Embed a live LiveKit call into the existing chat thread; anyone in the room can join.
Key UI
"Currently Active Call" pill, "Join Video Call" CTA.
System behaviour
UserService issues a short-lived LiveKit JWT per joiner; WebRTC handshake direct to LiveKit.
Open product question
"What happens when a user deletes himself during a video call (if he's the initiator)? What happens if a client deletes himself from a group chat?" — see Edge Cases for the resolution we propose.
If email given → server stores it invisibly to counselors, used only for password reset & inbound notification. 2FA via App or Email link. Account deletion = full wipe.
Composer with "Wähle wer diese Nachricht sehen soll" / "Adressaten wählen"
Purpose
Let a counselor send a message to a subset of room members (e.g. "only the moderators").
Key UI
"Send to" dropdown; participant list with selectable rows; "Select All Counsellors" / "Select All Moderators" / "Select All"; result pill "visible only to: Ich" / "3 Moderators" / "+23"; "Reply directly" vs "Reply in Thread".
Send-button states
A) hide entirely in 1-1 chat; B) grey when 2 + participants; B2) AAA touch zones; C) icon = chat-type symbol; D) remember last selection per chat; E) always hidden for clients.
System behaviour
Matrix m.room.message with a custom relation/restriction; receivers list enforced server-side and client-side (defense-in-depth).
Counselor can mark / annotate / blur sensible parts of an incoming message; send marked notes to a thread or to a private editor (case-note draft).
Key UI
Highlight palette (color picker), "Selects color, now tool works like text mark tool in tiptap"; eye toggle (show/hide blurred text); marked excerpts grouped under labels (Great Aspects, Dangerous Behaviors, …); CTAs "sends it to thread" / "sends it to editor" / "send all to editor" / "send all to thread".
System behaviour
Marks are message-overlay metadata stored client-side (and synced via E2EE); blur applies a uniform 80% white overlay (fff 80% Overlay Blur (uniform) 4); a receiver sees "Counsellor blurred some personal please be aware in future".
"All active chats are displayed here", "Please select a message from the panel first.", "No Conversations archived yet", "There are no request at the moment", "Wählen Sie zuerst bitte eine Nachricht aus der Liste aus."
Animation rule
"Animations should only play once each time you click on a section, not in loop, playback speed not more than 0.7×".
Status
[UPDATE REQUIRED] — adopt as standard empty-state copy.
"What happens when a user deletes himself during a video call (if he's the initiator)?"
[MISSING FLOW] — there is no UI for "promote initiator" or "end-call-on-initiator-leave" decision.
Proposed: see Edge Cases §9.1.7. When a client deletes themselves mid-call, the LiveKit room continues for remaining counselors. The originator role transfers to the next counselor by joined_at ASC; if no counselor remains, the room ends.
"What happens if a client deletes himself from a group chat?"
[MISSING FLOW] — group chats so far were assumed to be all-counselor.
Proposed: see Edge Cases §9.1.8. Client's pseudonym is wiped immediately; their messages stay (E2EE bodies are not personal data) but their authorship label becomes "Ehemaliger Teilnehmer". If the client was the only advice-seeker, the group is auto-archived.
[UNCLEAR BEHAVIOR] — Matrix has no native "visible only to" message-level restriction.
Proposed implementation: a server-side bot ("Carimat-relay") is the only sender for restricted messages — it forwards each addressed copy as a 1-to-1 sub-thread, OR uses Matrix m.room.encrypted with per-recipient Megolm sessions. Decision needed.
[UNCLEAR BEHAVIOR] — for a "Law Violation" handover, the figma annotation says "Law Enforcement Representative" — meaning a regulator may need access. The legal mechanics (warrant, disclosure scope, encryption-key access) are out of scope for the UI but must be defined before this code path is enabled. Today the platform has no escrow of E2EE keys, so even with a warrant the message bodies remain unreadable.
[UNCLEAR BEHAVIOR] — Notifications can include email mirror (if email captured). What about push? Matrix has push gateways; do we use them for clients with no email? Decision needed.
[UNCLEAR BEHAVIOR] — "Email is not visible to counselors" — is it visible to Counselor Admin? The default should be no (treated as privileged auth field, only readable by Platform Admin for legal/auth purposes).
sequenceDiagram autonumber participant Cl as Client participant FE as ORISO-Frontend participant US as UserService participant KC as Keycloak Cl->>FE: Open live-chat link FE->>US: POST /live-chat/anonymous US->>KC: create anonymous user KC-->>FE: cookie + pseudonym FE-->>Cl: Waiting Room + GDPR popup #1 Cl->>FE: Confirm consent Note over Cl,FE: After session ends, before final wipe: FE-->>Cl: "So geht es weiter" — capture optional email? alt opted-in Cl->>FE: Provide email FE->>US: PUT /me/email (privileged-only field) Cl->>FE: Enrol 2FA (App or email-magic) FE->>KC: required-action: configure TOTP / Magic end alt account deletion Cl->>FE: Click "Konto löschen" FE->>US: DELETE /me US->>KC: full wipe end
sequenceDiagram participant Co as Counselor participant FE as ORISO-Admin participant US as UserService participant MX as Matrix Co->>FE: Pick ticket from Inbox (Anfragephase) FE->>US: POST /live-chat/accept US->>MX: create encrypted room Note over Co,FE: Active 1-1 chat ongoing Co->>FE: "Invite more people" (⇧I) FE->>US: POST /rooms/{id}/invite US->>MX: invite peers → room becomes group Note over Co,FE: Client sees "Counsellor invited X" system msg + may consent again
sequenceDiagram participant Co as Counselor participant FE as ORISO-Element participant US as UserService Co->>FE: Highlight client text FE->>FE: Apply color (Tiptap mark) Co->>FE: Toggle "blur" eye → 80% white overlay Co->>FE: Click "send all marked → editor" FE->>FE: Decrypt locally, scrub, package as case-note draft FE->>US: POST /case-notes (encrypted at rest) US-->>FE: 201 Created
sequenceDiagram autonumber participant Co1 as Counselor A (going off) participant Co2 as Counselor B (taking over) participant FE as ORISO-Admin participant US as UserService participant Cl as Client Co1->>FE: Open Handover modal Co1->>FE: Pick reason (Sickness) Co1->>FE: Select Co2 from same agency FE->>US: POST /handover { from, to, reason } US->>US: check consent rules for reason US->>Co2: invite to room US->>Cl: System msg "Deine vorherige Beraterin ist leider krank…" alt reason needs client consent US->>Cl: ask consent Cl-->>US: accept / reject end Co2->>FE: accept US->>MX: rotate room ownership; remove Co1
sequenceDiagram participant Co as Counselor participant FE as ORISO-Admin participant US as UserService participant Sup as Supervisor Co->>FE: Chatraum Einstellungen → Help requests (⇧Ä) FE->>US: POST /escalation { chatId, recipient, mode: internal|external } US->>Sup: notification + read-only Matrix invite Sup-->>FE: review and respond (in-thread)
sequenceDiagram participant Co as Counselor participant FE as ORISO-Element participant AI as AI Workflow (self-hosted) participant US as UserService Co->>FE: Click "Chat Zusammenfassen" (⇧Ü) FE->>FE: Decrypt last N events locally FE->>FE: Strip PII tokens FE->>AI: POST /summarize (scrubbed text) AI-->>FE: bullet-summary FE->>Co: editable summary panel Co->>FE: Save FE->>US: PUT /case-notes/{id}
These are explicit and remain to be validated against code / Frank.
A1 — Group chat = generalized Matrix room. No new chat protocol; group chats use the same Synapse, just with multiple counselor / client members and chat-type metadata.
A2 — Multi-Recipient Send is implemented via a server-side relay bot or per-recipient Megolm sessions. Not native to Matrix; needs decision.
A3 — Mark/Blur lives as message-overlay annotations, separate from message body, synced as encrypted events.
A4 — AI Summary runs in browser (decrypt+scrub) → self-hosted summarizer. Server never sees ciphertext or PII.
A5 — Phase model uses three states: Anfragephase, Vermittlungsphase, Aktiv. The Vermittlungsphase covers GDPR-#2-pending and handover-pending. Needs validation.
A6 — "Email not visible to counselors" means visible only to Platform Admin for legal / auth purposes; never to Counselor Admin or Counselor.
A7 — 2FA via App or Email for clients is opt-in and only available if they captured an email.
A8 — Account deletion triggers the same wipe pipeline as client-leaves-room, plus removal of the optional email and any notifications.
A9 — Tenant-level permission overrides cascade: Platform → Tenant → Agency → Chat-type. Final effective permission = AND of all applicable layers (a parent disabling a feature beats a child enabling it).
A10 — Voice messages: Megolm-encrypted Opus blobs uploaded to Matrix media repo; stored ≤ 48 h like text.
A11 — Tags are agency-scoped vocabularies; "Cant find Matching Tag?" CTA opens an "ask the admin" inquiry.
A12 — Animations rule: each animation plays once per click; ≤ 0.7× speed; never loops. Adopted as a global UX constant.
A13 — Languages: DE / EN / TR / FR are confirmed first-class. Default = browser language with EN fallback (not DE).
A14 — File upload limit is 10 MB per file; mime allow-list is jpg, png, pdf, docx, xlsx. Server rejects others.
A15 — Inviter rule: when a counselor invites someone to an active 1-1 room, the room becomes a group; the client gets a system message and may see a re-consent prompt depending on tenant policy.
A16 — Handover reasons that touch external authority ("Law Violation") still cannot break E2EE; the system only delivers metadata access. Legal escalation is documented but not implemented in v3.
A17 — Carimat / Chatbot scripted onboarding is the planned name for the on-rails first-message bot that asks topic / language; not yet implemented.
If any of A1-A17 is wrong, please update this page first and let the rest of the docs cascade.