๐ŸŽจ Stream Overlays

StreamElements-Style Overlay System. Canvas Editor, Alert Designer, Widget Builder โ€” alles self-hosted.

๐Ÿ’ก Konzept

Wie StreamElements, aber self-hosted + tief integriert mit Workflow Engine

Was ist ein Overlay?

Eine transparente Webseite die in OBS als Browser Source geladen wird. Zeigt Alerts, Widgets, Branding โ€” alles was der Zuschauer im Stream sieht (auรŸer dem Spiel). Jedes Overlay hat eine eigene URL mit Token-Auth.

Warum self-hosted?

StreamElements/StreamLabs: Cloud-hosted, Daten bei Dritten, Features kosten Geld, kein Custom Code. Unser System: Volle Kontrolle, direkte Integration mit Discord/Twitch Bots + Workflow Engine + Donation System.

๐Ÿ”ด V3 Probleme

Zwei halbe Systeme, beide unfertig

Zwei Overlay-Systeme

Altes SSE-basiertes alert.html + neues Canvas-basiertes React-System. Beide aktiv, beide unfertig. Routes redirecten von alt zu neu โ€” chaotische Migration.

Media Library unfertig

OverlayMedia Tabelle existiert, Upload-Handler initialisiert aber nie aufgerufen. Kein Image Picker im Canvas Editor. UploadThing nur halb integriert.

XSS-Risiko

Custom CSS/HTML wird mit dangerouslySetInnerHTML injiziert. Template-Variablen ({user}, {message}) nicht escaped. User-Input direkt im DOM.

Kein Live-Edit Sync

Widget-ร„nderungen im Editor werden nicht live zum OBS-Overlay gepusht. Man muss die Browser Source in OBS refreshen um ร„nderungen zu sehen.

Viewer Count Widget = 0

Hardcoded auf 0 im Renderer. Kein Twitch API Feed angebunden. Andere Widgets auch nur halb funktional.

Keine Vorlagen/Templates

Kein Template-System fรผr Overlay-Designs. Jedes Overlay von Null erstellt. Kein Import/Export.

๐ŸŸข V4 Architektur

Ein System, sauber durchdacht

Twitch/Discord
Event (Follow, Sub...)
โ†’
Workflow Engine
Condition Check
โ†’
Action: Show Alert
Payload โ†’ Redis
โ†’
WS Events
Push to Overlay
โ†’
OBS Browser Source
Shows Alert

WebSocket Only

Kein SSE mehr. Alles รผber WebSocket: Alert Events, Live-Edit Sync, Widget State Updates. Ein Kanal, ein Protokoll.

Live-Edit โ†’ OBS

Widget im Editor verschieben โ†’ sofort sichtbar in OBS. Canvas-State wird per WebSocket gesynced. Kein Browser Source Refresh nรถtig.

Workflow-Driven Alerts

Alerts werden NICHT direkt vom Bot getriggert sondern รผber die Workflow Engine. Dort: Conditions, Delays, Custom Logic. Maximale Flexibilitรคt.

๐Ÿ–ฅ Canvas Editor โ€” Mockup

Drag'n'Drop Widget-Platzierung auf 1920ร—1080 Canvas

My Stream Overlay | ๐Ÿ–ฑ Select ๐Ÿ“ Text ๐Ÿ–ผ Image ๐Ÿ“Š Goal Bar ๐Ÿ’ฌ Chat ๐Ÿ”” Alert Box โฑ Timer ๐Ÿ‘ Viewers ๐Ÿงฉ Custom โ–ถ Preview ๐Ÿ”— Copy URL
Layers
๐Ÿ”” Alert Box
๐Ÿ’ฌ Chat Box
๐Ÿ“Š Sub Goal
๐Ÿ“ Stream Title
๐Ÿ‘ Viewer Count
๐Ÿ–ผ Logo (hidden)
๐Ÿ”” Alert Box
400ร—200
๐Ÿ’ฌ Chat
Sub Goal: 65/100
๐Ÿ‘ 234 Viewers
โฑ 02:34:12
Properties โ€” Alert Box
Position
Size
Animation In
Animation Out
Duration
Alert Queue
๐Ÿ”” Alert Designer

Pro Event-Type mehrere Varianten basierend auf Schwellwerten

๐Ÿ‘ค New Follower

1 Variante ยท bounceIn ยท 4s

โญ Subscription

3 Varianten (Tier 1/2/3) + Resub

๐ŸŽ Gift Sub

2 Varianten (1-5 / 5+ Gifts)

๐Ÿ’Ž Bits / Cheer

4 Varianten (1-99 / 100-999 / 1K+ / 5K+)

โš”๏ธ Raid

3 Varianten (<10 / 10-50 / 50+ Viewer)

๐Ÿ’ Donation

4 Varianten (<5โ‚ฌ / 5-20โ‚ฌ / 20-50โ‚ฌ / 50โ‚ฌ+)

๐Ÿ† Channel Points

Pro Reward konfigurierbar

๐Ÿงฉ Custom Event

Workflow Engine Trigger

Preview โ€” Bits Alert (Tier: 1000+)
๐Ÿ’Ž
1,500 Bits!
DankDonator: "GG das war nice!"
Alert Varianten (Conditions):
Bits 1-99: kleines Bild + kurzer Sound ยท 3s
Bits 100-999: mittleres Bild + Sound ยท 5s
Bits 1000-4999: groรŸes Bild + Sound + TTS ยท 8s
Bits 5000+: Video + Explosion + TTS ยท 12s
Template Variables:
{user} Username ยท {amount} Betrag ยท {message} Nachricht ยท {tier} Sub Tier ยท {months} Monate ยท {viewers} Raid Viewer ยท {total} Gesamt-Betrag
๐Ÿ† Subathon System

Countdown Timer der bei Events Zeit dazu bekommt

โฑ Subathon Timer Widget

Countdown der durch Events verlรคngert wird. State persistent in DB โ€” รผberlebt OBS Restart. Start/Stop per Admin Panel, Chat Command oder Workflow Action.

Sub Tier 1: +2 Minuten
Sub Tier 2: +5 Minuten
Sub Tier 3: +10 Minuten
100 Bits: +1 Minute
1โ‚ฌ Donation: +1 Minute
Gift Sub: +3 Minuten pro Gift
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
Optional Cap: Max. 48h Gesamtzeit
Must Have

๐ŸŽฎ Steuerung

  • !subathon start 2h โ€” Start mit 2h Countdown
  • !subathon pause / !subathon resume
  • !subathon add 10m โ€” Manuell Zeit hinzufรผgen
  • !subathon end โ€” Sofort beenden
  • Admin Panel: Start/Pause/Resume/End Buttons
  • StreamDeck: One-Touch Start/Stop
  • Workflow Action: Automatischer Start bei Stream Online

๐Ÿ“Š Stats nach Subathon

  • Gesamtzeit gestreamt
  • Zeit hinzugefรผgt (pro Event-Type)
  • Anzahl Subs/Bits/Donations
  • Top Contributors
  • Zeitverlauf Graph
๐Ÿงฉ Widget Types (16)

๐Ÿ“ Text

Statischer oder dynamischer Text. Kann Variablen enthalten: {subCount}, {game}, {title}, {viewers}. Font, GrรถรŸe, Farbe, Schatten.

Must Have

๐Ÿ–ผ Image

Bilder, GIFs, Logos. Aus Media Library oder URL. Contain/Cover Fit, Opacity, Border Radius, Animation.

Must Have

๐ŸŽฌ Video

Video Clips. Loop, Mute, Autoplay. Stinger Transitions, Animated Backgrounds.

Should Have

๐Ÿ”” Alert Box

Event-Alerts mit Tier-Conditions. Unterschiedliches Bild/Sound/Video je nach Betrag. Queue: Sequential/Stack/Replace.

Must Have

๐Ÿ’ฌ Chat Box

Live Twitch Chat. Badges, Emotes (BTTV/FFZ/7TV), Max Messages, Fade-Out.

Must Have

๐Ÿ“Š Goal Widget

Flexibel: Bar, Circle, Thermometer, oder Text Only ({current} / {target}). Datenquelle: Sub Count, Follower, Donations, Bits, oder Custom Value (API/Workflow setzbar).

Must Have

๐Ÿ‘ Viewer Count

Live Viewer Anzahl. Twitch API Feed. Als Text-Variable auch in anderen Widgets nutzbar.

Should Have

โฑ Timer Widget

5 Modi: Uptime, Countdown, Subathon (Zeit-Adds), Stopwatch, Event Counter. Steuerbar per Panel, Chat, StreamDeck, Workflow.

Must Have

๐Ÿ† Leaderboard

Top Donators, Cheerers, Gifters. Zeitraum: Stream/Woche/Monat/All-Time.

Should Have

๐Ÿ“บ Media Player

Audio/Video abspielen via Workflow Action. Sound Alerts, Video Reactions, Meme Sounds.

Should Have

๐ŸŽฐ Wheel / Random

Glรผcksrad, Random Pick. Fรผr Giveaways, Viewer-Games. Trigger per Chat oder Workflow.

Could Have

๐Ÿ˜‚ Emote Wall

Emotes fliegen / regnen รผber den Screen wenn Chat sie spammt. Threshold konfigurierbar. BTTV/FFZ/7TV Support.

Should Have

๐ŸŽต Now Playing

Aktueller Song (Spotify Integration). Cover Art, Artist, Title. Auto-Hide wenn nichts spielt.

Should Have

๐Ÿ“œ Ticker / Marquee

Scrollender Text. Fรผr Ankรผndigungen, Social Links, Sponsoren. Geschwindigkeit + Richtung konfigurierbar.

Should Have

๐Ÿงฉ Custom HTML

Beliebiges HTML/CSS/JS. Sandbox fรผr Sicherheit. Fรผr alles was kein Standard-Widget abdeckt.

Must Have

๐Ÿ’ก Text-Variablen รผberall nutzbar

Jedes Text-Widget kann dynamische Variablen verwenden. Beispiel fรผr ein Goal Display ohne Bar:

Template: {subCount} / 1154 Subs
Ergebnis: 847 / 1154 Subs
Verfรผgbare Variablen: {subCount} {followerCount} {viewers} {game} {title} {uptime} {donationTotal} {bitTotal} {lastFollower} {lastSub} {topDonator} {customVar:name}
โฑ Timer Modi

Ein Timer Widget, 5 verschiedene Modi

โฌ†๏ธ Uptime

Zรคhlt hoch seit Stream Start. Automatisch. Format: hh:mm:ss

โฌ‡๏ธ Countdown

Zรคhlt runter auf 0. Fรผr Events, Pausen, Giveaway-Timer. Trigger bei 0: Workflow Action.

๐Ÿ† Subathon

Countdown + automatische Zeit-Adds bei Subs/Bits/Donations. Persistent in DB. Cap optional.

โฑ Stopwatch

Manuell Start/Stop. Fรผr Speedruns, Challenges. Per Chat, Panel oder StreamDeck steuerbar.

๐Ÿ”ข Event Counter

Zeigt Zahl statt Zeit. Deaths, Wins, Custom Counter. Increment per Chat Command oder Event.

๐ŸŽฎ Steuerung

Alle Modi steuerbar per:
โ€ข Admin Panel Buttons
โ€ข Chat Commands (!timer)
โ€ข StreamDeck Plugin
โ€ข Workflow Actions

โš–๏ธ Vergleich mit StreamElements
FeatureStreamElementsCodenull V4
Canvas Editorโœ“ Drag'n'Dropโœ“ Drag'n'Drop (React DnD)
Alert Designerโœ“ Per Event Typeโœ“ Per Event Type + Workflow Conditions
Widget Libraryโœ“ 30+ Widgetsโœ“ 12 Widgets + Custom HTML
Live-Edit Syncโœ“ Cloud Syncโœ“ WebSocket Sync (instant)
Custom Codeโš ๏ธ Limitedโœ“ Full HTML/CSS/JS (sandboxed)
Templatesโœ“ Community Storeโœ“ Import/Export JSON + Presets
Media Hostingโœ“ SE CDNโœ“ Self-hosted + UploadThing
TTSโœ“ Google/Amazon TTSโœ“ Web Speech API + Browser TTS
Automationโš ๏ธ Basic Rulesโœ“ Full Workflow Engine (Drag'n'Drop)
Donation Integrationโœ“ SE Tipsโœ“ Own Donation System (Stripe/PayPal)
Self-Hostedโœ— Cloud Onlyโœ“ 100% Self-Hosted
Data Ownershipโœ— SE owns dataโœ“ Deine Daten
๐Ÿ—„ Datenmodell (V4)
overlayCanvas id text PK userId text FK โ†’ user name text // "Main Stream Overlay" width integer // default 1920 height integer // default 1080 token text unique // URL token for OBS browser source isActive boolean backgroundColor text // transparent default overlayWidget id text PK canvasId text FK โ†’ overlayCanvas type enum // TEXT, IMAGE, VIDEO, ALERT_BOX, CHAT, GOAL, VIEWER, TIMER, LEADERBOARD, MEDIA, WHEEL, CUSTOM name text // "Follow Alert" x y width height integer rotation integer // degrees zIndex integer isVisible boolean isLocked boolean settings jsonb // type-specific settings customCss text? overlayAlert id text PK canvasId text FK โ†’ overlayCanvas eventType text // "channel.follow", "channel.subscribe", "donation", ... isEnabled boolean imageUrl text? soundUrl text? videoUrl text? duration integer // ms animationIn text // bounceIn, fadeIn, slideInLeft, ... animationOut text messageTemplate text // "{user} ist jetzt Follower!" titleTemplate text // "New Follower!" style jsonb // { fontSize, fontFamily, textColor, textShadow, ... } soundVolume integer // 0-100 ttsEnabled boolean conditions jsonb? // min amount, specific user, etc overlayMedia id text PK userId text FK โ†’ user type enum // IMAGE, GIF, AUDIO, VIDEO name text url text // CDN URL fileSize integer mimeType text thumbnailUrl text? tags text[]
โœ… Entscheidungen

Geklรคrt am 2026-03-18

1. Media Storage: Egal

Flexibel halten โ€” UploadThing fรผr schnellen Start, Self-hosted als Option spรคter. Abstraction Layer damit beides geht.

2. TTS: Browser Web Speech API

Gratis, keine Drittanbieter-Abhรคngigkeit. Qualitรคt reicht fรผr Stream-Alerts. Lรคuft direkt im OBS Browser Source.

3. Import/Export: Ja, kein Community

Overlays als JSON exportieren/importieren. Kein Community-Marktplatz โ€” nur lokaler Import/Export fรผr Backup und Sharing.

4. Single Canvas

Ein primรคres Overlay in dem alles platziert wird. Widgets kรถnnen per Workflow oder manuell getoggelt werden (show/hide). Kein Multi-Canvas nรถtig.

5. Custom HTML: iframe Sandbox

<iframe sandbox="allow-scripts"> isoliert Custom Code. Kommunikation รผber postMessage fรผr Variablen-Updates. Browser macht die Isolation.

6. Alert Queue: Ja, immer

Alle Alerts laufen durch eine Queue โ€” einer nach dem anderen. Kein รœberlappen von Sounds/Animationen. Verhindert Chaos bei vielen Events gleichzeitig.

๐Ÿ“‹ OBS Event Dock

Live Event-รœbersicht als OBS Custom Dock (Browser Panel via SSE)

Was ist das?

Ein OBS Custom Browser Dock (nicht Browser Source!) das in OBS als Panel angedockt wird. Zeigt eine Live-Liste aller eingehenden Events: Follows, Subs, Bits, Donations, Raids. Wie das "Recent Events" Panel in StreamElements.

  • SSE Stream fรผr Echtzeit-Updates (leichtgewichtig)
  • Event-Typ Filter (nur Subs zeigen, nur Donations, etc)
  • Quick Actions: Event erneut triggern (Alert replay), User bannen, etc
  • Session-basiert: zeigt nur Events seit Stream-Start
  • URL: https://codenull.de/obs/events?token=xxx

Mockup

Recent Events Filter โ–พ
โ— Follow NewViewer123 2s ago
โ— Sub T1 xXGamerXx ยท 6mo 15s ago
โ— 500 Bits DankDonator ยท "GG!" 1m ago
โ— Raid FriendlyStreamer ยท 87 3m ago
โ— Donation BigFan ยท 10โ‚ฌ 5m ago
Codenull Platform ยท Stream Overlay System Planning ยท 2026-03-18