Skip to content

caesarakalaeii/all-chat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1,745 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

All-Chat — One overlay, every platform

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


What is All-Chat?

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.

Highlights

  • 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
  • 12 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

Quick Start

1. Create your overlay

  1. Visit allch.at and sign in with Twitch
  2. Create a new overlay
  3. Add chat sources — Twitch channels, YouTube streams, Kick channels, etc.
  4. Tweak display settings (font, message duration, animations)

2. Add it to OBS

  1. In OBS, add a Browser Source
  2. Set the URL to https://allch.at/overlay/YOUR_OVERLAY_ID
  3. Set dimensions to something sensible for a chat panel — e.g. 400 × 800 (adjust to taste)
  4. 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.
  5. Done!

Tip: The overlay has a transparent background by default, so it layers cleanly over your stream.

3. Customize the look

All-Chat ships with 12 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

Want to build your own? See the CSS Customization Guide or the Theme Gallery & Creation Guide.


Browser Extension

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:

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 Support

Platform How it works What you get
Twitch IRC + EventSub webhooks Chat, emotes (native + 7TV/BTTV/FFZ), badges, colors, channel points, raids, follows
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.list with eventType=live), which only returns streams that are both public and actively broadcasting.


Demand-Driven Listeners

All-Chat doesn't poll platforms 24/7. The system tracks WebSocket connections from your overlay:

  1. Overlay visible in OBS → WebSocket connects → backend starts listening to your configured platforms
  2. Overlay hidden / OBS closed → WebSocket disconnects → after a 60-second grace period, listeners stop polling
  3. 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.


For Developers

Everything below is for contributors and self-hosters. If you're a streamer, you don't need any of this — just use allch.at.


Architecture

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 webhooks (channel points, moderation, raids)
youtube-listener YouTube Data API polling with quota tracking
youtube-listener-innertube YouTube InnerTube API polling (zero quota cost)
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
token-refresh-service OAuth token refresh on schedule

Tech Stack

  • 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)

Local Development

# Full environment
make docker-up         # Start PostgreSQL, Redis, and all services
make test              # Run tests
make migrate-up        # 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 dev

First time? See GETTING_STARTED.md for the full onboarding guide, or FRONTEND_QUICK_START.md if you're only touching the frontend.

Self-Hosting

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-up

Visit http://localhost:8080 — you're live.

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.

Key Design Decisions

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

Documentation

Topic Link
Onboarding GETTING_STARTED.md
Frontend dev FRONTEND_QUICK_START.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/

Contributing

We welcome contributions from everyone!

Non-developers:

Developers:

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes and write tests
  4. Open a Pull Request

See CONTRIBUTING.md for the full process.


Acknowledgments

Built on the shoulders of:


License

AGPL 3.0

Support


Free. Open source. Built for streamers who refuse to pick just one platform.

About

The spiritual successor to truffle, the multi platform overlay for everyone.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Packages

 
 
 

Contributors