# 4 — Analytics-Dashboard (`apps/dashboard`) **Wirkrichtung:** Steuerung. Beantwortet die Frage "was funktioniert eigentlich", die Twitch selbst nicht beantwortet. Läuft auf `http://localhost:4792`. Vite + Preact + uPlot, liest direkt aus SQLite. Keine Authentifizierung, weil nur lokal erreichbar. ## Seiten ### Stream-Zeitachse (die wichtigste) Eine gemeinsame X-Achse (Stream-Laufzeit), darauf übereinander: - Viewerzahl (Linie, aus `viewer_samples`) - Chat-Nachrichten pro Minute (Balken) - unterschiedliche Chatter pro 5 min (Linie) - Marker: Kategoriewechsel, Titelwechsel, Raids rein/raus, Clips, Follows, Subs Damit sieht man direkt: An welcher Stelle kamen Leute rein, an welcher gingen sie, und war der Chat da tot oder wach. **Zusammenhang von Viewerzahl und Chat-Aktivität ist die Kernfrage** — 15 Zuschauer mit stillem Chat sind weniger wert als 8 mit lebendigem. ### Abgangs-Analyse Aus `viewer_samples`: Ableitung über die Zeit, die stärksten Abfälle markiert und mit dem gleichzeitigen `stream_segments`-Eintrag und den Chat-Nachrichten der Minute davor angereichert. Antwort auf "wann gehen die Leute". Wichtige Einschränkung, die im UI stehen muss: `viewer_samples` ist eine Momentaufnahme der Gesamtzahl, keine Ein-/Austrittsliste. Twitch liefert das nicht. Ein Abfall von 12 auf 8 kann vier Abgänge oder sechs Abgänge plus zwei Zugänge bedeuten. Für Chatter ist es exakt (über `user_streams`), für stille Zuschauer geschätzt. ### Titel- und Kategorie-Performance Aggregation über `stream_segments`: pro Titel/Kategorie die durchschnittliche Viewerzahl, der Nettozufluss während des Segments, Chat-Rate, gewonnene Follower pro Stunde. Sortierbar. Mit Hinweis auf die Stichprobengröße — bei drei Streams pro Titel ist jede Zahl Rauschen, und das Dashboard sagt das, statt eine Rangliste vorzutäuschen. ### Chatter: neu vs. wiederkehrend Pro Stream ein Stapelbalken: Erstchatter / wiederkehrend (1–4 Streams) / Stammgast (5+). Dazu eine Kohorten-Tabelle: Von den Erstchattern aus Stream N, wie viele waren in N+1, N+2, N+3 wieder da. Das ist die Zahl, die tatsächlich über Wachstum entscheidet. ### Betriebsstatus `GET /health` vom Ingest, letzte Fehler aus `logs/`, Größe der DB, Clip-Warteschlange. ## Clip-Freigabe Zusätzlich hostet das Dashboard die Freigabe-Ansicht für die Clip-Pipeline (siehe [`clip-shorts.md`](clip-shorts.md)): Kandidatenliste mit Videovorschau, Score, Chat-Ausschnitt und den Knöpfen *Übernehmen* / *Verwerfen*. ## Abnahmekriterien - Die Zeitachse eines abgeschlossenen Streams lädt in unter 2 s. - Alle Marker liegen zeitlich korrekt (Abgleich gegen das VOD). - Die Kohorten-Tabelle stimmt mit einer manuellen SQL-Auszählung überein.