Wann ist ein Stream ein *neuer* Stream? Die Entscheidung stand doppelt in Hub und Ingest und war ungetestet - dabei haengt genau an ihr, ob der Go-Live-Ping zum richtigen Zeitpunkt und nur einmal rausgeht. Jetzt rein in stream-state.ts, mit zehn Tests. Darunter die Faelle, die im Betrieb selten sind und dann mitten im Stream zuschlagen: - Neue Twitch-ID nach kurzem Aussetzer ist eine Fortsetzung, kein zweiter Ping. Twitch vergibt bei einem Verbindungsabbruch eine neue ID. - Eine einzelne leere Antwort beendet den Stream nicht. Wer daraufhin die Sitzung schliesst, hat beim naechsten Abruf einen "neuen" Stream. - Ein Durchlauf ueber 90 Minuten mit zwei Aussetzern, im Minutentakt abgefragt, ergibt genau einen Start und genau ein Ende. Dazu App-Token fuer Helix: `GET /users` und `GET /streams` kommen ohne Nutzer-Token aus. Das ist der Unterschied zwischen "laeuft" und "wartet auf einen Klick" - ohne diese Unterscheidung stand der ganze Dienst still, bis der Broadcaster sein Konto verbindet. Endpunkte, die etwas tun oder Privates lesen, verlangen weiterhin ein Nutzer-Token, und `appOk` sagt je Aufruf, was gilt. 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"