Unified Chat — Quick Install ============================ Merges live chat from YouTube, Twitch, Kick, Discord, Rumble, Trovo, DLive and Facebook into one dashboard. Includes a YouTube live-title editor. -------------------------------------------------- 1) INSTALL -------------------------------------------------- Copy this whole folder onto your Docker host, then: cd unified-chat cp .env.example .env nano .env # fill in at least one platform + AUTH_USER/AUTH_PASS docker compose up -d docker compose logs -f # confirm your platforms loaded That's it. Compose builds the image from the files in this folder, so you don't need a Docker Hub account or a prebuilt image. If you edited .env on Windows, strip CR line endings first or every value will have an invisible \r on the end: sed -i 's/\r$//' .env Not using compose? Then: docker build -t unified-chat . docker run -d \ --name unified-chat \ -p 8088:8088 \ --restart unless-stopped \ --env-file .env \ -v "$PWD/tokens:/usr/src/app/tokens" \ unified-chat -------------------------------------------------- 2) CONFIGURE -------------------------------------------------- All configuration lives in .env — there is no settings page. Every platform is OPTIONAL. Fill in only the ones you use; the rest are skipped. The startup log ends with a "Platforms enabled:" line so you can see exactly what loaded. A platform with bad credentials logs an error and is dropped — it can't stop the others or prevent the app from starting. Minimum per platform: YouTube YT_API_KEYS + YT_CHANNEL_ID Twitch TWITCH_NICK + TWITCH_CHANNEL + TWITCH_TOKEN_URL (or _IRC_OAUTH) Kick KICK_CLIENT_ID + KICK_CLIENT_SECRET + KICK_CHANNEL_SLUG Discord DISCORD_BOT_TOKEN + DISCORD_CHANNEL_IDS Rumble RUMBLE_API_URL Trovo TROVO_CLIENT_ID + TROVO_CHANNEL_ID DLive DLIVE_USERNAME + DLIVE_ACCESS_TOKEN Facebook FB_PAGE_ID + FB_PAGE_TOKEN See .env.example for where to get each credential. -------------------------------------------------- 3) SET A PASSWORD (do not skip) -------------------------------------------------- AUTH_USER=youruser AUTH_PASS=a-long-random-password Without these there is NO LOGIN. Anyone who can reach port 8088 can read your chat, see your stream status, and rename your live YouTube broadcast. The app prints a warning at boot when auth is off. Basic auth sends the password base64-encoded on every request, so on an untrusted network put this behind a reverse proxy with TLS. -------------------------------------------------- 4) RUN IT -------------------------------------------------- Open: http://YOUR-SERVER-IP:8088/ Adapters are IDLE on boot. Press "Start" in the dashboard to connect. This keeps the container from burning YouTube API quota when you aren't streaming. -------------------------------------------------- 5) OPTIONAL — YOUTUBE TITLE EDITOR -------------------------------------------------- To rename a running livestream from the dashboard: - Set YT_OAUTH_CLIENT_ID, YT_OAUTH_CLIENT_SECRET, YT_OAUTH_REDIRECT - The redirect URI must match your Google Cloud credential EXACTLY (same host and port) and be reachable from your browser - Visit http://YOUR-SERVER-IP:8088/auth/youtube/start once to authorize - Then use http://YOUR-SERVER-IP:8088/yt The refresh token is saved to the mounted tokens/ folder, so it survives container rebuilds. -------------------------------------------------- NOTES -------------------------------------------------- - YouTube quota is the usual failure point. Each Google Cloud project gets 10,000 units/day and live chat polling eats it fast. Put several API keys from DIFFERENT projects in YT_API_KEYS (comma-separated) and the app rotates when one runs dry. Keep MIN_YT_POLL_MS at 10000 or above. - Discord requires the MESSAGE CONTENT INTENT to be enabled in the Discord Developer Portal. Without it the bot connects but all messages are empty. - Kick webhooks require a publicly reachable URL ending in /kick/webhook. Leave KICK_ENABLE_WEBHOOKS=false if you're LAN-only. - File ownership: the container drops to PUID:PGID (default 1000:1000) after fixing permissions on tokens/. Unraid users usually want PUID=99 and PGID=100. - X / Twitter is not supported. Any X_* variables are ignored. -------------------------------------------------- LEGAL, SUPPORT AND DONATIONS -------------------------------------------------- Provided free and AS-IS, with NO WARRANTY and NO SUPPORT of any kind. There is no help desk, no ticket queue, and no obligation on anyone to answer a question, fix a bug, or keep this working as third-party APIs change. You are responsible for securing your installation, for the credentials you supply, and for testing before you rely on it during a live broadcast. Donations are welcome if you find it useful: https://donate.stripe.com/3cI5kDaOq7Ud0uneec0co00 A donation is a VOLUNTARY GIFT, NOT A PURCHASE. It buys no support, no warranty, no bug fixes, no features and no priority, and it is non-refundable. DONATING DOES NOT CHANGE ANY OF THE ABOVE. Only give what you are happy to give away with nothing expected back. Full terms: https://streamhelpers.com/legal.html Another fine product of Blue Soup Enterprises - https://bluesoup.biz/ StreamHelpers.com