Source for toolset.deutschmark.online — an open-source pack of OBS browser-source overlays and companion apps for Twitch streamers. One login via the auth worker at auth.deutschmark.online, no subscriptions, config hot-swaps to the live browser source over a Durable Object websocket fanout.
This repo is a transparency mirror — the README, license, and source under apps/toolset/ are public. The canonical build source lives in the private monorepo at thedeutschmark/deutschmark.online.
Streamer-facing docs (audio normalization, IRC vs EventSub, hot-swap overlay config, per-tool tutorials) live at toolset.deutschmark.online/docs. Long-form engineering notes are at thedeutschmark/engineering-notes.
Add these as Browser Sources in OBS. Recommended dimensions are surfaced on each tool's catalog card.
| Tool | What it does |
|---|---|
| Music Player | Spotify now-playing widget with !sr chat song requests, wired across phone, desktop, and Spotify Connect speakers. |
| Chat Box | Twitch chat on stream — real badges, Twitch + BTTV + FFZ + 7TV emotes, bot lines filtered. |
| BRB Player | Auto-rotating clip player for break scenes. Per-clip EBU R128 normalization so quiet and loud clips land at the same level. |
| Clip Play | Lets chat send YouTube, Twitch, and Streamable clips to the stream. Moderated, queued, length-capped, audio-normalized. |
| Video Shout-out | !vso @name pulls a clip from that channel and plays it on overlay with a lower-third card. |
| Emote Rain | Cascade of Twitch + BTTV + FFZ + 7TV emotes — start on command, stop on the next. |
| Lurk Peek | When a chatter types !lurk, their avatar slides in from a random edge, waves, and slides back out. |
| Death Counter | On-stream counter, tracked separately per game. Mod-bumpable from chat. |
| Timer | Server-backed countdown for breaks, splits, and subathons. Survives OBS restarts and overlay reconnects. |
| Event List | Recent subs, resubs, gift bombs, cheers, and raids in a themed live list. |
| Task List (alpha) | Per-viewer task columns driven from chat — !task, !done, !focus. Donor early access. |
| Stream Scene (alpha) | Web-based Starting Soon and Stream Ending screens with generated planets, chat, and brand color baked in. |
Standalone apps that run alongside the stream. Each ships from its own repo; the toolset dashboard hosts the download landing page and stores their settings.
| App | What it does | Repo |
|---|---|---|
| Collab Planner | Pulls broadcast history from the Twitch Helix API, detects past collabs via multi-signal confidence ranking, and suggests overlap windows so cross-channel collabs skip calendar-tetris. Live at collab.deutschmark.online. | — |
| ForgetMeNot | A Twitch chat bot that actually remembers your regulars — names, inside jokes, the dumb thing someone said three weeks ago. Stored locally on your machine; replies via your own Gemini or OpenAI key. Single Windows .exe, no shared backend, nothing leaves your computer. | forgetmenot |
| Clipline | Desktop app that turns livestream VOD moments into shortform clips. Pulls Twitch VODs, in-stream markers, and clip metadata; batch-renders with preset crops; transcribes via faster-whisper (optional speaker diarization via pyannote). Exports burn-in captions or sidecar ASS/SRT. | clipline |
| Alert! Alert! | Desktop app for creating stream-alert assets from video. Loads remote URLs from YouTube / Instagram / TikTok (or a local file), trims, crops, zooms, applies aspect-ratio presets, separates and normalizes audio, exports OBS-ready. Python + Flask + PySide6 + FFmpeg + yt-dlp. | alert-alert |
Authentication is Twitch OAuth handled by a Cloudflare Worker at auth.deutschmark.online. The worker sets an httpOnly SSO cookie scoped to .deutschmark.online. All API calls go to the same worker with the cookie attached via credentials: "include". Mutating requests include a CSRF token read from a dm_csrf cookie and forwarded as X-CSRF-Token.
The Spotify integration runs in a separate Cloudflare Worker. Per-user developer credentials are stored AES-GCM encrypted in Cloudflare KV. Neither worker is in this repo.
No tokens or user IDs appear in query parameters. Widget embed URLs use opaque read-only tokens (?wid=<token>). OAuth state is mandatory and PKCE is used for Spotify.
Today the toolset is Twitch-only — chat ingest is tmi.js (IRC), event ingest is Twitch EventSub. Kick and YouTube Live support is on the roadmap as a Phase 1 surface migration; the dashboard already gates platform-specific UI behind a per-tool supportedPlatforms array so unsupported platforms render as "coming soon" instead of broken commands.
| Variable | Default | Purpose |
|---|---|---|
NEXT_PUBLIC_TOOLSET_AUTH_URL |
https://auth.deutschmark.online |
Auth and API worker base URL |
NEXT_PUBLIC_WIDGET_HOST_URL |
https://toolset.deutschmark.online |
Base URL for browser-source links |
Both are public — no secrets are required to build or run this frontend.
npm install
npm run devThe app connects to the live auth worker by default. To point at a local worker, set NEXT_PUBLIC_TOOLSET_AUTH_URL in .env.local.
npm run buildOutputs a static export to out/. Compatible with Cloudflare Pages or any static host.
- Next.js 16 (
output: "export") - React 19
- Tailwind CSS v4
- TypeScript
- Cloudflare Workers · KV · Durable Objects (auth, widget config fanout)
- Twitch IRC (tmi.js) · EventSub · Helix
- Spotify Web API
MIT — see LICENSE.