Files
pyramid/docs/matrix-sdk/README.md
T
Bernd Steckmeister 25ed765a03 wip: Sicherungs-Commit aller Änderungen seit April + Arbeitsstruktur (CLAUDE.md, ROADMAP.md, PROGRESS.md, Autopilot)
6 Wochen uncommittete Arbeit (Voice-Channels, LiveKit-Manager, Settings-Modal u.v.m.)
als ein WIP-Commit gesichert, damit nichts verloren geht und der Pi den aktuellen
Stand klonen kann. Thematische Aufarbeitung: siehe ROADMAP M0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CPrAGBxBT6GfPXzeWQ4AXb
2026-07-03 05:47:18 +02:00

4.5 KiB

Matrix SDK — Pyramid Entwicklungsreferenz

Basis: package:matrix (Dart/Flutter Matrix SDK)
Ziel: Vollständige Landkarte aller Matrix-Funktionen mit Code-Snippets für den Pyramid-App-Bau.
Referenz-Implementierung: FluffyChat (https://gitlab.com/famedly/fluffychat)


Navigation

# Thema Beschreibung
01 Authentifizierung Login, Logout, Register, SSO, Token-Management
02 Räume & Spaces Erstellen, Beitreten, Verlassen, Spaces, Suche
03 Nachrichten & Events Senden, Timeline, Reaktionen, Edits, Threads, Polls
04 Direct Messages DM-Räume finden, starten, verwalten
05 Medien & Dateien Upload, Download, Thumbnails, verschlüsselte Medien
06 E2EE Verschlüsselung Keys, Verifizierung, Cross-Signing, Key-Backup
07 Push & Notifications Pusher, Push Rules, FCM, lokale Benachrichtigungen
08 VoIP & Calls MatrixRTC, Legacy m.call, Klingel-Flow
08b LiveKit Streaming Vollständige Server-Anleitung + Flutter-Implementierung
09 Profil & Präsenz Avatar, Displayname, Presence, Account-Daten
10 Raum-Administration Power Levels, Moderierung, Einstellungen, Bans
11 Suche & Discovery Nachrichten-Suche, User-Suche, Raum-Verzeichnis
12 Schnellreferenz Alle Enums, Widget-Patterns, Fehlerhandling
13 Server-Admin Continuwuity Admin API, Power Levels erzwingen, MSC3083, Diagnose
CHECKLIST Feature-Checklist Implementierungsstand + Roadmap

Schnellreferenz: Client-Initialisierung

import 'package:matrix/matrix.dart';

final client = Client(
  'MeinApp',                              // App-Name (User-Agent)
  database: MatrixSdkDatabase(...),       // Persistenz (sqflite)
  nativeImplementations: NativeImplementationsIsolate(compute), // E2EE
  logLevel: Level.warning,
);

// Initialisieren (lädt gespeicherten Session-State)
await client.init(
  waitForFirstSync: false,               // UI nicht blockieren
  waitUntilLoadCompletedLoaded: false,
);

Architektur-Überblick

Client
├── rooms: List<Room>               // alle bekannten Räume
├── userID: String?                 // eigene MXID (@user:server)
├── accessToken: String?            // Bearer-Token
├── homeserver: Uri                 // https://matrix.example.org
│
├── Room
│   ├── id: String                  // !roomId:server
│   ├── getTimeline()               // Event-Stream
│   ├── sendTextEvent()
│   ├── sendEvent()
│   ├── members                     // Map<String, User>
│   └── states                      // Map<String, Map<String, StrippedStateEvent>>
│
├── Event
│   ├── type: String                // m.room.message, m.reaction, …
│   ├── content: Map<String, dynamic>
│   ├── body: String                // text body (decrypted)
│   └── messageType: String?        // m.text, m.image, m.file, …
│
└── User
    ├── id: String                  // MXID
    ├── displayName: String?
    └── avatarUrl: Uri?

Wichtige Streams / Provider-Hooks

// Auf Sync-Events reagieren
client.onSync.stream.listen((SyncUpdate update) { ... });

// Neue/geänderte Räume
client.onRoomUpdate.stream.listen((String roomId) { ... });

// Verbindungsstatus
client.onConnectionStateChanged.stream.listen((ConnectionState s) { ... });

// Eigener User geändert
client.onUserEvent.stream.listen((EventUpdate update) { ... });

// Benachrichtigungs-Events (gefiltert nach Push-Rules)
client.onNotification.stream.listen((Event event) { ... });

Tipps für Riverpod-Integration

// Matrix-Client als Provider
final matrixClientProvider = FutureProvider<Client>((ref) async {
  final client = Client('Pyramid', ...);
  await client.init(waitForFirstSync: false);
  return client;
});

// Raumliste reaktiv
final roomsProvider = StreamProvider<List<Room>>((ref) async* {
  final client = await ref.watch(matrixClientProvider.future);
  yield client.rooms;
  await for (final _ in client.onSync.stream) {
    yield client.rooms;
  }
});