Files
pyramid/ROADMAP.md
T

103 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`)
- [ ] Die ~140 uncommitteten Dateien sichten, in thematische Commits aufteilen, zu Gitea pushen
- [ ] `flutter analyze` komplett sauber bekommen und sauber halten
- [ ] `lib/features/call/` vs. `lib/features/calls/` (leer?) klären Leiche entfernen
- [ ] README.md durch echte Projektbeschreibung ersetzen (was ist Pyramid, wie baut man es, wo liegt was)
## 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).