Files
pyramid/ROADMAP.md
T
Bernd Steckmeister 13512064a3 docs: M0 in PROGRESS/ROADMAP abschließen
Alle M0-Punkte abgehakt (Commits, flutter analyze, call/calls-Leiche,
README). Nächster Schritt laut ROADMAP: M1 Uta-Logout-Bug.
2026-07-03 09:46:27 +02:00

6.3 KiB
Raw Blame History

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

  • Vollbackup vor dem Refactoring (2026-07-03 → MatrixPi\backups\pyramid-kopie_backup_2026-07-03.tar.gz)
  • Die ~140 uncommitteten Dateien sichten, in thematische Commits aufteilen, zu Gitea pushen (Sicherungs-Commit 25ed765 + Folge-Commits bis 74d38fd; Arbeitsbaum ist jetzt sauber)
  • flutter analyze komplett sauber bekommen und sauber halten (nur noch 1 bewusst zurückgestellter Hinweis, siehe PROGRESS.md 2026-07-03)
  • lib/features/call/ vs. lib/features/calls/ (leer?) klären Leiche entfernen (geprüft: calls/ existiert nicht mehr, nur call/ mit den echten Dateien)
  • README.md durch echte Projektbeschreibung ersetzt (74d38fd)

M1 Sicherheit: Nie wieder aussperren / kein Datenverlust

  • Uta-Random-Logout untersuchen: Ursache finden (Soft-Logout vom Server? Token ungültig? Fehlerpfad im Sync, der zum Logout führt?). Erst Logging an allen Logout-Pfaden einbauen, dann Ursache fixen. Ein unerwarteter Logout darf NIE Krypto-Schlüssel wegwerfen.
  • 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).