{"id":13822077,"url":"https://github.com/Durss/Twitchat","last_synced_at":"2025-05-16T15:32:55.324Z","repository":{"id":37454990,"uuid":"446662036","full_name":"Durss/Twitchat","owner":"Durss","description":"Full featured Twitch chat alternative to fill gaps from the official one.","archived":false,"fork":false,"pushed_at":"2025-05-13T18:41:56.000Z","size":288802,"stargazers_count":291,"open_issues_count":15,"forks_count":31,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-05-13T19:51:49.768Z","etag":null,"topics":["chat","irc","pubsub","tmi","twitch","twitchat"],"latest_commit_sha":null,"homepage":"https://twitchat.fr","language":"Vue","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Durss.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":["Durss"],"custom":["https://paypal.me/durss"]}},"created_at":"2022-01-11T03:17:11.000Z","updated_at":"2025-05-13T18:42:00.000Z","dependencies_parsed_at":"2025-05-06T18:34:25.773Z","dependency_job_id":null,"html_url":"https://github.com/Durss/Twitchat","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Durss%2FTwitchat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Durss%2FTwitchat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Durss%2FTwitchat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Durss%2FTwitchat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Durss","download_url":"https://codeload.github.com/Durss/Twitchat/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254556804,"owners_count":22091002,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chat","irc","pubsub","tmi","twitch","twitchat"],"created_at":"2024-08-04T08:01:41.551Z","updated_at":"2025-05-16T15:32:50.313Z","avatar_url":"https://github.com/Durss.png","language":"Vue","funding_links":["https://github.com/sponsors/Durss","https://paypal.me/durss"],"categories":["Vue"],"sub_categories":[],"readme":"\n\u003cdiv align=\"center\"\u003e\n\t\u003cimg src=\"https://shields.io/badge/vue-3-42b883?logo=Vue.js\u0026labelColor=ffffff\"\u003e \u003cimg src=\"https://shields.io/badge/typescript-%3E=%204.5.4-3178c6?logo=TypeScript\u0026labelColor=ffffff\"\u003e \u003cimg src=\"https://shields.io/badge/node-%3E=%2018.2.0-026e00?logo=node.js\u0026labelColor=ffffff\"\u003e \u003cimg src=\"https://shields.io/badge/less-1d365d?logo=less\u0026labelColor=ffffff\u0026logoColor=000000\"\u003e\n\t\u003cbr\u003e\n\t\u003cbr\u003e\n\t\u003cbr\u003e\n\t\u003cbr\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\t\u003ca href=\"https://twitchat.fr\" target=\"_blank\"\u003e\n\t\t\u003cimg width=\"400\" alt=\"twitchat\" src=\"https://raw.githubusercontent.com/Durss/Twitchat/main/src_front/assets/logo.svg\"\u003e\n\t\u003c/a\u003e\n\t\u003cbr\u003e\n\t\u003cbr\u003e\n\t- \u003ca href=\"https://twitchat.fr\" target=\"_blank\"\u003etwitchat.fr\u003c/a\u003e -\n\t\u003cbr\u003e\n\t- \u003ca href=\"https://discord.gg/fmqD2xUYvP\" target=\"_blank\"\u003eJoin discord\u003c/a\u003e -\n\n\u003c/div\u003e\n\u003cbr\u003e\n\u003cbr\u003e\nA custom twitch chat that aims to fill gaps in the official Twitch chat for streamers.\n\u003cbr\u003e\nThe main goal is to follow your chat as best as possible.\n\u003cbr\u003e\n\u003cbr\u003e\n\nFor developpers, **Twitchat exposes an API** to receive events and control some features remotely.\\\n[📖 Read its documentation](PUBLIC_API.md).\n\u003cbr\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n# Features\n- [x] Enable an emergency button with custom actions to prevent from follow bots and doxxing\n- [x] Create your own sub/follow/rewards/poll/... alerts and chat commands with the Trigger system that allows to control your OBS sources and filters as well as Spotify when an event occurs\n- [x] Control Twitchat and create polls or predictions with your voice\n- [x] Read your messages and alerts out loud thank to the include text-to-speech\n- [x] Pin messages and find them back later\n- [x] Display the first message of users seperatly so you don't forget to greet them\n- [x] Show any message of your chat on your stream with a single click\n- [x] Stream Deck™ plugin\n- [x] Custom spoiler feature so viewers can hide message contents to the streamer\n- [x] Alert command to make Twitchat shake, blink, emit sound and display a message over everything else\n- [x] Edit your stream's info from Twitchat with possibility to create pressets\n- [x] Create a timer or a countdown with a simple command and show it on your stream\n- [x] Control spotify from chat commands *(create your own song request system)* and show currently playing track on your stream\n- [x] Make it easier to follow a conversation between users\n- [x] Remember where you stopped reading the chat by clicking any message\n- [x] Track a user to make sure not to miss their messages\n- [x] Create a raffle and pick random winners. An overlay is available to display a wheel that selects a winner.\n- [x] Create a bingo in which users have to find a number or an emoji\n- [x] Ask your viewers for suggestions with a dedicated command\n- [x] See if a user is not following the channel\n- [x] Display received whispers and answer them\n- [x] Filter some messages *(bots, commands, self, /me, etc...)*\n- [x] Customize messages display *(remove badges, show minimalist badges, remove emotes)*\n- [x] Customize messages appearance by roles *(viewers, mods, vips, subs)*\n- [x] Moderate messages *(ban, timeout, delete message)*\n- [x] Allow/deny messages blocked by automod\n- [x] Display when it's the first message ever of a user on the channel\n- [x] Display mod notifications on chat (ex: \"User XXX has been banned by YYY\")\n- [x] Display sub/bits/raid/reward/follow notifications\n- [x] Display hype train status\n- [x] Show the last stream info of a raider\n- [x] Integrated activity feed to see subs/cheers/follows/raids/rewards history\n- [x] Create/Delete polls\n- [x] Create/Delete predictions\n- [x] Emote selector\n- [x] BTTV, FFZ and 7TV emotes supported\n- [x] Message autocomplete nickname via \"@\", emotes via \":\", commands via \"/\" or all via TAB key\n- [x] Allow to search on all messages via command `/search`\n- [x] Split view in half with chat on left and notifications/activity feed, new viewers, etc.. on the right\n- [x] Filter out only specific commands\n- [x] See live viewers count\n- [x] Keep or remove deleted messages\n- [x] See all your followings that are live to raid them easily\n- [x] Supports boost trains\n- [x] Supports `/announce message` feature\n- [x] Allow your mods to control your OBS scenes or mute/unmute your mic from chat\n- [x] Expose an API to control some stuff remotely\n- [x] Chat suggestion feature: allow your viewers to give suggestions with a dedicated command and randomly pick one of them\n- [x] Handles \"low trust\" feature ([more info](https://help.twitch.tv/s/article/ban-evasion))\n- [x] And many other things....\n\u003cbr\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n# Project setup\nCreate a `data/credentials/credentials.json` file and set the following content after filling values :\n```json\n{\n\t\"server_port\": 3018,\n\t\"admin_ids\": [\"YOUR_TWITCH_USER_ID\"],\n\t\"csrf_key\": \"\",\n\n\t\"twitch_client_id\": \"\",\n\t\"twitch_client_secret\": \"\",\n\t\"twitch_redirect_uri\": \"http://localhost:8080/oauth\",\n\t\"twitch_scopes\": [\n\t\t\"chat:read\",\n\t\t\"chat:edit\",\n\t\t\"moderator:manage:announcements\",\n\t\t\"moderator:manage:chat_messages\",\n\t\t\"moderator:manage:shoutouts\",\n\t\t\"whispers:read\",\n\t\t\"user:manage:whispers\",\n\t\t\"moderator:read:chatters\",\n\t\t\"channel:read:redemptions\",\n\t\t\"channel:manage:redemptions\",\n\t\t\"channel:manage:polls\",\n\t\t\"channel:manage:predictions\",\n\t\t\"moderator:manage:chat_settings\",\n\t\t\"channel:moderate\",\n\t\t\"channel:manage:moderators\",\n\t\t\"channel:manage:vips\",\n\t\t\"channel:manage:raids\",\n\t\t\"channel:manage:broadcast\",\n\t\t\"channel:read:hype_train\",\n\t\t\"channel:edit:commercial\",\n\t\t\"channel:read:subscriptions\",\n\t\t\"user:read:emotes\",\n\t\t\"user:read:follows\",\n\t\t\"moderator:read:followers\",\n\t\t\"user:read:moderated_channels\",\n\t\t\"user:read:blocked_users\",\n\t\t\"user:manage:blocked_users\",\n\t\t\"user:edit:broadcast\",\n\t\t\"moderator:manage:banned_users\",\n\t\t\"moderator:manage:automod\",\n\t\t\"moderator:manage:shield_mode\",\n\t\t\"moderator:manage:unban_requests\",\n\t\t\"clips:edit\",\n\t\t\"channel:read:ads\",\n\t\t\"channel:manage:ads\",\n\t\t\"moderator:manage:blocked_terms\",\n\t\t\"moderator:manage:warnings\",\n\t\t\"moderator:read:moderators\",\n\t\t\"moderator:read:vips\",\n\t\t\"moderator:read:suspicious_users\"\n\t],\n\n\t\"spotify_client_id\": \"\",\n\t\"spotify_client_secret\": \"\",\n\t\"spotify_scopes\": \"user-read-currently-playing user-modify-playback-state playlist-read-private playlist-modify-public playlist-modify-private\",\n\t\"spotify_redirect_uri\": \"http://localhost:8080/spotify/auth\",\n\n\t\"patreon_client_id\": \"\",\n\t\"patreon_client_secret\": \"\",\n\t\"patreon_scopes\": \"identity campaigns campaigns.members w:campaigns.webhook\",\n\t\"patreon_redirect_uri\": \"http://localhost:8080/patreon/auth\",\n\n\t\"patreon_client_id_server\": \"\",\n\t\"patreon_client_secret_server\": \"\",\n\t\"patreon_redirect_uri_server\": \"http://localhost:3018/api/patreon/serverauth\",\n\t\"patreon_webhook_secret\": \"\",\n\n\t\"tenor_secret\": \"\",\n\t\"youtube_key\": \"path/to/key.json\",\n\t\"youtube_scopes\": [\"https://www.googleapis.com/auth/youtube.readonly\", \"https://www.googleapis.com/auth/youtube.force-ssl\"],\n\t\"google_key\": \"path/to/key.json\",\n\n\t\"paypal_client_id\":\"\",\n\t\"paypal_client_secret\":\"\",\n\n\t\"donors_remote_api_secret\": \"\",\n\t\"contact_mail\": \"\",\n\n\t\"discord_client_id\":\"\",\n\t\"discord_public_key\":\"\",\n\t\"discord_bot_token\":\"\",\n\n\t\"streamlabs_client_id\":\"\",\n\t\"streamlabs_client_secret\":\"\",\n\t\"streamlabs_redirect_uri\":\"\",\n\n\t\"streamelements_client_id\":\"\",\n\t\"streamelements_client_secret\":\"\",\n\t\n\t\"tipeee_client_id\":\"\",\n\t\"tipeee_client_secret\":\"\",\n\t\"tipeee_redirect_uri\":\"http://localhost:8080/tipeee/auth\",\n\n\t\"tiltify_client_id\":\"\",\n\t\"tiltify_client_secret\":\"\",\n\t\"tiltify_webhook_verify\":\"\",\n\t\"tiltify_webhook_id\":\"\",\n\t\"tiltify_redirect_uri\":\"http://localhost:8080/tiltify/auth\",\n\t\"tiltify_scopes\":\"public webhooks:write\",\n\t\"tiltify_api_path\":\"https://v5api.tiltify.com\"\n}\n```\nCreate a [twitch application](https://dev.twitch.tv/console) and fill in the `client_id` and `client_secret` values.\\\nWrite anything you want in the `csrf_key` field, it will be used to secure twitch authentication from CSRF attacks.\\\nConfigure the redirect URI of the twitch application to:\\\n```\nhttp://localhost:8080/oauth\n```\n*(adapt with the proper port and domain if deploying online)*\\\nSet the same value to the `redirect_uri` property of the `credentials.json` file.\\\n\nYou can also create a [spotify application](https://developer.spotify.com/dashboard) and fill in the spotify `spotify_client_id` and `spotify_client_secret`\n\u003cbr\u003e\nBy default the server listens on port 3018, you can change it on `credentials.json` and `src_front/utils/Config.ts`.\n\n\u003cbr\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n# Environment setup\nThis project has been coded with VSCode.\\\nIt is recommended to install these plugins:\\\nVue Plugin: https://marketplace.visualstudio.com/items?itemName=Vue.volar\n\nI18n-ally Plugin: https://marketplace.visualstudio.com/items?itemName=lokalise.i18n-ally\n\n\u003cbr\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n# Compile project\n### Install dependencies\n```\nnpm install\n```\n\n### Compiles and hot-reloads for development\n```\nnpm run dev\n```\n\n### Compiles and minifies for production\n```\nnpm run build\n```\n\n### Run server\n```\nnode server/boostrap.js\n```\n\u003cbr\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n# Install server\nAll the following MUST be done on a seperate folder from the GIT project.\\\n[Compile the project](#compile-project) and push the content of the `server` folder on your server root.\\\nNext to this file, create a `public` folder and push the content of your local `dist` folder inside it.\\\nAlso add the `credentials` folder inside a `data` older at the root of the project.\\\nCreate an `env.conf` file, just write `prod` inside, and push it at the root of the project.\\\nInstall all the production dependencies and [run the server](#run-server).\n\\\nHere is the expected file structure:\\\n─ root\\\n  ├─ node_modules/\\\n  ├─ public/\\\n  ├─ utils/\\\n  ├─ data/\\\n    ├─ credentials/\\\n  ├─ controllers/\\\n  ├─ bootstrap.js\\\n  ├─ env.conf\\\n\u003cbr\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n# Localization\n# Adding new language\nJust create a new folder under the `i18n` folder with the ISO 639-1 code of the language.\\\nRead the next section to know how to translate labels\n\n# Translating labels\nTo make localization as easy as possible, a dedicated interface has been made that lists all available categories and labels with the possibility to edit them.\\\nAny update on this interface triggers a rebuild of the compiled file as well as an update on any twitchat page opened on the same browser.\\\n\\\nThe interface is only accessible to adminitrators and can be found here:\\\n[localhost:8080/labels](https://localhost:8080/labels)\\\nTo get admin rights you must set your twitch user ID under the `admin_ids` array in the `credentials.json` file.\\\n\n# Adding new labels\nIf you need to add new labels, you'll have to edit JSON sources.\\\nAll label files can be found under `i18n` folder.\\\nThey are splitted by language then by sections.\\\nAny new file or folder structure can be added to this.\\\nThese are all merged into `static/labels.json` during the build process.\\\n\\\nFiles can have any name but all labels within it must be under a single property that will be the base path to use the label. The property name is usually the same as the file's name.\\\nExample:\n```\n─ en\\\n  ├─ global.json\\\n  ├─ home.json/\\\n  ├─ triggers.json/\\\n```\n`global.json` example:\n```json\n{\n\t\"global\":{\n\t\t\"hello\":\"World\"\n\t}\n}\n```\n`home.json` example:\n```json\n{\n\t\"home\":{\n\t\t\"lorem\":\"ipsum dolor sit amet\"\n\t}\n}\n```\nThis will output this JSON file:\n```json\n{\n\t\"en\":{\n\t\t\"global\":{\n\t\t\t\"hello\":\"World\"\n\t\t},\n\t\t\"hello\":{\n\t\t\t\"lorem\":\"ipsum dolor sit amet\"\n\t\t}\n\t}\n}\n```\n\u003cbr\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n# Package Stream Deck™ plugin\nRun the following command:\n```\nnpm run streamdeck_package\n```\nThe compiled plugin will be there `streamdeck_plugin/fr.twitchat.streamDeckPlugin`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FDurss%2FTwitchat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FDurss%2FTwitchat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FDurss%2FTwitchat/lists"}