.env.examplenach.envkopieren und lokale Werte setzen.- Starten:
docker compose up --build - URLs lokal:
- Frontend:
http://192.168.58.158:4173 - Backend:
http://192.168.58.158:8000
- Frontend:
DATABASE_URL=postgresql://streamforge:streamforge@postgres:5432/streamforge?schema=publicREDIS_URL=redis://redis:6379FRONTEND_URL=http://192.168.58.158:4173BACKEND_URL=http://192.168.58.158:8000TWITCH_REDIRECT_URI=http://192.168.58.158:8000/api/auth/twitch/callbackTOKEN_ENCRYPTION_KEY=<64 hex chars>SESSION_SECRET=<long random secret>TWITCH_EVENTSUB_ENABLED=false(für den ersten OAuth-Testlauf)
bash scripts/validate-local.sh
Das Skript führt aus:
- Backend install
- Prisma format / validate / generate
- Backend build
- Frontend install / build
- optional
docker compose build - optional
bash scripts/smoke-test-local.shmitRUN_SMOKE_TEST=true
bash scripts/smoke-test-local.sh
Eigenschaften:
- Nur für lokale Entwicklung gedacht.
- Nutzt Cookie-Jar (
-c cookies.txt,-b cookies.txt). - Prüft:
- Backend erreichbar
GET /api/setup/status- ggf.
POST /api/setup/create-owner POST /api/auth/loginGET /api/auth/meGET /api/channelsGET /api/admin/health
- Bricht bei Fehlern mit Exit-Code
!= 0ab.
Falls Setup schon abgeschlossen ist und der lokale Smoke-Test-User nicht existiert:
- mit bestehenden Zugangsdaten starten, z. B.
SMOKE_TEST_EMAIL=... SMOKE_TEST_PASSWORD=... bash scripts/smoke-test-local.sh
cd backend
npm run prisma:format
DATABASE_URL=postgresql://streamforge:streamforge@192.168.58.158:5432/streamforge?schema=public npm run prisma:validate
npm run prisma:generate
npm run prisma:pushprisma:push nur für lokale/dev Datenbanken nutzen.
- Twitch Developer App anlegen.
- Redirect URL setzen auf
http://192.168.58.158:8000/api/auth/twitch/callback. .envsetzen:TWITCH_CLIENT_IDTWITCH_CLIENT_SECRETTWITCH_REDIRECT_URIFRONTEND_URLBACKEND_URLTOKEN_ENCRYPTION_KEYSESSION_SECRETTWITCH_EVENTSUB_ENABLED=false
docker compose up --build/setupaufrufen und ersten Admin anlegen./loginmit lokalem Account testen.- Twitch Login über Button testen.
- Prüfen:
/api/auth/mezeigt Twitch User/api/channelszeigt Twitch Channel- Dashboard zeigt den Channel
- Dann
TWITCH_EVENTSUB_ENABLED=truesetzen. - Backend neu starten.
/api/admin/healthprüfen.- Im Twitch Chat
!pingschreiben. - Prüfen:
- Bot antwortet
- ChatMessage gespeichert
- CommunityUser aktualisiert
- BotEvent
command_executedgeschrieben usageCounterhöht
- Keine Secrets oder Tokens loggen.
- Admin Health zeigt nur Statusdaten (z. B.
status,connected,subscribed,lastError, Counter, Timestamps).
- Community Radar API:
GET /api/channels/:channelId/community/radarliefert kanalgebundene Kennzahlen (Nachrichten, aktive Chatter, neue/wiederkehrende Viewer, potenzielle Moderationsunterstützung, Watchlist zur manuellen Prüfung). - FAQ-Erkennung API:
GET /api/channels/:channelId/community/faqerkennt häufige Fragen über lokale Heuristiken (Fragezeichen, Normalisierung, Frequenzen). - Command Suggestions API:
GET /api/channels/:channelId/commands/suggestionsundPOST /api/channels/:channelId/commands/from-suggestion. - Recaps API:
POST /api/channels/:channelId/recaps/generate,GET /api/channels/:channelId/recaps,GET /api/channels/:channelId/recaps/:recapId. - Wichtig: alle Auswertungen sind ohne externe KI/API implementiert, rein heuristisch und lokal.
- Keine kanalübergreifenden Auswertungen oder Datenlecks.
- Keine automatische Sanktion oder Moderationsentscheidung.
- Keine Persönlichkeitsdiagnosen.
- Watchlist/Potential-Moderatoren sind ausschließlich heuristische Hinweise zur manuellen Prüfung.
Ports:
- Frontend:
4173 - Backend:
8000
- Setup-Seite öffnen:
http://SERVER-IP:4173/setup - Anzeigename, E-Mail und Passwort ausfüllen.
- Nach Erfolg wird eine Session gesetzt und die App lädt den eingeloggten Nutzer über
/api/auth/me.
curl -i http://192.168.58.158:8000/api/setup/status
curl -i -X POST http://192.168.58.158:8000/api/setup/create-owner \
-H 'content-type: application/json' \
-d '{"displayName":"Owner","email":"owner@example.test","password":"Secret123!"}'
curl -i -X POST http://192.168.58.158:8000/api/auth/login \
-H 'content-type: application/json' \
-d '{"email":"owner@example.test","password":"Secret123!"}'
curl -i --cookie cookies.txt --cookie-jar cookies.txt http://192.168.58.158:8000/api/auth/me- Zugriff vom selben Rechner:
VITE_API_URL=http://192.168.58.158:8000 - Zugriff von einem anderen Gerät im Netzwerk:
VITE_API_URL=http://<SERVER-IP>:8000
- "Login ist aktuell nicht erreichbar"
VITE_API_URLzeigt auf falschen Host/Port.- Backend läuft nicht oder ist nicht erreichbar.
- CORS/Credentials blockieren den Request.
- Session-Cookie wird nicht gesetzt oder nicht mitgesendet.
- Setup wurde noch nicht durchgeführt.
- E-Mail/Passwort sind falsch.
- Frontend läuft lokal unter
http://192.168.58.158:4173. - Login über
/login, danach Weiterleitung zur Kanalauswahl (/channels) oder direkt ins erste Channel-Dashboard. - Kanalauswahl verlinkt auf das echte Dashboard:
/dashboard/channels/:channelId. - Dashboard-Routen:
/dashboard/channels/:channelId/dashboard/channels/:channelId/commands/dashboard/channels/:channelId/timers/dashboard/channels/:channelId/community/dashboard/channels/:channelId/recaps/dashboard/channels/:channelId/campaigns/dashboard/channels/:channelId/moderation/dashboard/channels/:channelId/integrations/dashboard/channels/:channelId/settings/admin/health
- Aktuell nutzbar (MVP): Dashboard-Übersicht, Commands CRUD, Timers CRUD, Campaigns CRUD, Community Radar, Recaps, Admin Health.
- Noch MVP/Platzhalter mit Erklärung: Moderation, Integrationen, Settings.
- LiveChat: Zeigt Twitch-Nachrichten live per SSE, inklusive Verbindungsstatus und deduplizierter Anzeige für stabile Moderation im laufenden Stream.
- Chatters: Listet aktive Chat-Teilnehmer mit Rolle, Aktivitätsdaten und schnellen Rollen-/Moderationsaktionen, soweit Twitch-Scopes verfügbar sind.
- Moderation: Bietet aktive Bans/Timeouts, manuelle Moderationsaktionen und eine kompakte Historie als operativen Arbeitsbereich.
- Integrationen: Trennt klar Plattform-Bot, Channel-Moderatorstatus, EventSub-/Live-Verbindung und Debug-Hinweise zur schnellen Diagnose.
- Admin Health: Gibt Plattform-Admins einen strukturierten Überblick über API/DB/Redis sowie EventSub-Transporte und Session-Zustände.
- Settings: Zentraler Bereich für Channel-Metadaten und Bot-Grundeinstellungen wie Prefix, Sprache und Zeitzone.
Das Dashboard ist jetzt als dunkles SaaS-UI über /channels erreichbar.
/setup/login/channels/dashboard/channels/:channelId/dashboard/channels/:channelId/commands/dashboard/channels/:channelId/timers/dashboard/channels/:channelId/community/dashboard/channels/:channelId/recaps/dashboard/channels/:channelId/campaigns/dashboard/channels/:channelId/moderation/dashboard/channels/:channelId/integrations/dashboard/channels/:channelId/settings/admin/health
- Commands
- Timer
- Community Radar
- Recaps
- Campaigns
- Admin Health
- Discord
- Integrationen (MVP-Placeholder)
- Moderation (MVP-Placeholder)
- Settings (MVP-Placeholder)
- Public Domain:
https://www.streamforge-bot.com - API Domain Path:
https://www.streamforge-bot.com/api - Reverse Proxy routing:
/-> frontend192.168.58.158:4173,/api-> backend192.168.58.158:8000. - Backend keeps internal routes as
/api/.... - Required forwarded headers:
Host,X-Forwarded-For,X-Forwarded-Proto,X-Real-IP. - Set backend
TRUST_PROXY=truein proxy deployments. - Cookie hardening: signed cookie, HttpOnly, Secure in production, SameSite=Lax (balanced CSRF protection with OAuth redirect compatibility).
- Production CORS: strict allow-list via
ALLOWED_ORIGINS(comma-separated), credentials enabled only for allowed origins. - Mutating requests in production require allowed
Origin(CSRF origin check). - API body size limit is 256KB; invalid JSON and oversized payloads return structured API errors.
- Campaign redirect
/c/:shortCodeis redirect-only (no server-side fetch), reducing SSRF exposure.
- Public:
/api/public/health,/c/:shortCode - Auth:
/api/auth/login,/api/auth/logout,/api/auth/me,/api/auth/twitch/* - Setup:
/api/setup/status,/api/setup/create-owner - Channel-scoped:
/api/channels/:channelId/*(commands/timers/campaigns/community/recaps/logs) - Admin:
/api/admin/* - Validation: write endpoints reject unknown fields for key auth/setup/commands/timers/campaigns flows.
- Production (reverse proxy):
VITE_API_URL=https://www.streamforge-bot.com - Local LAN:
VITE_API_URL=http://192.168.58.158:8000 - If
VITE_API_URLis empty, frontend now defaults to current origin (same-domain mode).
docker compose logs backend --tail=200
docker compose exec backend printenv | grep -E 'TWITCH|TOKEN|PUBLIC|FRONTEND|BACKEND|COOKIE|NODE_ENV'
curl -i https://www.streamforge-bot.com/api/auth/twitch/start- Browser DevTools → Application → Cookies öffnen.
- Nach
/api/auth/twitch/startmusssf_twitch_oauth_stategesetzt sein. - Callback muss auf derselben Domain erfolgen (
https://www.streamforge-bot.com). - In HTTPS-Setups
COOKIE_SECURE=truesetzen. - Für den State-Cookie gilt:
HttpOnly,SameSite=Lax,Path=/api/auth/twitch, in ProductionSecure=true.
-
twitch.oauth.invalid_state- State-Cookie fehlt.
- Cookie
Secure/SameSite/Pathfalsch. - Callback läuft auf anderer Domain.
- Reverse Proxy reicht Cookie nicht sauber durch.
-
twitch.oauth.token_exchange_failed- Client Secret falsch.
- Redirect URI stimmt nicht exakt.
- OAuth-Code bereits verbraucht.
- Twitch API lehnt Request ab.
-
twitch.oauth.token_encryption_failedTOKEN_ENCRYPTION_KEYfehlt.TOKEN_ENCRYPTION_KEYist nicht 64 Hex-Zeichen.- Lösung:
openssl rand -hex 32.
-
twitch.oauth.persistence_failed- Prisma Schema/DB Problem.
- Unique Constraint.
- Ungültiges Datenformat.
startAll() startet ausschließlich echte Streamer-Channels, wenn alle Bedingungen erfüllt sind:
isActive=truebotEnabled=true- gespeicherter TwitchToken vorhanden
- kein interner System-Channel (
displayName=System,twitchLogin=system-*,twitchChannelId=sys-*)
Wichtig:
- Der System-Channel wird nie für Twitch EventSub subscribed.
- Channels ohne TwitchToken werden als
skippedmarkiert (z. B.missing_twitch_token) und nicht als harter Fehler gezählt. - Der Plattform-Bot ist ein globaler Bot-Account und wird nicht automatisch als aktiver Streamer-Channel behandelt.
Für OAuth-Tests TWITCH_EVENTSUB_ENABLED=false setzen.
Erst nach erfolgreichem OAuth-Login und gespeicherten Tokens auf true setzen und Backend neu starten.
Pflichtwerte für Production:
PUBLIC_APP_URL=https://www.streamforge-bot.comPUBLIC_API_URL=https://www.streamforge-bot.com/apiFRONTEND_URL=https://www.streamforge-bot.comBACKEND_URL=https://www.streamforge-bot.comTWITCH_REDIRECT_URI=https://www.streamforge-bot.com/api/auth/twitch/callback
Twitch Developer Console Redirect URLs müssen exakt sein:
https://www.streamforge-bot.com/api/auth/twitch/callbackhttps://www.streamforge-bot.com/api/auth/twitch/platform-bot/callback
Typisch falsch:
http://192.168.58.158:8000/api/auth/twitch/callbackhttp://192.168.58.158:4173/loginhttps://streamforge-bot.com/api/auth/twitch/callbackhttps://www.streamforge-bot.com/auth/twitch/callbackhttps://www.streamforge-bot.com/api/auth/twitch/callback/
Nginx/NPM Proxy:
/api->http://192.168.58.158:8000/->http://192.168.58.158:4173- Forwarded Header:
Host,X-Forwarded-For,X-Forwarded-Proto,X-Real-IP
Diagnose:
curl -i https://www.streamforge-bot.com/api/public/health
curl -i https://www.streamforge-bot.com/api/public/twitch/config
curl -i https://www.streamforge-bot.com/api/public/twitch/oauth-url
curl -I https://www.streamforge-bot.com/api/auth/twitch/startErwartung:
/api/public/health->200JSON/api/public/twitch/config-> sichere Config-Diagnose/api/public/twitch/oauth-url-> OAuth URL mit korrekterredirect_uri/api/auth/twitch/start->302zuhttps://id.twitch.tv/oauth2/authorize...- niemals Redirect zu
http://192.168.58.158:4173/login
Scopes (MVP):
user:read:emailuser:read:chatuser:write:chatuser:botchannel:bot
Bei Scope-Änderungen muss OAuth erneut durchgeführt werden.
Funktioniert:
- Login
- Twitch OAuth
- EventSub
- Commands
- Custom Commands
Nutzbar im Dashboard:
- Commands
- Timer (Verwaltung im Dashboard; Ausführung aktuell MVP/experimentell solange Timer-Worker nicht produktiv angeschlossen ist)
- Logs
- Admin Health
Testablauf:
- Twitch Login
- EventSub aktivieren
- !ping testen
- Custom Command im Dashboard anlegen
- Im Twitch Chat testen
- Usage Count prüfen
- Logs prüfen
StreamForge enthält nun ein kanalgebundenes Community-Intelligence-MVP auf Basis lokal gespeicherter Twitch-Chatdaten:
- Community Radar mit Nachrichten, aktiven Chattern, neuen/wiederkehrenden Zuschauern, Topics, FAQ-Anteilen, Command-Nutzung und heuristischem Engagement-Score.
- FAQ-Erkennung mit Normalisierung und Gruppierung ähnlicher Fragen.
- Command-Vorschläge inkl. Erstellung eines Commands direkt aus dem Vorschlag.
- Stream Recaps als lokal erzeugte Zusammenfassung ohne externe KI.
Wichtig:
- Alle Auswertungen sind heuristisch und lokal.
- Keine externe KI/API.
- Keine automatische Moderation oder Sanktionen.
- Keine personenbezogene Diagnose.
- Im Twitch Chat mehrere Nachrichten schreiben.
- Fragen stellen, z. B. „Welches Mikro nutzt du?“.
- Dashboard → Community Radar öffnen.
- Command-Vorschlag prüfen.
- Command daraus erstellen.
- Im Twitch Chat testen.
- Recap generieren.
- Admin Login.
- Twitch Login.
- EventSub aktivieren.
!pingtesten.- Custom Command anlegen.
- Timer anlegen.
- Logs prüfen.
- Community Radar prüfen.
- Recap generieren.
- Discord ist noch nicht aktiv.
- Recaps sind heuristisch.
- Community Radar ist heuristisch.
- Keine automatische Moderation.
- Timer sind abhängig von Worker/Backend-Laufzeit.
- Live Chat im Dashboard (
/dashboard/channels/:channelId/live-chat) - Aktuelle Chatters im Dashboard (
/dashboard/channels/:channelId/chatters) - Chatters werden mit CommunityUser-Daten (firstSeen/lastSeen/messageCount/commandCount) angereichert
- Chatters-Liste kann bei Twitch verzögert aktualisiert werden
- Neuer benötigter Scope:
moderator:read:chatters - Nach Scope-Änderung muss Twitch OAuth erneut durchgeführt werden, damit das Token den Scope enthält
- Twitch neu verbinden.
- EventSub aktivieren.
- Im Twitch Chat Nachrichten schreiben.
- Dashboard → Live Chat öffnen.
- Dashboard → Chatters öffnen.
- Prüfen, ob Chatters angezeigt werden.
Twitch zeigt immer den Namen des Accounts an, dessen OAuth-Token zum Senden genutzt wird. Wenn ein anderer Name im Chat erscheinen soll, muss ein separater Twitch-Bot-Account verbunden werden.
- Der Kanal sollte den Bot-Account als Moderator setzen:
/mod BOTNAME. - Danach in StreamForge:
Dashboard -> Integrationen -> Twitch Bot Account verbinden. - Bei Twitch mit dem gewünschten Bot-Account anmelden.
- Danach sendet StreamForge im Chat als Bot-Account.
- Ohne verbundenen Bot-Account sendet StreamForge weiterhin als Broadcaster.
Nach Scope-Änderungen muss Twitch OAuth erneut durchgeführt werden (Broadcaster- und/oder Bot-Flow).
StreamForge verwendet einen zentralen Twitch-Bot-Account zum Senden von Chatnachrichten.
- Broadcaster OAuth (pro Channel) bleibt für Channel-Verknüpfung, EventSub und Berechtigungsprüfung erforderlich.
- Platform Bot OAuth (global) wird einmal im Adminbereich verbunden.
- Streamer müssen den Plattform-Bot im eigenen Chat moderieren:
/mod BOTLOGIN. - Ohne Plattform-Bot oder ohne Modrechte kann Senden fehlschlagen.
- Nach Scope-Änderungen muss OAuth erneut durchgeführt werden.
Diese Redirect URLs müssen exakt eingetragen sein:
- Broadcaster OAuth:
https://www.streamforge-bot.com/api/auth/twitch/callback - Platform Bot OAuth:
https://www.streamforge-bot.com/api/auth/twitch/platform-bot/callback
- Admin Login.
- Plattform-Bot verbinden.
- Redirect URL für Platform Bot Callback in Twitch Developer Console prüfen.
- Streamer Channel verbinden.
- In Twitch Chat:
/mod BOTLOGIN. - In StreamForge Moderatorstatus prüfen.
- Command anlegen.
- Im Twitch Chat ausführen.
- Bot antwortet unter BOTLOGIN.
- Unterstützte Aktionen: Timeout, Ban, Unban/Untimeout über Dashboard und API.
- Benötigter Broadcaster Scope:
moderator:manage:banned_users. - Nach Scope-Änderungen muss Twitch OAuth erneut durchgeführt werden, damit der Scope im gespeicherten Token vorliegt.
- Alle Moderationsaktionen sind manuell ausgelöst, kanalgebunden, rollenbasiert und werden in ModerationAction/BotEvent/AuditLog protokolliert.
- Keine automatische Moderation, keine automatischen Sanktionen.
- API:
DELETE /api/channels/:channelId/recaps/:recapId. - Löschen ist kanalgebunden und nur für berechtigte Rollen vorgesehen.
- Löschaktionen werden auditiert.
- Topics werden heuristisch zu Clustern verdichtet (z. B. Setup, Discord, Schedule, Music, Gaming, Tech).
- Irrelevante Einzelwörter, URLs, Mentions, Zahlenfragmente und sehr kurze Tokens werden gefiltert.
- Anzeige nur relevanter Topics inkl. Score/Keywords/MessageCount, keine rohe Wortzähl-Liste.
- Empfehlungen sind kompakt (max. 5) und rein heuristisch, ohne personenbezogene Bewertung.
- Chatters zeigt aktuelle Twitch-Chatteilnehmer im Dashboard.
- Twitch aktualisiert diese Liste verzögert.
- Angezeigte Rollen: Broadcaster, Moderator, VIP, Viewer.
- Über StreamForge änderbar sind nur echte Twitch-Rollen:
- Moderator hinzufügen/entfernen
- VIP hinzufügen/entfernen
- Nicht änderbar: Subscriber, Follower, Founder, Broadcaster, Affiliate/Partner.
- Benötigte Scopes:
- moderator:read:chatters
- channel:manage:moderators
- channel:read:vips
- channel:manage:vips
- Nach Scope-Änderung muss Twitch OAuth erneut durchgeführt werden.
- Alle Rollenänderungen werden in AuditLog/BotEvent/TwitchRoleAction protokolliert.
Die Seite Chatters zeigt aktuelle Twitch-Chatteilnehmer (mit möglicher Twitch-Verzögerung) und deren Rolle:
- Broadcaster
- Moderator
- VIP
- Viewer
Pro Chatter gibt es ein Hamburger-/Drei-Punkte-Menü mit manuellen Aktionen:
- Moderator hinzufügen/entfernen
- VIP hinzufügen/entfernen
- Timeout
- Ban
- Unban / Timeout entfernen
Nicht möglich über StreamForge:
- Subscriber setzen
- Follower setzen
- Broadcaster ändern
- Affiliate/Partner ändern
Benötigte Scopes:
moderator:read:chatterschannel:manage:moderatorschannel:read:vipschannel:manage:vipsmoderator:manage:banned_users
Wichtig: Nach Scope-Änderungen muss Twitch OAuth erneut durchgeführt werden, damit der gespeicherte Token die neuen Scopes enthält.
Alle Rollen- und Moderationsaktionen werden in Audit- und Event-Logs protokolliert.
- Der Plattform-Bot ist ein zentraler Twitch-Account des Betreibers.
- Er wird einmalig im Adminbereich unter
/admin/twitchper OAuth verbunden. - Streamer verbinden nur ihren eigenen Channel per Broadcaster OAuth.
- Um den Plattform-Bot im Channel zu aktivieren, muss der Streamer im Twitch-Chat ausführen:
/mod BOTLOGIN. - Channel-Integrationen zeigen nur Status und Anleitung, kein Admin-OAuth für normale Channel-User.
- Nur Admins (
system_owner,platform_admin) können den globalen Plattform-Bot verbinden. - Optionaler Fallback:
TWITCH_ALLOW_BROADCASTER_SEND_FALLBACK(empfohlen: developmenttrue, productionfalse).
- Der globale Plattform-Bot gehört zur Plattform und wird zentral vom Betreiber verbunden.
- Streamer verbinden nur ihren eigenen Twitch-Channel per Broadcaster OAuth.
- Danach kann der Bot in den Channel geholt werden:
- Automatisch über StreamForge, wenn der Broadcaster-Token den Scope
channel:manage:moderatorshat. - Manuell im Twitch-Chat mit
/mod BOTLOGIN.
- Automatisch über StreamForge, wenn der Broadcaster-Token den Scope
- Danach in der Integrationsseite auf Status prüfen bzw. Status erneut prüfen klicken.
- Wenn der Scope fehlt: Twitch-Kanal erneut verbinden, damit der Token
channel:manage:moderatorsenthält.
Unter /dashboard/channels/:channelId/settings:
botEnabledcommandPrefixlanguage(de/en)timezone
Ablauf:
- Plattform-Bot global im Adminbereich verbinden.
- Streamer-Channel per Twitch OAuth verbinden.
- Im Twitch-Chat ausführen:
/mod BOTLOGIN. - In StreamForge unter Integrationen: Moderatorstatus prüfen.
Fehlerdiagnose:
twitch.platform_bot.scope_missing: Channel erneut per Twitch verbinden.twitch.platform_bot.channel_token_missing: Streamer muss Twitch OAuth durchführen.twitch.platform_bot.not_configured: Betreiber muss Plattform-Bot verbinden.twitch.platform_bot.api_failed: Twitch API Antwort und Request-ID in Logs prüfen.
- Ein vorhandener Plattform-Bot bedeutet nicht, dass er im Channel bereits als Moderator eingerichtet ist.
- Der Moderatorstatus muss live über Twitch geprüft werden.
- Nur
verified_moderatorbedeutet "bereit". - Bei
unknown,scope_missing,api_failedodercheck_faileddarf StreamForge nicht als "bereit" anzeigen.
Wenn neue Chatnachrichten nicht erscheinen:
- Admin Health prüfen.
- Channel Debug prüfen:
GET /api/channels/:channelId/twitch/debug - Folgendes kontrollieren:
- EventSub enabled
- Session connected
- subscribed
- lastMessageAt
- ChatMessages gespeichert
- Live-Stream/SSE verbunden
Wenn scope_missing angezeigt wird, Twitch-Kanal erneut verbinden, damit channel:manage:moderators im Broadcaster-Token enthalten ist.
- Twitch OAuth, Livechat, Chatters, Moderation, Integrationen und Settings sind im MVP nutzbar.
- Debug-Daten pro Channel:
GET /api/channels/:channelId/twitch/debug(ohne Token/Secret-Werte). - Debug UI: im Bereich Integrationen sichtbar (EventSub, letzte Nachrichten, Live-Subscriber, Bot-Status).
- Livechat prüfen:
/dashboard/channels/:channelId/livechatöffnen, SSE-Status beobachten und Historie neu laden. - Plattform-Bot prüfen: in Integrationen
Moderatorstatus prüfenausführen. - Nach Scope-Änderungen muss Twitch OAuth neu verbunden werden (z. B.
moderator:manage:banned_users,channel:manage:moderators,channel:manage:vips,channel:read:vips).
- Backend starten.
- AdminHealth prüfen:
eventSubConnected=true- Channel
subscribed=true
- Im Twitch Chat schreiben:
test - Erwartung in BotEvents:
eventsub_chat_message_receivedchat_message_savedlive_chat_event_published
- Backend restart:
docker compose restart backend - Nach Restart: AdminHealth muss wieder
subscribed=truezeigen. - Wieder im Twitch Chat schreiben.
- Livechat muss aktualisieren.
- Command
!ping(oder Channel-Prefix) testen.
Twitch erlaubt auf einer einzelnen EventSub-WebSocket-Session keine Subscriptions, die mit unterschiedlichen User-Kontexten erstellt werden.
Darum nutzt StreamForge pro Broadcaster/User-Kontext eine eigene EventSub-WebSocket-Verbindung (Transport-Isolation pro User-ID).
Der Plattform-Bot wird dabei nicht als normaler Channel subscribed. Der Plattform-Bot ist Sender/Moderator und wird nicht automatisch als beobachteter Channel gestartet.
Ursache:
- Bei Twitch existieren noch alte oder doppelte EventSub-Subscriptions für denselben Typ und dieselbe Bedingung.
- Betroffen ist meist
channel.chat.messagebei Reconnects/duplizierten Sessions.
Lösung:
- In Admin Health die Aktion Cleanup EventSub Subscriptions ausführen.
- Danach Restart EventSub oder pro Session Restart Session ausführen.
Sicherheitsgrenze:
- StreamForge löscht nur passende WebSocket-Subscriptions für denselben Channel/User-Kontext (
broadcaster_user_id+user_id) und nur fürchannel.chat.message. - Fremde Subscription-Typen oder fremde Channel/User-Kontexte werden nicht gelöscht.
Falls bereits doppelte Twitch-Chatnachrichten vorhanden sind, vor Schema-Update ausführen:
delete from "ChatMessage" c
using "ChatMessage" d
where c."channelId" = d."channelId"
and c.platform = d.platform
and c."externalMessageId" = d."externalMessageId"
and c."externalMessageId" is not null
and c."createdAt" > d."createdAt";Danach prisma db push ausführen, damit der Unique Constraint sauber greift.
- Manuelle Nachrichten aus dem Dashboard-LiveChat werden immer als Broadcaster/Streamer gesendet (nicht als Plattform-Bot).
- Bot-/Command-Antworten laufen weiterhin unverändert über die bestehende Plattform-Bot-Logik.
- Benötigter Broadcaster-Scope:
user:write:chat. - Nach Scope-Änderung muss der Twitch-Kanal erneut verbunden werden, damit das Token den neuen Scope enthält.
- Erfolgreich gesendete Nachrichten werden nicht lokal „gefaked“, sondern erscheinen erst nach Twitch EventSub-Zustellung im LiveChat (vermeidet Duplikate).
- Viewernamen werden farblich unterschiedlich dargestellt.
- Der Nachrichtentext bleibt einheitlich (gleiche Textfarbe für alle Nachrichten).
Damit LiveChat-Events ohne Reload sofort erscheinen, muss SSE für /api/channels/:channelId/live/chat/stream ungepuffert durchgereicht werden.
Empfohlene Proxy-Settings für /api:
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
chunked_transfer_encoding off;Zusätzlich sollte der Backend-Response-Header gesetzt sein:
X-Accel-Buffering: noHinweis zur Diagnose: Wenn LiveChat dauerhaft reconnecting zeigt und liveStream.subscribers=0 bleibt, blockiert typischerweise Auth, Route oder Reverse Proxy die SSE-Verbindung.
Das lokale Smoke-Script liegt unter scripts/smoke-test-local.sh.
ENV-Variablen:
BASE_URL(Default:https://www.streamforge-bot.com)EMAILundPASSWORD(optional für Login)CHANNEL_ID(optional für Channel-spezifische Endpunkte)
Beispiel:
BASE_URL=https://www.streamforge-bot.com EMAIL=owner@example.test PASSWORD='***' CHANNEL_ID=abc123 bash scripts/smoke-test-local.shbackend/src/routes/channels.routes.ts: Channel-Liste, Channel-Anlage, Channel-Detail.backend/src/routes/channelSettings.routes.ts: Channel Settings lesen/schreiben.backend/src/routes/channelLogs.routes.ts: Channel Logs.backend/src/routes/liveChat.routes.ts: Chat-History, SSE-Stream, manuelles Senden.backend/src/routes/chatters.routes.ts: Twitch Chatters.backend/src/routes/twitchRoles.routes.ts: Twitch Rollen-Aktionen + Historie.backend/src/routes/twitchModeration.routes.ts: Twitch Moderationsaktionen.backend/src/routes/platformBot.routes.ts: Plattform-Bot Status/Checks.backend/src/routes/channelDebug.routes.ts: Twitch Debug-Endpoint.
- Zeigt Chat-Aktivität im Zeitraum (Nachrichten gesamt, aktive User, Commands, Peak-Stunde, Nachrichten pro Stunde).
- Zeigt aktive Zuschauer und neue aktive Zuschauer auf Basis beobachtbarer Chatdaten.
- Erkennt relevante Themen mit Stopword-Filter und Mindesthäufigkeit statt roher Wortliste.
- Erkennt wiederkehrende Fragen per Normalisierung und Gruppierung ähnlicher Fragen.
- Erzeugt automatische Stream-Recaps aus Chatdaten (regelbasiert, ohne externe KI).
- Recaps enthalten Summary, Kennzahlen, Top-Themen, häufige Fragen, Top-Viewer und Top-Commands.
- Recaps können erstellt, gespeichert, gelistet und gelöscht werden.
- Im Channel-Dashboard ersetzt die Statusleiste den oberen, dominanten „Channels“-Menüpunkt und sitzt am oberen Rand der Dashboard-Ansicht.
- Die Statusleiste zeigt Live-Status, Viewer, Titel, Kategorie, Laufzeit, EventSub/Chat-Status, Bot-Status und Bitrate-Hinweis.
- Live-Status und Zuschauer kommen aus Twitch Helix
Get Streams(/helix/streams). - Subscriber-Zahlen benötigen den Scope
channel:read:subscriptions. Falls der Scope fehlt, wird nurSubs nicht verfügbarangezeigt. - Nach Scope-Erweiterungen muss der Streamer Twitch erneut verbinden, damit neue Scopes im Token enthalten sind.
- Bitrate wird aktuell nicht erfunden: Twitch Helix liefert im verwendeten Endpunkt keine echte Stream-Bitrate, daher zeigt die UI
Bitrate: n/a. - Der Status aktualisiert sich periodisch (30s Polling) und kann manuell aktualisiert werden.
system_owner: zentrale Plattformverwaltung (Admin-Dashboard), Benutzerverwaltung, Streamer-/Channel-Verwaltung, EventSub/Health.platform_admin: technische/operative Plattformverwaltung (Admin-Bereiche ohne system_owner-only Benutzerverwaltung).channel_owner: vollständiges Streamer-Dashboard für den eigenen Channel.channel_admin: Channel-Verwaltung mit eingeschränkten operativen Rechten.channel_moderator: Moderation/LiveChat-Fokus im Channel-Dashboard.viewer: eingeschränkter Zugriff ohne Admin-Funktionen.
System User (system_owner, platform_admin) landen nach Login im Bereich /admin statt im Streamer-Dashboard.
Dort stehen bereit:
- Benutzerverwaltung (
/admin/users, nursystem_owner) - Streamer-/Channel-Verwaltung (
/admin/streamers) - Twitch/EventSub-Verwaltung (
/admin/twitch) - Systemzustand (
/admin/health)
Streamer-spezifische Oberflächen wie LiveChat/Commands/Chatters bleiben im Channel-Dashboard unter /dashboard/channels/:channelId/* und werden für System User nicht als Standardansicht geladen.