Struktur, Doku und S0-Toolchain fuer das abdulive-Toolkit

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
This commit is contained in:
ZeasyAlexandClaude Opus 5 committed 2026-09-09 08:56:09 +02:00
commit d09e2b945a
98 files changed
+3273

No files matched your search

+95
View File
@@ -0,0 +1,95 @@
# Kopie als config/config.yaml anlegen. Secrets gehoeren in .env, nicht hierher.
channel:
login: abdulive_
userId: "" # wird beim ersten `pnpm auth` gefuellt
language: de
timezone: Europe/Berlin
bot:
login: abdulive_bot
ingest:
viewerPollSeconds: 60
chattersPollSeconds: 300
sessionGapMinutes: 5 # kuerzere Luecken gelten als derselbe Stream
spike:
windowSeconds: 15
baselineMinutes: 10
factor: 3
minDelta: 4
cooldownSeconds: 60
armed: false # erst nach Kalibrierung auf true
laughEmotes: [KEKW, LUL, OMEGALUL, PogChamp, Pog]
obs:
url: ws://127.0.0.1:4455
replayBufferSeconds: 90
chapterScenes: [Gameplay, "Just Chatting", Startbildschirm]
clipper:
enabled: true
source: obs-replay # obs-replay | twitch
alsoCreateTwitchClip: true
maxDurationSeconds: 60
renderWhileLive: false # true = sofort rendern, false = erst nach Streamende
whisper:
binary: whisper-cli # whisper.cpp, im Image enthalten
model: ggml-small.bin
language: de
threads: 4
ffmpeg:
preset: veryfast
crf: 20
encoder: libx264 # keine NVIDIA-GPU da, QSV aus WSL2 unzuverlaessig
niceness: 15 # Encoding laeuft nachrangig zum Stream
triggers:
chatCommand: "!clip"
hotkeyName: SaveReplay
onSpike: false
broadcaster:
enabled: true
mode: draft # draft | live
delaySecondsAfterOnline: 60
cooldownHours: 6
platforms:
discord: true
bluesky: true
mastodon: false
instagramStoryImage: true
community:
greetings:
enabled: true
minSecondsBetween: 20
maxPerStream: 10
returningAfterDays: 21
milestones: [5, 10, 25, 50, 100]
suppressWhileStreamerSpeaking: true
overlayHint: true
raidScout:
minViewers: 5
maxViewers: 30
minUptimeMinutes: 30
maxUptimeMinutes: 300
languages: [de]
topN: 5
recap:
enabled: true
delayMinutesAfterOffline: 10
minStreamMinutes: 20
hideViewerNumbersIfWeak: true
topChatters: 3
topClips: 2
loyalty:
enabled: false # spaetere Ausbaustufe
overlay:
port: 4791
dashboard:
port: 4792
ingestServer:
port: 4790
+44
View File
@@ -0,0 +1,44 @@
# Eingemessen am 2026-09-09 aus einem VOD-Screenshot (GTA 5, Szene "Gameplay").
# Alle Werte in Koordinaten des fertigen Streambildes 1920x1080.
#
# Nachmessen: docker compose run --rm toolkit calibrate
# Hintergrund: docs/projects/clip-shorts.md
source:
width: 1920
height: 1080
# Ziel: 9:16 fuer Shorts/Reels/TikTok
target:
width: 1080
height: 1920
profiles:
# Standardprofil: Facecam oben links, Chat-Overlay rechts eingebrannt
default:
description: >
Facecam bündig oben links (440x330, 4:3). Chat-Overlay ist ins Streambild
eingebrannt und beginnt bei x=1270 - der Gameplay-Ausschnitt endet
deshalb bei x=1268. Minimap (x<360) und Handy-Overlay (x>1540) liegen
ausserhalb und fallen automatisch weg.
cam:
# Facecam im Streambild: x 0..440, y 0..330
# Davon wird ein Streifen genommen, der zum Zielband passt - NICHT
# verzerrt. 4:3 auf 16:9 zu strecken wuerde das Gesicht breit ziehen.
crop: { x: 0, y: 100, w: 440, h: 208 }
band: { w: 1080, h: 512 }
game:
# Sauberes Band zwischen Facecam (endet 440) und Chat (beginnt 1270)
crop: { x: 440, y: 0, w: 828, h: 1080 }
band: { w: 1080, h: 1408 }
# 512 + 1408 = 1920
# Messwerte aus dem Referenzbild, zur Nachvollziehbarkeit:
# Videobereich im Screenshot : x 0..1916, y 60..1137 (1917x1078)
# Facecam rechte Kante : x 439 (konstant bei y=120/200/280/360)
# Facecam untere Kante : y 391 (konstant bei x=40/140/240/340/420)
# Chat-Overlay beginnt : x 1268
# Gesicht (Cam-lokal) : y 126..300, Mitte ~213