SpeakChatBot
Eleven million chat messages a month, read aloud
A real-time TTS platform for Twitch, YouTube, and Kick — run solo since 2016 (11M chat msgs/mo at peak) — now a domain-driven TypeScript rewrite with capability-based RBAC, a plugin marketplace, and ~5,000 automated tests. The modern continuation of the CHI-cited TranscriberBot.
- TypeScript
- Node.js
- Express
- WebSocket
- React 19
- Vite
- MySQL 8
- Atlas
- Vitest
- Playwright
- Docker
- Caddy
- AWS (Polly · S3)
- ElevenLabs
- Google TTS
SpeakChatBot reads a stream's chat aloud and automates moderation, alerts, and TTS in real time — a platform I've run as founder and sole engineer since 2016, and the modern continuation of the CHI-2019-cited TranscriberBot. At its peak it pushed 11 million chat messages a month.
It's now a ground-up TypeScript rewrite. The backend is domain-driven — 28 bounded modules under src/domains with the boundaries enforced in lint — with capability-based RBAC and impersonation auditing, a typed WebSocket protocol, MySQL under Atlas versioned migrations, and a publishable plugin SDK + marketplace so new chat sources (Twitch IRC, YouTube, Kick) and transformers drop in behind a stable contract.
Two React 19 surfaces sit in front: a streamer dashboard — a Vite MPA that keeps the admin bundle physically separate from the user bundle, verified by a post-build audit — and a marketing site. Holding it together: roughly 5,000 automated tests (Vitest unit/integration + Playwright e2e, V8 coverage) and a GitHub Actions release pipeline with promote, canary, and smoke stages.
- Ground-up TypeScript rewrite — 28 lint-enforced domains, ~1,000 TS files, no JS left in the runtime
- ~5,000 automated tests: Vitest unit/integration + Playwright e2e with V8 coverage
- Capability-based RBAC with impersonation auditing, a typed WebSocket protocol, and an OpenAPI public API + webhooks
- Plugin SDK + marketplace (Twitch · YouTube · Kick sources); Atlas-migrated MySQL; Docker + Caddy; promote/canary/smoke releases