A control center for streamers. Unified chat, live statistics, an AI-free clip finder and OBS control — all in one local-first desktop app.
Free · Open source · No servers of your own · No paid AI
Streamers today juggle four or five tools: separate chat windows per platform, a stats dashboard, a clip tool, an OBS panel. StreamHub centralizes all of it into a single desktop app that is local-first — it talks directly to the Twitch / YouTube / Kick APIs over OAuth and keeps all history and settings in a local SQLite database. There is nothing for you to host, and there is no AI budget to burn.
- Unified chat — merge Twitch, YouTube and Kick chat into one window, with per-platform filters, search and the ability to reply from inside the app.
- Live & historical stats — real-time viewers, follows gained, messages per minute, emote ratio and evolution graphs during a stream, plus comparative history stored locally across past streams.
- AI-free Clip Finder — a deterministic weighted formula
(
chat speed × viewer spikes × emote/event usage) scores every moment and flags the ones most likely to become clips. No model, no cloud, fully transparent and tunable in Settings. - OBS integration — connects over the OBS WebSocket protocol, cross-checks recording/live state against activity spikes, and exports clips trimmed to 16:9, 9:16 (TikTok/Shorts) or 1:1.
- Plugin-based design — every platform (Twitch, YouTube, Kick, OBS,
Discord) is an independent module in
integrations/. Adding a new platform never touches the rest of the project.
The app ships with a Simulated stream demo that generates realistic chat, viewers and spikes locally — so you can evaluate the entire product with zero accounts, zero tokens and zero network access.
| Concern | Choice |
|---|---|
| Desktop shell | Electron (via electron-vite) |
| UI | React + TypeScript |
| Local storage | sql.js (SQLite compiled to WebAssembly — no native build step) |
| IPC | Typed, allow-listed RPC over ipcRenderer/ipcMain |
| OBS | obs-websocket-js (protocol v5) |
| Tests | Vitest |
| Packaging | electron-builder |
The same SQLite engine (sql.js) runs on Windows, macOS, Linux, the packaged
app and the test runner, so local persistence behaves identically
everywhere with zero compilation.
Ready-to-run single-file builds are attached to every GitHub Release. Pick the file for your OS, open it, and you're live — no installer, no Node.js, no terminal commands:
| OS | File | How to run |
|---|---|---|
| Windows | StreamHub-<version>-win-x64.exe |
Download and double-click. Portable — nothing to install. |
| macOS | StreamHub-<version>-mac-arm64.dmg / mac-x64.dmg |
Open the DMG, drag StreamHub into Applications (or right-click → Open once, because the app is unsigned). |
| macOS | StreamHub-<version>-mac-arm64.zip / mac-x64.zip |
Download, unzip, open StreamHub directly. |
| Linux | StreamHub-<version>-linux-x86_64.AppImage |
chmod +x once, then double-click. Works on any distro without installing. |
| Linux | StreamHub-<version>-linux-amd64.deb |
sudo apt install ./StreamHub-*.deb (optional, for Debian/Ubuntu). |
Your chat history and settings stay local-first in a local SQLite
database, and the Simulated stream demo runs with zero accounts and zero
network — so you can try the entire product in seconds. Connecting to real
Twitch / YouTube / Kick and OBS uses the standard desktop flows and happens
directly from your machine (the CI builds these files automatically on every
tag push — see .github/workflows/release.yml).
Requires Node.js ≥ 22 and npm.
# install dependencies
npm install
# run the app in development (hot reload)
npm run dev
# one-off commands
npm run typecheck # strict TypeScript
npm test # unit tests (Vitest)
npm run build # compile main + preload + renderer
npm run package # unpackaged build for your OS (development)
npm run package:win # Windows: single-file portable .exe (no installer)
npm run package:mac # macOS: .dmg + .zip
npm run package:linux # Linux: .AppImage + .debWhen the app opens, it auto-connects the Simulated stream demo so you can see chat, statistics and the Clip Finder working within seconds. Open Integrations to connect a real platform or OBS, or just watch it go.
src/
shared/ Domain types + dependency-free helpers (imported everywhere)
main/ Electron main process
core/ Event bus, Settings, SQLite Database
services/ ChatHub, StatsEngine, ClipFinder, ClipExporter,
IntegrationRegistry, AppRunner, typed IPC
types/ Local type declarations (sql.js, import.meta.glob)
preload/ Thin, allow-listed IPC bridge exposed to the renderer
renderer/ React UI (App + Dashboard/Chat/Stats/Clips/Integrations/Settings)
integrations/
twitch/ OAuth (PKCE) + Helix live status & viewers
youtube/ OAuth + Data API live status, viewers, best-effort chat poll
kick/ Public v2 API live status & viewers
obs/ OBS WebSocket v5 recording/live state
discord/ Roadmap stub (rich presence + chat bridge)
simulated/ Offline demo with synthetic chat, viewers and spikes
tests/ Vitest suite for the clip formula, stats, chat and database
docs/ Architecture, roadmap, contributing & privacy guides
Every platform is a self-contained plugin. The plugin contract lives in
src/shared/integration.ts; implementations live under integrations/<name>/
and are discovered automatically (see docs/developing-integrations.md).
Current v0.1 is a fully functional local core: unified chat aggregation,
live/historical stats, the AI-free clip scorer, OBS state detection, SQLite
history and a complete, scriptable demo. Real-time live chat ingestion and
replies (Twitch IRC/EventSub, YouTube interactive chat, Kick WebSocket),
exporting trimmed media from an OBS recording, and the Discord presence bridge
are planned next — tracked in docs/roadmap.md.
Contributions are very welcome, especially new platform integrations. Read
CONTRIBUTING.md first, then
docs/developing-integrations.md — the
Discord stub and the Simulated demo are great templates to copy.
- All history, settings and OAuth tokens live in a local SQLite database under your OS user-data directory. Nothing is uploaded.
- Platform auth uses OAuth (tokens, not passwords). Secrets are stored locally and never sent anywhere.
- See
docs/data-and-privacy.mdfor details and an explicit list of the network calls the app makes.
MIT © StreamHub contributors.