Monorepo-Geruest fuer neun Streamer-Tools plus den Ingest-Daemon, der unter sechs davon liegt. Enthaelt: - docs/: Ueberblick, Architektur, Twitch-Integration, Datenmodell, Roadmap, Setup, Hebel-Analyse und den MVP-Plan "Clip-Knopf" - docs/projects/: je eine Spezifikation pro Tool - docs/decisions/: vier ADRs (TS-Monorepo, SQLite, EventSub/IRC, Docker) - docker/: Image mit ffmpeg und whisper.cpp, abhaengigkeitsfreier Entrypoint mit check-env, fetch-model und calibrate - config/layout.yaml: aus einem VOD-Screenshot eingemessener Facecam-Ausschnitt (440x330 oben links, Chat-Overlay ab x=1270) Noch kein Anwendungscode - Scheibe S0 aus docs/07-mvp-plan.md. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013VTGjd92LsDDWF3frd9FTB
1.4 KiB
1.4 KiB
ADR-0002: SQLite statt Postgres
Status: akzeptiert · Datum: 2026-09-09
Kontext
Mehrere Prozesse schreiben und lesen dieselben Daten. Datenvolumen: bei ~10 Zuschauern und 4 Streams pro Woche etwa 20.000 Chat-Nachrichten und 15.000 Viewer-Samples pro Monat — wenige MB.
Entscheidung
SQLite (better-sqlite3) im WAL-Modus, eine Datei unter data/db/.
Begründung
- Kein Server, kein Docker, kein Zustand außerhalb einer Datei. Backup ist ein
Dateikopie-Vorgang (
VACUUM INTO). - WAL erlaubt beliebig viele gleichzeitige Leser neben einem Schreiber. Genau unsere Topologie: Der Ingest schreibt, alle anderen lesen.
better-sqlite3ist synchron, was den Code im Ingest erheblich vereinfacht — keine Race Conditions zwischen Event-Verarbeitung und Schreibvorgang.- Die Datenmenge ist um Größenordnungen von SQLites Grenzen entfernt.
Konsequenzen
- Nur ein schreibender Prozess. Der Ingest ist der einzige Schreiber für
events,chat_messages,viewer_samples,streams,user_streams. Andere Apps schreiben ausschließlich in ihre eigenen Tabellen (clips,posts,redemptions,raids). Diese Aufteilung ist verbindlich. - Schreibende Zugriffe immer in Transaktionen bündeln,
busy_timeoutauf 5000 ms. - Migration auf Postgres wäre nötig, wenn das Dashboard je remote laufen soll.
Steht nicht an; die Repository-Schicht in
packages/dbkapselt SQL genug, dass es machbar bliebe.