# Pyramid – Roadmap Die lange Liste. Wird von oben nach unten abgearbeitet (Arbeitszyklus siehe `CLAUDE.md`). Reihenfolge = Priorität: erst Ordnung & Sicherheit (Datenverlust-Risiken!), dann das große Refactoring, dann Calls/Streaming/Chat-Features, dann Feinschliff. Punkte abhaken (`[x]`), wenn erledigt UND in `PROGRESS.md` protokolliert. ## M0 – Backup & Ordnung - [x] Vollbackup vor dem Refactoring (2026-07-03 → `MatrixPi\backups\pyramid-kopie_backup_2026-07-03.tar.gz`) - [x] Die ~140 uncommitteten Dateien sichten, in thematische Commits aufteilen, zu Gitea pushen (Sicherungs-Commit 25ed765 + Folge-Commits bis 74d38fd; Arbeitsbaum ist jetzt sauber) - [x] `flutter analyze` komplett sauber bekommen und sauber halten (nur noch 1 bewusst zurückgestellter Hinweis, siehe PROGRESS.md 2026-07-03) - [x] `lib/features/call/` vs. `lib/features/calls/` (leer?) klären – Leiche entfernen (geprüft: `calls/` existiert nicht mehr, nur `call/` mit den echten Dateien) - [x] README.md durch echte Projektbeschreibung ersetzt (74d38fd) ## M1 – Sicherheit: Nie wieder aussperren / kein Datenverlust - [x] **Uta-Random-Logout untersuchen:** UNGETESTET (Pi) – Ursache im matrix-SDK gefunden + Fix committet (63e4919, 9dc83f7), siehe PROGRESS.md 2026-07-03. Nächster PC-Lauf MUSS den vollen Kreislauf praktisch prüfen (Login → Nachrichten → Logout → erneuter Login → alte Nachrichten lesbar?), erst dann gilt der Punkt als wirklich erledigt. - [ ] **REGRESSION: Push-Benachrichtigungen werden nicht mehr entschlüsselt** (seit dem letzten Update; in der Version davor funktionierte es). Vorgehen: Diff der letzten Release-Versionen auf Push-/E2EE-Code prüfen (`background_push.dart`, `fcm_push_service.dart`, `notification_service.dart`, Kotlin `PushService.kt`/`BgEngine.kt`), `docs/NOTIFICATIONS.md` + Memory „Pyramid Push" lesen (dort stehen 3 bekannte Fallstricke der Hintergrund-Entschlüsselung!), dann Fix + Test auf echtem Gerät. - [ ] Sichere Speicherung von Access-Token & Krypto-DB prüfen (secure storage / sqlcipher korrekt?) - [ ] Key-Backup einrichten-Flow: Recovery-Key erzeugen, verständlich erklären, zum Sichern zwingen - [ ] Key-Backup wiederherstellen-Flow: nach Login auf neuem Gerät alte Nachrichten entschlüsseln - [ ] Logout-Schutz: Warnung mit Klartext-Folgen, wenn Key-Backup fehlt - [ ] Geräte-/Sessionverwaltung in den Einstellungen (Liste, Verifizieren, Abmelden) - [ ] Härtetest dokumentieren: Login → Nachrichten → Logout → Login neu → alles noch lesbar ## M2 – Das große Refactoring (erst nach M0/M1!) Ziel: gleiche Funktionen, saubere **modulare** Struktur – als Fundament für alles Folgende. Leitprinzip (Bernd): austauschbare Bausteine – jedes Modul muss sich komplett neu schreiben lassen, ohne dass andere Module angefasst werden müssen. - [ ] Ist-Analyse schreiben: Architektur-Schwächen auflisten (Call-Logik verteilt auf `livekit_call_manager.dart`, `voip_manager.dart`, `voice_channel.dart`?, State-Management uneinheitlich?, Gott-Dateien?, tote Widgets?) → als Refactoring-Plan in PROGRESS.md - [ ] Modul-Schnitt definieren: Module (auth, chat, rooms, calls, streaming, push, storage, …) mit je einer schmalen öffentlichen Schnittstelle; Abhängigkeiten nur über Interfaces, keine Quer-Importe zwischen Feature-Modulen - [ ] Call-Schicht entwirren: EINE klare Zuständigkeit pro Klasse (Signalisierung / LiveKit-Verbindung / UI-State sauber getrennt) - [ ] Einheitliches State-Management (Riverpod konsequent, keine Misch-Patterns) - [ ] Toten Code & Duplikate entfernen, Ordnerstruktur vereinheitlichen - [ ] Nach JEDEM Schritt: App läuft, Kernflows getestet, Commit ## M3 – Calls: Logik, UI & Audio (Discord als Referenz) - [ ] Voice-Channel-Logik robust machen: Beitreten/Verlassen/Wechseln ohne Hänger, klarer Zustand wer drin ist, sauberes Verhalten bei Verbindungsabbruch - [ ] Call-UI aufräumen: aufgeräumter, intuitiver, konsistent (Mini-Call-Widget, Vollansicht) - [ ] **Windows: Audiogeräte-Erkennung reparieren** (Mikrofon/Ausgabe erkennen und in den Einstellungen auswählbar machen – geht aktuell gar nicht) - [ ] Noise Suppression als optionale Einstellung (z. B. RNNoise/LiveKit-Audio-Filter) - [ ] Lautstärke pro Teilnehmer einstellbar (Discord-Style, persistent pro Nutzer) - [ ] Weitere Feinjustierung: Eingangsempfindlichkeit/Gate, Echo-Unterdrückung an/aus, Push-to-Talk prüfen – von Discords Sprach-Einstellungen inspirieren lassen - [ ] Anruf-Benachrichtigung auch bei gekillter App (Push-Architektur nutzen) ## M4 – Streaming (Bildschirmübertragung) - [ ] **Framerate verbessern:** Ursache messen (Encoder? Auflösung? Simulcast-Settings? Software- statt Hardware-Encoding?), dann gezielt fixen - [ ] Auflösung/Qualität wählbar für den **Streamer** (z. B. 720p/1080p + FPS-Wahl) - [ ] Qualität wählbar für den **Empfänger** (LiveKit-Simulcast-Layer auswählen) - [ ] Sauberes Degradieren bei schwacher Bandbreite statt Ruckel-Chaos ## M5 – Chat-Funktionen - [ ] Sprachnachrichten aufnehmen & abspielen (MSC3245-kompatibel, wie Element) - [ ] **Bilder speichern → richtige Galerie:** über MediaStore/Downloads statt in den unzugänglichen App-Ordner (Android Scoped Storage korrekt nutzen) - [ ] Medien senden/empfangen generell prüfen (Fortschritt, Vorschau, Videos) ## M6 – Release & Verteilung - [ ] **Google-Warnung beim Installieren untersuchen:** Play-Protect-Meldung seit der Signatur-Einführung analysieren (Signing-Konfig prüfen; unbekannte Signatur + Sideload löst das oft aus; ggf. Play-Protect-Appeal oder saubere v2/v3-Signierung) - [ ] Release-Skript prüfen/aktualisieren (Windows + Android), Versionierung sauber - [ ] In-App-Updater testen (existiert laut Git-Historie) ## M7 – Design & Feinschliff - [ ] Rooms-Icon überarbeiten – passt stilistisch nicht zu den anderen Buttons - [ ] Design-Konsistenz-Pass über alle Icons/Buttons - [ ] Onboarding: erster Start erklärt Server-Wahl und Verifikation verständlich - [ ] Themes/Darkmode-Feinschliff, Schriftgrößen ## Ideen-Parkplatz (unsortiert, erst nach M7 bewerten) - Threads, Sticker, Standort teilen, mehrere Konten - Watch-Together (z. B. Jellyfin gemeinsam schauen) > Bernd: „Das ist nur der Anfang meiner Liste" – neue Punkte einfach hier in den > passenden Meilenstein eintragen (oder Claude sagen, er soll sie einsortieren).