EventSub ueber WebSocket wurde in ADR-0003 beschlossen und nie gebaut. Jetzt gebaut, weil Kanalpunkt-Einloesungen ueber IRC nur ankommen, wenn die Belohnung eine Texteingabe verlangt - und selbst dann ohne Einloese-ID. Ohne die ID lassen sich Punkte nicht zurueckgeben, wenn eine Aktion scheitert. Zwei Eigenheiten des Protokolls, die im Code stehen: - Ein Abonnement muss innerhalb von 10 Sekunden nach dem Willkommensgruss stehen, sonst schliesst Twitch wieder. - Bei `session_reconnect` wird erst die neue Verbindung aufgebaut und dann die alte geschlossen. Andersherum faellt genau dazwischen eine Einloesung unter den Tisch. Belohnungen werden ueber ihren Titel zugeordnet, wahlweise ueber die stabile ID; liegt beides vor, gewinnt die ID. Eine unbekannte Belohnung ist kein Fehler - es darf welche geben, die das Toolkit nichts angehen. Zum Vorlesen, und warum es eine Warteschlange hat: chat-control.md schliesst TTS fuer Ausbaustufe 1 aus, und der Grund gilt. Kanalpunkte sammeln sich beim Zugucken von allein an und sind damit kaum eine Huerde; ohne Freigabe hat man eine Vorlesefunktion fuer Fremde im eigenen Stream. Vorgabe ist deshalb die Freigabe von Hand, dazu Laengengrenze, Wortfilter, Drossel je Person und Stunde und ein Panikschalter. Zu langer Text wird abgelehnt statt gekuerzt - ein halb vorgelesener Satz ist schlimmer als gar keiner, weil niemand weiss, ob der Rest Absicht war. Gesprochen wird ueber `speechSynthesis`, im Browser eingebaut: kein Cloud-Dienst, keine Kosten, kein Zuschauertext, der das Haus verlaesst. Ob OBS' Browser-Quelle das kann, ist offen - CEF wird teils ohne Sprachausgabe gebaut. Die Seite prueft es beim Start und blendet einen roten Hinweis ein, statt still zu bleiben. Kanalpunkte haben eine eigene Einblendung. Zwischendurch stand hier die des Abos, womit eine eingeloeste Belohnung als "Neues Abo" im Bild gelandet waere - eine Falschmeldung, die in der Aufzeichnung bleibt. Ein Test haelt das fest. `rewards.enabled` ist aus, bis jemand bewusst Belohnungen eintraegt. Eine Aktion, die niemand erwartet, ist im Stream schlimmer als gar keine. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
abdulive-toolkit
Werkzeugkasten für den Twitch-Kanal abdulive_. Ein Monorepo mit mehreren kleinen Diensten, die sich einen gemeinsamen Kern teilen: Twitch-Auth, Helix-Client, EventSub/IRC-Ingest und eine SQLite-Datenbank.
TypeScript auf Node 24, ohne Laufzeitabhängigkeiten und ohne Build-Schritt —
Node führt die .ts-Dateien direkt aus, SQLite und WebSocket sind eingebaut.
Betrieb über Docker Compose.
Zielgröße des Kanals: ~5–30 gleichzeitige Zuschauer. Alles hier ist auf diese Phase optimiert — nicht auf Skalierung, sondern auf Wachstum und Bindung.
Die neun Tools
| # | Tool | Ordner | Zweck | Status |
|---|---|---|---|---|
| 1 | Clip-to-Shorts | apps/clipper |
Clips → 9:16 mit Untertiteln, Upload-fertig | geplant |
| 2 | Go-Live-Broadcaster | apps/broadcaster |
Stream-Start → Discord/Bluesky/Instagram | geplant |
| 3 | Raid- & Netzwerk-Tool | apps/raid-scout |
Raid-Ziele finden, Raid-Historie führen | geplant |
| 4 | Analytics-Dashboard | apps/dashboard |
Viewer vs. Chat, Titel-Performance, Retention | geplant |
| 5 | VOD-Kapitel | apps/vod-chapters |
Szenen-/Kategoriewechsel → Timestamps | geplant |
| 6 | Community-Gedächtnis | apps/community |
Chatter-Profile, Begrüßungen, Overlay-Hinweise | geplant |
| 7 | Chat steuert Dinge | apps/overlay-server + apps/overlay-web |
Overlay, Soundboard, Minigames, Umfragen | geplant |
| 8 | Punktesystem + Shop | apps/loyalty |
Punkte mit echten Konsequenzen | geplant |
| 9 | Stream-Recap | apps/recap |
Zusammenfassung nach Streamende in Discord | geplant |
Dazu der Dienst, der unter allen anderen liegt:
| — | Ingest-Daemon | apps/ingest | IRC + Helix → DB, Einrichtungsseite | läuft |
Doku
docs/00-overview.md— Was hier gebaut wird und warumdocs/01-architecture.md— Aufbau, Datenfluss, Prozessedocs/02-twitch-integration.md— Auth, Scopes, EventSub, Rate Limitsdocs/03-data-model.md— Datenbankschemadocs/04-roadmap.md— Reihenfolge und Meilensteinedocs/05-setup.md— Lokal einrichtendocs/06-hebel-analyse.md— Womit anfangen und warumdocs/07-mvp-plan.md— MVP „Clip-Knopf": Umfang, Scheiben, Zeitplandocs/handoff.md— Übergabe: Stand, Fallstricke, wo weitermachendocs/offene-punkte.md— was noch fehltdocs/obs-layout.md— die Layout-Vorgabe für OBSdocs/projects/— je ein Spec-Dokument pro Tooldocs/projects/discord-community.md— Aufbau des Community-Serversdocs/decisions/— Architekturentscheidungen (ADRs)
Auf dem Stream-PC installieren
Eine native Windows-Anwendung. Node, ffmpeg, whisper.cpp und die Schriften sind mitgeliefert — vorausgesetzt wird nur OBS. Kein Docker, kein WSL2, nichts zu übersetzen (ADR-0007).
Ein Befehl, ohne Administratorrechte. Programm und Daten landen im Benutzerprofil.
irm https://git.zeasy.dev/ZeasyAlex/abdulive/raw/branch/main/scripts/install.ps1 | iex
Kein Netz auf dem Stream-PC? Dann das Paket von der Releases-Seite laden,
entpacken und darin install.ps1 ausführen.
Der Installer lädt danach das Sprachmodell, läuft den Selbsttest, startet den Daemon und öffnet die Einrichtungsseite. Ein Befehl, und du bist da.
Dort die Twitch-Zugangsdaten eintragen. Sie werden verschlüsselt abgelegt, nicht in einer Datei im Projekt (ADR-0005).
Ausführlich: docs/05-setup.md.
Paket bauen und ausliefern
node scripts/build-package.ts --version 0.5.0
Lädt Node, ffmpeg und whisper.cpp bei ihren Herausgebern, packt alles nach
dist/ und schreibt abdulive.json — das Manifest, das der Updater auf
Abdus Rechner abfragt. Läuft auch in der CI unter Linux.
Auf dem Stream-PC sieht abdulive update täglich nach und legt eine neue
Fassung bereit; eingespielt wird sie beim nächsten Start, nie mitten im
Stream.
Aktueller Stand
Vier von sieben Scheiben des MVP „Clip-Knopf" sind gebaut: Toolchain,
Einrichtung im Browser, Twitch-Auth, Datenbank, Chat-Aufnahme, OBS-Anbindung mit
!clip, 9:16-Render und Untertitel. Dazu die native Auslieferung mit Installer
und Updater. 79 Tests grün.
Offen: die Abnahme der OBS-Anbindung an einem laufenden OBS, dann S5 — Onboarding-Assistent und Sichtungsseite.
Details: docs/handoff.md
Tests
node --test "packages/**/*.test.ts" "apps/**/*.test.ts"