# Pyramid — Feature-Checklist & Implementierungsstand > Stand: Mai 2026 > Legende: ✅ Fertig | ⚠️ Teilweise / Bug | ❌ Fehlt | 🔧 In Arbeit --- ## Inhaltsverzeichnis - [Authentifizierung](#authentifizierung) - [Raumliste](#raumliste) - [Chat / Timeline](#chat--timeline) - [Nachrichtentypen](#nachrichtentypen) - [Nachrichtenfunktionen](#nachrichtenfunktionen) - [Direct Messages](#direct-messages) - [E2EE Verschlüsselung](#e2ee-verschlüsselung) - [Push Notifications](#push-notifications) - [VoIP & Calls](#voip--calls) - [Settings / Einstellungen](#settings--einstellungen) - [Benutzerprofil](#benutzerprofil) - [Raum-Einstellungen](#raum-einstellungen) - [Suche](#suche) - [Medien](#medien) - [Read Receipts & Typing](#read-receipts--typing) - [Spaces](#spaces) - [Windows / Desktop](#windows--desktop) - [Sonstige Features](#sonstige-features) - [Dokumentations-Vollständigkeit](#dokumentations-vollständigkeit) --- ## Authentifizierung | Feature | Status | Details / Datei | |---------|--------|-----------------| | Login mit Passwort | ✅ | `login_page.dart`, `login_notifier.dart` | | Homeserver-Auswahl | ✅ | `server_page.dart` — HTTPS-Prefix fix, .well-known Autodiscovery | | Session wiederherstellen (init) | ✅ | `matrix_client.dart` — `client.init()` beim App-Start | | Logout | ✅ | Via Matrix SDK `client.logout()` | | Login-Redirect nach Init | ✅ | `router.dart` — StreamProvider-basierter Guard | | SSO / OAuth | ❌ | Nicht implementiert | | Registrierung / Account erstellen | ❌ | Keine UI | | Login mit Token | ❌ | Nur Passwort-Login | | Multi-Account | ❌ | Nur ein Account gleichzeitig | | UIAA Re-Auth (Passwort ändern) | ❌ | Kein UI | --- ## Raumliste | Feature | Status | Details / Datei | |---------|--------|-----------------| | Raumliste anzeigen | ✅ | `rooms_page.dart`, `room_list_item.dart` | | Sortierung nach letzter Aktivität | ✅ | In `rooms_provider.dart` | | Avatar-Anzeige (MXC) | ✅ | `mxc_image.dart` | | Vorschautext (letztes Event) | ✅ | `room_list_item.dart` | | Ungelesen-Badge | ✅ | `notificationCount` | | Ungelesen-Punkt (kein Count) | ✅ | Bei `notificationCount == 0` aber ungelesen | | Zeitstempel-Formatierung | ✅ | Heute: HH:MM, andere: DD.MM | | DM-Erkennung (`isDirectChat`) | ✅ | Typ-Differenzierung in Liste | | Space-Filterung | ✅ | `SpacesRail` filtert nach aktiver Space | | Einladungen anzeigen | ⚠️ | Membership.invite vorhanden, gesonderte Ansicht fehlt | | Raum suchen / filtern | ✅ | Via `search_modal.dart` | | Archivierte Räume | ❌ | Kein UI für left-rooms | | Raum erstellen (Knopf) | ✅ | `create_join_dialog.dart` | | Raum beitreten (Alias) | ✅ | `create_join_dialog.dart` | --- ## Chat / Timeline | Feature | Status | Details / Datei | |---------|--------|-----------------| | Nachrichten anzeigen | ✅ | `message_bubble.dart`, `message_group.dart` | | Gruppen-Bubbles (gleicher Sender) | ✅ | Continuation-Nachrichten (eingerückt, kein Avatar) | | Datums-Trenner | ✅ | Tagstrennlinie | | Ungelesen-Trenner ("Neue Nachrichten") | ✅ | `fullyRead`-Position | | Scroll-to-Unread beim Öffnen | ✅ | `chat_view.dart` | | History-Nachladen beim Scrollen | ✅ | `_onScroll()` → `requestHistory(60)` | | Optimistische Nachrichtenanzeige | ✅ | SDK fügt Event mit Status `sending` ein | | Nachrichtenstatus (senden/sent) | ✅ | Uhren-Icons | | Timeline-Cleanup (`cancelSubscriptions`) | ✅ | In `dispose()` | | Sprung zu bestimmtem Event | ⚠️ | Infrastruktur vorhanden, kein UI | | Event-Suche in Timeline | ❌ | Nur globale Suche | --- ## Nachrichtentypen | Typ | Status | Details | |-----|--------|---------| | Text (`m.text`) | ✅ | Vollständig | | Bild (`m.image`) | ✅ | Thumbnail + Vollansicht mit Zoom | | Video (`m.video`) | ✅ | Playback via `media_kit` | | Audio (`m.audio`) | ✅ | Player mit Progress/Dauer | | Datei (`m.file`) | ✅ | Download mit MIME-Icon | | Sticker (`m.sticker`) | ✅ | Anzeige und Senden (Sticker-Picker) | | Sprachnachricht (MSC3245) | ⚠️ | Audio-Aufnahme fehlt, Abspielen funktioniert | | Standort (`m.location`) | ❌ | Nicht implementiert | | Emote (`m.emote`) | ❌ | Kein gesondertes Rendering | | Poll (MSC3381) | ❌ | Nicht implementiert | | Verschlüsselte Nachrichten | ✅ | Automatisch via SDK, Fehler-UI vorhanden | | Redacted-Events | ⚠️ | Wird angezeigt, kein "Nachricht gelöscht"-Platzhalter | --- ## Nachrichtenfunktionen | Feature | Status | Details / Datei | |---------|--------|-----------------| | Antworten (Reply) | ✅ | Swipe-Geste + Quote-Anzeige | | Reaktionen (Emojis) | ✅ | Quick-Picker + vollständiger Emoji-Picker | | Reaktionen entfernen | ⚠️ | UI zum Entfernen fehlt | | Nachrichten bearbeiten (Edit) | ⚠️ | `getDisplayEvent()` vorhanden, Senden nicht im UI | | Nachricht löschen (Redact) | ❌ | Kein Button / Dialog | | Threads | ❌ | Nicht implementiert | | Polls | ❌ | Nicht implementiert | | Weitersenden (Forward) | ❌ | Nicht implementiert | | Kopieren (Text) | ⚠️ | Nicht explizit sichtbar | | Long-Press Auswahl-Modus | ✅ | `message_bubble.dart` — Long-Press aktiviert Selection | | Bulk-Aktionen (Auswahl) | ⚠️ | Modus vorhanden, Aktionen begrenzt | | Pinned Messages Panel | ✅ | `pinned_messages_panel.dart` | | Pins setzen (UI-Aktion) | ❌ | Kein Pin-Button in Nachricht | | Linkvorschau | ❌ | Keine URL-Preview | | Mention-Links klickbar | ✅ | `@user`-Links via `url_launcher` | --- ## Direct Messages | Feature | Status | Details / Datei | |---------|--------|-----------------| | Neuen DM starten | ✅ | `new_dm_dialog.dart` → `startDirectChat()` | | User-Verzeichnis-Suche | ✅ | `searchUserDirectory()` | | DM-Erkennung in Raumliste | ✅ | `room.isDirectChat` | | Partner-Avatar/Name | ✅ | `directChatMatrixID` → Profil laden | | DM-Verschlüsselung | ✅ | Standard E2EE bei DM-Erstellung | | Gruppen-DM | ⚠️ | Erstellbar, kein gesondertes UI | | DM vergessen / verlassen | ⚠️ | Kein UI-Button | | DM-spezifische Notification-Sounds | ❌ | Nicht implementiert | --- ## E2EE Verschlüsselung | Feature | Status | Details / Datei | |---------|--------|-----------------| | Vodozemac Rust-Crypto | ✅ | `flutter_vodozemac` initialisiert in `matrix_client.dart` | | E2EE in verschlüsselten Räumen | ✅ | Automatisch via SDK | | Bootstrap-Flow (SSSS + Cross-Signing) | ✅ | `bootstrap_dialog.dart` — vollständige State-Machine | | Cross-Signing Setup | ✅ | Master-, Self- und User-Signing-Key Erstellung | | Key Backup (online) | ✅ | SSSS-gesichertes Backup | | Schlüssel-Verifikation (SAS/Emoji) | ✅ | Via Bootstrap-Flow | | QR-Code-Verifikation | ⚠️ | SDK-Support vorhanden, kein UI | | Device-Liste anzeigen | ❌ | Kein UI | | Gerät sperren/blockieren | ❌ | Kein UI | | Fehlende Schlüssel anfordern | ✅ | `requestMissingSessionKeys()` bei Bad-Encrypted | | Entschlüsselungs-Fehler-UI | ✅ | "Nachricht konnte nicht entschlüsselt werden" + Schlüssel-Button | | Schlüssel importieren/exportieren | ❌ | Kein UI (Infrastruktur vorhanden) | --- ## Push Notifications | Feature | Status | Details / Datei | |---------|--------|-----------------| | FCM Token Registrierung | ✅ | `fcm_push_service.dart` | | Pusher auf Homeserver | ✅ | `postPusher()` mit Sygnal-Gateway | | Token-Refresh Handling | ✅ | `onTokenRefresh.listen()` | | PushService.kt (native FCM) | ✅ | Läuft auch bei geschlossener App | | Benachrichtigung bei geschlossener App | 🔧 | APK neu gebaut, noch nicht getestet | | Absender-Name in Notification | ✅ | HTTP-Fetch von Matrix API in PushService.kt | | Verschlüsselte Nachricht entschlüsseln | ⚠️ | "Neue Nachricht" bei geschlossener App; `decryptAndUpdateNotification` bei Hintergrund-App | | Inline Reply in Notification | 🔧 | ReplyReceiver auf getActivity umgestellt — APK gebaut, ungetestet | | Antwort wirklich abschicken | 🔧 | `replyFromNotification` MethodChannel — APK gebaut, ungetestet | | Gelesen-Button in Notification | ✅ | `ACTION_DISMISS` über `ReplyReceiver.kt` | | Notification bei Hintergrund-App | ✅ | Heartbeat-Check verhindert Duplikate | | Notification-Kanal Android | ✅ | `pyramid_messages`, HIGH Importance | | Stabile Notification-ID | ✅ | `stableId(roomId)` — gleicher Algo in Kotlin + Dart | | Windows Notification | ✅ | `local_notifier` (Windows Toast) | | Windows Taskbar Flash | ✅ | `WindowsTaskbar.setProgressMode()` | | Ausstehende Reply beim App-Öffnen senden | ✅ | `_sendPendingReply()` bei Resume + Sync | | Push Rules konfigurieren | ❌ | Kein UI | | Raum stumm schalten | ❌ | Kein UI | | Nur-Erwähnung-Modus | ✅ | `notifMentionOnlyDmProvider` — Preferences | | iOS Push | ❌ | Kein iOS-Build | | Web Push | ❌ | Kein Web-Build | --- ## VoIP & Calls | Feature | Status | Details / Datei | |---------|--------|-----------------| | Matrix WebRTC Legacy-Calls | ✅ | `voip_manager.dart` — CallSession | | LiveKit SFU-Calls | ✅ | `livekit_call_manager.dart` | | Unified Call-UI | ✅ | `voice_channel.dart` | | Audio-Call | ✅ | Mikrofon + Speaker | | Video-Call | ✅ | Kamera + Remote-Video | | Screen-Sharing | ✅ | `screen_share_picker.dart` | | Video-Qualitätsstufen | ✅ | SD/HD/FHD/4K Presets | | Mute-Toggle | ✅ | `setMicrophoneEnabled()` | | Deafen-Toggle | ✅ | Audio komplett stumm | | Kamera-Toggle | ✅ | `setCameraEnabled()` | | Kamera-Wechsel (Front/Rück) | ⚠️ | SDK-Support vorhanden | | Teilnehmer-Grid | ✅ | Mehrere Participants anzeigen | | Lokale Video-Vorschau | ✅ | Overlay-Widget | | Klingel-System (to-device) | ⚠️ | Infrastruktur vorhanden, Klingelton fehlt | | Incoming-Call-UI | ⚠️ | Kein dediziertes Klingel-Screen | | Call-History | ❌ | Nicht implementiert | | TURN-Server via Matrix | ⚠️ | `getTurnServer()` — ob konfiguriert unklar | | Hintergrund-Foreground-Service | ✅ | `FlutterForegroundService` via webrtc | | MatrixRTC Membership-Events | ✅ | `io.pyramid.voice.presence` State-Events | | LiveKit-Token-Exchange | ✅ | `livekit_token.dart` | --- ## Settings / Einstellungen | Feature | Status | Details / Datei | |---------|--------|-----------------| | Settings-Seite (Hauptseite) | ⚠️ | `settings_page.dart` — NUR PLATZHALTER | | Settings Modal | ✅ | `settings_modal.dart` — vollständiger Modal | | Dark/Light Mode | ✅ | `themeModeProvider` + Toggle | | Akzentfarbe (5 Presets) | ✅ | Amber/Coral/Mint/Violet/Cobalt/Lime | | Eckenradius Slider | ✅ | `radiusProvider` | | UI-Motion Toggle | ✅ | `motionProvider` | | UI-Density Toggle | ✅ | `densityProvider` | | Desktop Notifications | ✅ | `notifDesktopProvider` | | Notification Sound | ✅ | `notifSoundProvider` | | Nachrichtenvorschau | ✅ | `notifPreviewProvider` | | Nur-Erwähnung-Modus | ✅ | `notifMentionOnlyDmProvider` | | Presence anzeigen (Online) | ✅ | `privacyPresenceProvider` | | Read Receipts senden | ✅ | `privacyReadReceiptsProvider` | | Typing-Indikator senden | ✅ | `privacyTypingProvider` | | Profil bearbeiten (Name/Avatar) | ❌ | Kein UI | | Geräte-Verwaltung | ❌ | Kein UI | | Session-Liste | ❌ | Kein UI | | Passwort ändern | ❌ | Kein UI | | Account löschen | ❌ | Kein UI | | Raumspezifische Benachrichtigungen | ❌ | Kein UI | | Sprache / Lokalisierung | ❌ | Nur Systemsprache | | Barrierefreiheit | ❌ | Keine Einstellungen | --- ## Benutzerprofil | Feature | Status | Details / Datei | |---------|--------|-----------------| | Avatar anzeigen (MXC) | ✅ | `mxc_image.dart` überall | | Displayname auflösen | ✅ | Fallback auf `@username` | | Online-Präsenz senden | ✅ | `setPresence(online)` alle 10s in `app_shell.dart` | | Präsenz-Anzeige anderer User | ⚠️ | Infrastruktur, kein UI | | Profil-Popover (Hover-Karte) | ✅ | `profile_popover.dart` | | Eigenes Profil bearbeiten | ❌ | Kein UI | | Avatar hochladen | ❌ | Kein UI | | Status-Nachricht | ❌ | Nicht implementiert | | User ignorieren / blockieren | ❌ | Kein UI | | User melden | ❌ | Kein UI | --- ## Raum-Einstellungen | Feature | Status | Details / Datei | |---------|--------|-----------------| | Space-Admin Panel (Name/Avatar/Banner) | ✅ | `space_admin_dialog.dart` — Overview-Tab | | Power-Level-Editor (Mitglieder) | ✅ | `space_admin_dialog.dart` — Members-Tab | | Permissions-Tab (Raum-PLs) | ✅ | `space_admin_dialog.dart` — Permissions-Tab | | Kind-Räume verwalten | ✅ | `space_admin_dialog.dart` — Channels-Tab | | Raum-Name ändern (normaler Raum) | ❌ | Kein UI | | Raum-Thema ändern | ❌ | Kein UI | | Raum-Avatar ändern | ❌ | Kein UI | | Join-Rules ändern | ❌ | Kein UI | | History-Visibility ändern | ❌ | Kein UI | | E2EE aktivieren | ❌ | Kein UI | | Raum-Alias verwalten | ❌ | Kein UI | | Raum verlassen (Button) | ❌ | Kein UI | | Raum vergessen (forget) | ❌ | Kein UI | | User einladen (aus Chat) | ❌ | Kein UI | | Kick / Ban (Moderation) | ❌ | Kein UI | --- ## Suche | Feature | Status | Details / Datei | |---------|--------|-----------------| | Server-seitige Nachrichtensuche | ✅ | `search_modal.dart` → `/search` API | | Lokale Raum-/DM-Suche | ✅ | Filter auf `client.rooms` | | Personen-Suche | ✅ | Lokale DM-Partner-Suche | | Medien-Filter (Bilder/Videos/Audio) | ✅ | `search_modal.dart` | | Paginierung (nextBatch) | ✅ | Infinite scroll | | Suchergebnis-Highlighting | ✅ | Suchbegriff hervorheben | | Debounced Query (400ms) | ✅ | `debounce` in Suchfeld | | Öffentliches Raumverzeichnis | ❌ | Kein UI zum Entdecken | | User-Verzeichnis-Suche (global) | ✅ | In `new_dm_dialog.dart` | --- ## Medien | Feature | Status | Details / Datei | |---------|--------|-----------------| | Bild senden | ✅ | `MatrixImageFile` + Upload | | Bild anzeigen (Thumbnail + Vollbild) | ✅ | `MediaViewer` mit Zoom/Pan | | Video senden | ✅ | | | Video abspielen | ✅ | `media_kit` | | Audio senden | ✅ | | | Audio abspielen | ✅ | Player mit Progress | | Datei senden | ✅ | `MatrixFile` | | Datei herunterladen | ✅ | MIME-Icon + Browser-Öffner | | Clipboard-Bild einfügen (Windows) | ✅ | FFI + `clipboard_image.dart` | | Drag & Drop Upload (Desktop) | ✅ | `desktop_drop` | | GIF-Picker (Giphy) | ✅ | Trending + Suche + Favoriten | | Sticker-Picker | ✅ | Pack-Browser | | Bild-Komprimierung | ✅ | `shrinkImageMaxDimension` | | Verschlüsselte Medien | ✅ | Automatisch bei E2EE-Räumen | | Sprachnachricht aufnehmen | ❌ | Kein Recorder | | Kamera direkt (in App) | ❌ | Nur Gallery-Picker | | Dokument-Vorschau | ❌ | Kein PDF-Viewer | | Media-Galerie (Raum-Mediathek) | ❌ | Kein UI | --- ## Read Receipts & Typing | Feature | Status | Details / Datei | |---------|--------|-----------------| | Read Receipts senden | ✅ | `setReadMarker()` (privacy-gesteuert) | | Eigene ✓✓ Bestätigung | ✅ | Anzeige auf eigenen Nachrichten | | Read-Marker anderer anzeigen | ⚠️ | Position-Marker vorhanden, kein Avatar-Stack | | Typing-Indikator senden | ✅ | 7s Auto-Timeout | | Typing-Indikator empfangen | ✅ | Anzeige-Platzhalter | | Typing-User-Namen anzeigen | ⚠️ | Platzhalter, keine Namen | --- ## Spaces | Feature | Status | Details / Datei | |---------|--------|-----------------| | Space-Erkennung (`isSpace`) | ✅ | | | Spaces-Rail (Sidebar) | ✅ | `spaces_rail.dart` | | Space-Filterung der Raumliste | ✅ | Nur Räume der aktiven Space | | Space-Admin Panel | ✅ | `space_admin_dialog.dart` | | Space erstellen | ✅ | `create_join_dialog.dart` | | Kind-Räume hinzufügen | ✅ | In Space-Admin | | Kind-Räume entfernen | ✅ | In Space-Admin | | Voice-Präsenz in Space | ✅ | `io.pyramid.voice.presence` Events | | Space-Banner | ✅ | Mit Crop-Dialog | | Verschachtelte Spaces | ⚠️ | Anzeige, kein eigener Sub-Space-Rail | | Space beitreten (öffentlich) | ⚠️ | Technisch möglich, kein Discovery-UI | --- ## Windows / Desktop | Feature | Status | Details / Datei | |---------|--------|-----------------| | Windows Build | ✅ | CMake + MSIX | | Windows Notifications | ✅ | `local_notifier` | | Taskbar Flash | ✅ | `WindowsTaskbar` | | Update-Checker (Gitea API) | ✅ | `update_checker.dart` — 4h Intervall | | Update-Banner | ✅ | `update_banner.dart` | | Update-Download | ✅ | `update_download_dialog.dart` | | APK Auto-Install (Android) | ✅ | Kotlin MethodChannel + FileProvider | | PC Update (exe/msix) Download | ⚠️ | Release-Script pusht .zip statt .exe → öffnet Git-Seite | | Drag & Drop | ✅ | `desktop_drop` | | Clipboard Paste (Bild) | ✅ | FFI Windows API | | Resizable Sidebar | ✅ | `panel_layout.dart` — Drag-Divider | | Keyboard Shortcuts | ⚠️ | Enter zum Senden, Ctrl+V — kein vollständiges System | | System Tray | ❌ | Nicht implementiert | | Fenster-Badge (ungelesen) | ⚠️ | Nur Taskbar-Flash, kein Zähler | | macOS / Linux | ❌ | Nicht gebaut/getestet | --- ## Sonstige Features | Feature | Status | Details / Datei | |---------|--------|-----------------| | Emoji-Picker | ✅ | Kategorisiert + Suche | | Quick-Reaktionen (6 Emojis) | ✅ | Hover-Aktionsleiste | | Mitglieder-Panel (Raum) | ✅ | `members/` — Teilnehmerliste | | Profil-Popover (Hover) | ✅ | `profile_popover.dart` | | Neuer-DM Dialog | ✅ | `new_dm_dialog.dart` | | Raum-erstellen Dialog | ✅ | `create_join_dialog.dart` | | Nachricht-Auswahl-Modus | ✅ | Long-Press | | Reply-Swipe-Geste | ✅ | Rechts-wischen zum Antworten | | Immersive-Mode (Android) | ✅ | Status-Bar ausgeblendet | | PyramidLoader (Ladeanimation) | ✅ | `pyramid_loader.dart` | | Rich-Text-Editor | ❌ | Kein Markdown/Formatting-UI | | HTML-Nachrichtenrendering | ❌ | Kein `flutter_html` | | Message Forwarding | ❌ | | | Nachrichtenübersetzung | ❌ | | | Bot-Kommandos (`/`) | ❌ | | | Matrix-URI Handler | ❌ | Kein Deep-Link-Handler | | Barcode/QR-Scanner | ⚠️ | Nur in Verifikation | --- ## Dokumentations-Vollständigkeit | Doku-Abschnitt | Vollständig | Anmerkungen | |----------------|-------------|-------------| | 01 Auth | ✅ | SSO, UIAA, alle Login-Flows | | 02 Räume | ✅ | Create, Join, Spaces, Power Levels | | 03 Nachrichten | ✅ | Text, Replies, Edits, Threads, Polls | | 04 DMs | ✅ | Alle DM-Flows | | 05 Medien | ✅ | Upload, Download, alle Dateitypen | | 06 E2EE | ✅ | Setup, SAS, Cross-Signing, Key Backup | | 07 Push | ✅ | FCM, Push Rules, Pyramid-Architektur | | 08 VoIP | ✅ | Legacy m.call, MatrixRTC | | 08b LiveKit | ✅ | **KOMPLETT** — Server-Setup bis Flutter-UI | | 09 Profil | ✅ | Presence, Account-Data, Tags | | 10 Room-Admin | ✅ | Power Levels, Moderation, ACL, Synapse Admin | | 11 Suche | ✅ | Event-Suche, User-Suche, Raumverzeichnis | | 12 Schnellreferenz | ✅ | Alle Enums, Widget-Patterns, Fehlerhandling | --- ## Prioritäts-Roadmap ### 🔴 Kritisch (bald testen/fixen) 1. **Notification-Reply testen** — Neue APK (getActivity-Fix) installieren und Reply-Flow verifizieren 2. **Benachrichtigung bei geschlossener App** — Mit neuer APK testen (PushService.kt Ansatz) 3. **PC Update-Script** — `.zip` durch `.exe`-Installer ersetzen in `scripts/release.ps1` ### 🟠 Wichtig (nächste Features) 4. **Nachricht löschen (Redact)** — Long-Press-Menü → `event.redactEvent()` 5. **Nachricht bearbeiten** — Edit-Modus im Composer → `sendTextEvent(editEventId:...)` 6. **Raum-Einstellungen** — Name/Thema/Avatar für normale Räume (`room.setName()` etc.) 7. **Profil bearbeiten** — Displayname + Avatar in Settings 8. **Registrierung** — Account-Erstellung im Onboarding ### 🟡 Sinnvoll (mittelfristig) 9. **Einladungen-Screen** — Pending invites sichtbar darstellen 10. **Kick/Ban UI** — Moderation aus der Mitgliederliste 11. **Device-Verwaltung** — Eigene Sessions anzeigen + löschen 12. **Rich-Text-Editor** — Markdown/Formatierung in Nachrichten 13. **Klingelton bei eingehendem Call** — Audio + dedizierter Klingel-Screen 14. **Lautlos/Stumm per Raum** — Push-Rules im UI ### 🟢 Nice-to-have 15. Sprachnachrichten aufnehmen 16. HTML-Nachrichtenrendering (`flutter_html`) 17. Matrix-URI Deep-Links 18. Media-Galerie pro Raum 19. System Tray (Windows) 20. Polls / Abstimmungen