Your multistream chat, finally in one place. 🎯
One unified chat for Twitch, YouTube, Kick & Tiktok in a single clean feed.
Zero-setup, read-only multistream chat viewer — a simplified spin-off of kimsec/unified-chat with no OAuth, no per-user hosting and no moderation/sending.
Open unified-chat.com, type up to four usernames
(Twitch / Kick / YouTube / TikTok) and watch the aggregated chat. Channels are
shareable as links: https://unified-chat.com/?twitch=channelname&kick=channelname.
- Unified feed — up to four chats in one view, with per-platform filters, timestamps and clickable links/emotes. Messages that @-mention a connected channel are highlighted.
- 7TV / BTTV / FFZ emotes — third-party Twitch emotes render automatically, no browser extension needed.
- Twitch badges — broadcaster, mod, VIP, sub and more, using Twitch's own badge art.
- Expand — one click fills the window with the chat; ✕ or Esc brings the
page back. The state lives in the URL (
?expand=1), so a bookmark or shared link opens straight into it. - Stream player — press ▶ in the expanded chat to watch Twitch, Kick or YouTube (once live) above the chat. Starts muted; platform icons switch source.
- Alert sounds — paste your StreamElements/Streamlabs alert overlay URLs under Settings → Alert sounds and they play in the expanded chat. Stored only in your browser, never on the server.
- OBS overlay — use
/overlay?twitch=channelnameas a transparent browser source with auto-fading messages (see parameters below). - Event notices — subs, resubs, gift subs, raids and cheers with animated cheermotes (Twitch), subs/gift subs/hosts/Kicks gifts (Kick), Super Chats/Stickers and memberships (YouTube) render with a highlight border.
- Hype Train — a live progress bar (level + %) appears when a Twitch hype train is rolling, and fades out when it ends.
- Shared chat — in Twitch dual streams, messages from the partner's chat show that streamer's avatar.
- Installable (PWA) — install as an app from the browser's address bar; it opens with your last used channels.
- Efficient — the server keeps one upstream connection per unique channel (not per viewer) and fans out through an internal WebSocket hub.
All toggles live in the sidebar and are stored locally in the browser:
| Setting | Default | Does |
|---|---|---|
| Platform | on | platform icon in front of each message |
| User badges | on | Twitch badges (mod, sub, VIP...) |
| 7TV/BTTV/FFZ emotes | on | third-party emotes in Twitch chats |
| Highlight mentions | on | highlight messages @-mentioning a connected channel |
| 24-hour clock | on | 24h vs 12h timestamps |
| Text size | 16 px | chat text size |
| Alert sounds | – | alert overlay URLs whose sounds play in the expanded chat |
Append to the overlay link, e.g.
/overlay?twitch=channelname&fade=90&size=18&max=8:
| Parameter | Default | Does |
|---|---|---|
fade=<s> |
60 | seconds before a message fades out |
size=<px> |
– | text size |
align=right |
left | right-align messages |
max=<n> |
200 | max messages on screen |
icons=0 |
on | hide platform icons |
This service stores no data — it is a pure pass-through proxy:
- Chat messages live only in memory: a rolling buffer of the last ~100 messages per channel (so new viewers get instant history) plus what each browser holds on screen. Nothing is written to disk, no database, and a restart wipes everything.
- With the recommended flags (
--no-access-log --log-level warning) the server logs no requests, no IP addresses and no watched channels. - The browser's localStorage keeps only the visitor's own settings (channel names, toggles) — locally, on their machine, never sent anywhere.
Save this as docker-compose.yml:
services:
unified-chat-lite:
image: kim3k/unified-chat-lite:latest
container_name: unified-chat-lite
restart: unless-stopped
ports:
- "8100:8000"Run docker compose up -d