One overlay. Every platform.
Merge chat from Twitch, YouTube, Kick, TikTok, and Discord into a single feed for OBS — with full 7TV, BTTV, and FFZ emote support.
Try it free at allch.at · Discord · Report a Bug
All-Chat is a free, open-source chat overlay that merges Twitch, YouTube, Kick, TikTok, and Discord into a single feed for OBS. Sign in, drop a URL into a Browser Source, go live.
No bots. No IRC tokens. No complicated setup.
- 5 Platforms, One Feed — Twitch, YouTube, Kick, TikTok, and Discord messages in a single overlay
- No Setup Required — Sign in, create an overlay, paste the URL into OBS. That's it.
- Every Emote Works — 7TV, BTTV, FFZ, plus native Twitch and YouTube emotes all render correctly
- 16 Themes + Full CSS — Built-in themes from Win98 retro to cyberpunk neon, or write your own CSS
- Real-Time Delivery — Messages arrive via WebSocket — no 5-second delay
- Smart Polling — Listeners only run when your overlay is actually visible (see How it works)
- Browser Extension — Replace native site chat with All-Chat on Twitch, YouTube, and Kick
- Open Source — AGPL 3.0 licensed, fully self-hostable
- Visit allch.at and sign in with Twitch
- Create a new overlay
- Add chat sources — Twitch channels, YouTube streams, Kick channels, etc.
- Tweak display settings (font, message duration, animations)
- In OBS, add a Browser Source
- Set the URL to
https://allch.at/overlay/YOUR_OVERLAY_ID - Set dimensions to something sensible for a chat panel — e.g. 400 × 800 (adjust to taste)
- Optional: Check "Shutdown source when not visible" — this tells All-Chat nobody is watching, so the backend stops polling platforms until you make the source visible again. Great for saving resources when you switch scenes.
- Done!
Tip: The overlay has a transparent background by default, so it layers cleanly over your stream.
The OBS overlay is built for compositing on stream, not for reading. For a readable, dashboard-style view of everything happening in an overlay, open:
https://allch.at/overlay/YOUR_OVERLAY_ID/view
A Twitch-dashboard-inspired monitor with a resizable live Chat panel + Activity feed, per-platform connection indicators, a config summary, and its own light/dark mode. Scrolling up pauses the chat feed on what you're reading (a pill shows how many new messages are waiting), and clicking a username filters chat to that person: a 1:1 conversation view that keeps up even when chat is flying by. It ignores the overlay's themes and animations — purely for observability — and even keeps moderated messages visible (struck-through) with a moderation log. No login required; it reuses the same public overlay link.
You can also open it from your overlay's settings page (or its preview page) via the Monitor View button.
Your moderators can use it too. Under Moderators in the overlay editor you can invite the
people who already moderate for you (Premium). You get a private link to send them; they accept it
with their own All-Chat account, and every channel handed to them shows up under Channels you
moderate (/moderate). They act with their own platform accounts, so Twitch, Kick and YouTube
re-check their moderator role on every single action and it lands in your native mod log under their
name — never yours — and they never need a plan of their own. Connecting an account is deferred until
the first time they moderate on it, and one connection covers every streamer who delegated that
platform to them. All four platforms are live, with each platform's own limits: everything on Twitch,
Kick and Discord, and timeout plus ban on YouTube (YouTube's API offers no way to delete a single
message or lift a ban from here).
Discord works a little differently, because Discord has no per-user moderation API: the All-Chat bot does the actual deleting and banning, so before it acts for someone it checks that they could do it themselves. Both of you link your Discord account once (Settings → Discord, and Channels you moderate for them), and from then on a moderator can only do what their own Discord roles allow — never more than the bot was invited with, and never to someone ranked above them.
All-Chat ships with 16 ready-made themes you can paste into your OBS Browser Source custom CSS:
| Theme | Vibe |
|---|---|
| Win98 | Nostalgic retro windows |
| Cyberpunk | Neon-soaked sci-fi |
| Minecraft | Blocky pixel style |
| Neon Glass | Frosted glass with glow |
| Vaporwave | A E S T H E T I C |
| Terminal Hacker | Green-on-black terminal |
| Pastel Cute | Soft & friendly |
| High Contrast | Accessibility-first |
| Modern Dark | Clean dark mode |
| Minimal | Just the text |
| Minimal Icon | Text + platform icons |
| Noita Minimal | Inspired by Noita |
| Comic Speech | Pop-art speech balloons with halftone and ink outlines |
| Neo Brutalist | Bold cards with thick borders and hard offset shadows |
| Sticky Notes | Tilted paper notes with washi tape |
| Trading Card | Holographic collectible cards |
Pick a theme in the editor's Advanced → Custom CSS tab and its full CSS is preloaded into an in-app editor you can edit directly — changes preview live as you type, with syntax highlighting and inline tips for broken CSS. Only your changes are saved, so fixes we ship to a theme still reach the rules you didn't touch; Reset to theme discards your edits and re-links. Want to build your own from scratch? See the CSS Customization Guide or the Theme Gallery & Creation Guide.
Don't just watch chat in OBS — give your viewers unified chat too.
The All-Chat Browser Extension replaces native site chat on Twitch, YouTube, and Kick with your All-Chat feed. Your community can read and send messages across platforms without leaving the page they're watching.
Install:
- Chrome / Edge / Brave
- Firefox
- GitHub Releases (gets updates first)
Why it's great:
- Replaces native chat automatically — no configuration needed
- Send messages with your existing platform account
- Full emote autocomplete (7TV, BTTV, FFZ) with
:prefix - Auto-reconnects if your connection drops — never miss a message
| Platform | How it works | What you get |
|---|---|---|
| Twitch | IRC + EventSub webhooks | Chat, emotes (native + 7TV/BTTV/FFZ), chat GIFs, badges, colors, channel points, raids, follows, chat notices (watch streaks, announcements, charity donations) |
| YouTube | HTTP polling + InnerTube API | Chat, Super Chat, member badges, multi-stream selection (public, currently live streams only) |
| Kick | Pusher WebSocket | Chat, emotes, badges, message deletion |
| TikTok | Unofficial live connector library | Chat messages, username-based display |
| Discord | Bot gateway + webhook relay | Channel chat relay to overlay |
YouTube has two listener modes: the official YouTube Data API (quota-tracked with reserve-confirm-rollback) and an InnerTube poller that costs zero quota. Both are production-ready.
Note: Only public, currently live YouTube streams are supported. Unlisted streams, private streams, and scheduled (upcoming) streams do not work. Stream discovery relies on YouTube's public search API (
search.listwitheventType=live), which only returns streams that are both public and actively broadcasting.
All-Chat doesn't poll platforms 24/7. The system tracks WebSocket connections from your overlay:
- Overlay visible in OBS → WebSocket connects → backend starts listening to your configured platforms
- Overlay hidden / OBS closed → WebSocket disconnects → after a 60-second grace period, listeners stop polling
- Overlay visible again → listeners spin back up instantly
This means zero wasted API calls when nobody is watching. It's also why "Shutdown source when not visible" in OBS works so well — it's not just an OBS optimization, it tells All-Chat to stand down.
Everything below is for contributors and self-hosters. If you're a streamer, you don't need any of this — just use allch.at.
All-Chat is a Go microservices platform with a React/Next.js frontend. Services communicate through Redis Streams (raw messages) and Redis Pub/Sub (overlay-specific delivery).
Platform Listeners (Twitch IRC, YouTube API, Kick Pusher, TikTok WS, Discord Bot)
│
▼ publish raw messages
Redis Streams (chat:raw)
│
▼ consume via XREADGROUP
Message Processor
├── Normalize to unified format
├── Enrich with emotes (7TV, BTTV, FFZ)
└── Route to overlay channels
│
▼ Redis Pub/Sub (overlay:{id})
API Gateway (WebSocket server)
│
▼ broadcast
Frontend Overlay (React)
Services (all in services/):
| Service | Role |
|---|---|
api-gateway |
WebSocket server for overlays, HTTP routing, OAuth callbacks |
auth-service |
Authentication, sessions, OAuth flows (Twitch, YouTube, Kick, Discord) |
emote-service |
7TV, BTTV, FFZ, and native emote resolution |
twitch-listener |
Twitch IRC chat ingestion (twitch-eventsub-listener) |
twitch-eventsub-listener |
Twitch EventSub webhooks (channel points, moderation, raids) |
youtube-listener |
YouTube Data API polling with quota tracking |
youtube-listener-innertube |
YouTube InnerTube API polling (zero quota cost) |
youtube-quota-monitor |
Reads the shared YouTube quota table; exports the quota metric + publishes quota:alerts for the discord-bot (ADR-0023) |
kick-listener |
Kick chat via Pusher WebSocket |
tiktok-listener |
TikTok live chat via unofficial connector |
discord-listener |
Discord channel chat relay |
message-processor |
Message normalization, emote enrichment, overlay routing |
overlay-manager |
Overlay CRUD, source configuration, settings |
source-manager |
Leader election, active source tracking, demand coordination |
share-service |
Shareable overlay link generation; admin premium/beta-tester/ambassador role grants + feature gates; public ambassador showcase (ADR-0041) |
moderation-service |
Cross-platform chat moderation write-path: delete / timeout / ban (ADR-0017); delegated-moderator grants (ADR-0048) |
payment-service |
Patreon premium entitlements: grants users.is_premium (streamer, ADR-0018) and viewers.is_premium (viewer split, ADR-0019) from subscriptions |
token-refresh-service |
OAuth token refresh on schedule |
engagement-service |
Polls, predictions, and a per-overlay viewer points economy (#523) |
discord-bot |
TypeScript Discord bot for community ops (not a chat listener) |
support-bot |
Discord support/admin agent |
- Backend: Go 1.25+, Gin framework, pgx/v5 (PostgreSQL), go-redis/v9, Zap logging
- Frontend: React 19, Next.js 16 (App Router), TypeScript, Tailwind CSS, Zustand
- Database: PostgreSQL 16
- Messaging: Redis 7 (Streams + Pub/Sub)
- Infrastructure: Docker Compose (local dev), Kubernetes + CloudNativePG (production)
# Full environment
make docker-up # Start PostgreSQL, Redis, and all services
make test # Run tests
make migrate # Apply database migrations
# Frontend-only (minimal backend)
make frontend-dev # Start only what the frontend needs
make frontend-seed # Create test overlay with mock sources
make frontend-messages # Generate fake chat messages
cd frontend && npm run devFirst time? See GETTING_STARTED.md for the full onboarding guide, or FRONTEND_QUICK_START.md if you're only touching the frontend.
Want to run your own instance?
git clone https://github.com/caesarakalaeii/all-chat.git
cd all-chat
cp .env.example .env
# Edit .env with your Twitch/YouTube/etc. credentials
make docker-upVisit http://localhost:3000 (frontend) — you're live. The API Gateway is on http://localhost:8080.
Prerequisites:
- Docker & Docker Compose
- Twitch Developer application (for OAuth)
- Optional: YouTube API credentials, Kick OAuth, Discord bot token
For production Kubernetes deployment, see the Deployment Guide.
Architecture decisions are documented as ADRs in docs/adr/:
- ADR-0001: Standard Go Layout (not hexagonal/ports-adapters)
- ADR-0002: Redis Streams + Pub/Sub hybrid messaging
- ADR-0003: CloudNativePG for PostgreSQL in Kubernetes
- ADR-0006: YouTube quota reserve-confirm-rollback pattern
- ADR-0007: Leadership rebalancing for auto-scaling listeners
- ADR-0008: Feature gate infrastructure for premium capabilities
- ADR-0020: Beta-tester role + early-access feature gates (extends ADR-0008; a beta-tester is premium plus early-access, granted via an admin button — no data migration)
- ADR-0041: Ambassador role + public homepage showcase (extends ADR-0020; an ambassador is premium plus early-access AND opts into a public "Featured Ambassadors" homepage card; admin-granted, streamer-consented)
- ADR-0013: Public overlay observability view + shared
useOverlayStreamhook - ADR-0014: Linger upstream capture demand symmetric with the downstream pub/sub linger
- ADR-0015: Dynamic EventSub chat-ownership claim — IRC is the always-on fallback; EventSub owns a channel only while it is actively delivering chat (no silent loss across the partition)
- ADR-0026: Two-phase deprecation of the Twitch IRC listener —
warnnudges connected sources to re-add their Twitch source (in-overlay notice),enforcestops joining channels - ADR-0046: Twitch chat notices via
channel.chat.notification— watch streaks and announcements carry the chatter's own message on no other subscription, so they were silently dropped; notices are routed by type, skipping the five a dedicated subscription already delivers - ADR-0048: Delegated overlay moderators — a moderator acts with their OWN platform credential (never the streamer's, no fallback), so the platform re-checks their role per call; Discord is the exception (the shared bot always acts, so All-Chat verifies guild permissions live) and premium is keyed on the overlay owner
- ADR-0027: Time-limited admin premium grants — an optional expiry on the admin override (streamer + viewer) that reverts on its own; recompute ignores an expired override, and a single-replica payment-service sweep clears lapsed grants
| Topic | Link |
|---|---|
| Onboarding | GETTING_STARTED.md |
| Frontend dev | FRONTEND_QUICK_START.md |
| Frontend UI / design system | DESIGN_SYSTEM.md |
| CSS customization | CSS_CUSTOMIZATION.md |
| Deployment | DEPLOYMENT.md |
| Architecture overview | docs/architecture/ |
| Data flow | 01-DATA-FLOW.md |
| Troubleshooting | Decision Tree |
| LLM quick-ref guides | docs/llm-guides/ |
We welcome contributions from everyone!
Non-developers:
- Create and share themes (CSS)
- Report bugs
- Suggest features
Developers:
- Fork the repository
- Create a feature branch
- Make your changes and write tests
- Open a Pull Request
See CONTRIBUTING.md for the full process.
Built on the shoulders of:
- gempir/go-twitch-irc — Twitch IRC client
- Gin — Go HTTP framework
- Next.js — React framework
- 7TV, BTTV, FFZ — Emote providers
- Back us on Patreon — unlock premium (streamer €5 / viewer €2)
- Discord community
- GitHub Issues
- GitHub Discussions
- Email: all.chat.support@gmail.com
Free. Open source. Built for streamers who refuse to pick just one platform.