{"id":21404191,"url":"https://github.com/supportclass/streen","last_synced_at":"2026-03-04T07:33:27.260Z","repository":{"id":32269893,"uuid":"35844485","full_name":"SupportClass/streen","owner":"SupportClass","description":"A centralized WebSocket Twitch Chat interface","archived":false,"fork":false,"pushed_at":"2023-01-12T08:26:45.000Z","size":647,"stargazers_count":14,"open_issues_count":15,"forks_count":7,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-07-07T14:09:12.534Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"jwasham/coding-interview-university","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SupportClass.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-05-18T21:49:48.000Z","updated_at":"2023-03-22T16:44:01.000Z","dependencies_parsed_at":"2023-01-14T20:52:26.459Z","dependency_job_id":null,"html_url":"https://github.com/SupportClass/streen","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/SupportClass/streen","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SupportClass%2Fstreen","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SupportClass%2Fstreen/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SupportClass%2Fstreen/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SupportClass%2Fstreen/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SupportClass","download_url":"https://codeload.github.com/SupportClass/streen/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SupportClass%2Fstreen/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30075436,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-04T05:31:57.858Z","status":"ssl_error","status_checked_at":"2026-03-04T05:31:38.462Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":[],"created_at":"2024-11-22T16:13:25.694Z","updated_at":"2026-03-04T07:33:27.218Z","avatar_url":"https://github.com/SupportClass.png","language":"JavaScript","readme":"# Streen [![Build Status](https://travis-ci.org/SupportClass/streen.svg?branch=master)](https://travis-ci.org/SupportClass/streen) [![Coverage Status](https://coveralls.io/repos/github/SupportClass/streen/badge.svg?branch=master)](https://coveralls.io/github/SupportClass/streen?branch=master)\n[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy)  \n\nStreen is a centralized interface for interacting with Twitch Chat. It is essentially a wrapper for \n[tmi.js](https://docs.tmijs.org/), and it operates via Socket.IO websockets.\n\nStreen is useful in situations where multiple processes all need to connect to Twitch Chat, \nbut the overhead of spinning up multiple and managing multiple chat bots is not acceptable. \nStreen operates as a single bot and exposes a websocket API.\n\n## Motivation\nI maintain many production [NodeCG](https://github.com/nodecg/nodecg) instances. Most of these NodeCG instances need to connect to Twitch chat for one reason or another. At first, I had each of these NodeCG instances spin up their own [tmi.js](https://docs.tmijs.org/) bot and connect to Twitch chat directly. However, this wound up causing problems whenever a breaking change happened, as I would have to go update tmi.js manually on each of the many deployments. Streen centralizes this external dependency into one place, making it easier to keep up with changes on Twitch's end.\n\n## Installation\n- [Deploying to Heroku (recommended)](#deploying-to-heroku)\n- [Manual installation](#manual-installation)\n\n### Deploying to Heroku\n- Click the \"Deploy to Heroku\" button at the top of this README.\n- Fill out the form. Be sure to provide all required config variables.\n- If using a free dyno (the default), you'll need to prevent it from sleeping. \nThis can be done by periodically pinging the dyno. [Apex Ping](https://ping.apex.sh/) and \n[Pingdom](https://www.pingdom.com/) are two options for this, but there are many ways to prevent a free web dyno from \nsleeping.\n\n### Manual Installation\n- Clone the repository\n- From the directory you cloned Streen into, run `npm install --production`\n- Create `./config.json` with the desired `twitch.username`, `twitch.password`, and `secretKey`. \nThe `secretKey` is a pre-shared key that all clients must provide in order to use the websocket API.\n- Optionally, add a [`slack.botToken`](https://my.slack.com/services/new/bot) and `slack.statusChannel` \nto have Streen post critical status updates and respond to commands. \n[(Need an avatar for your bot?)](http://i.imgur.com/7LNvGeK.jpg)\n```json\n{\n  \"twitch\": {\n    \"username\": \"botname\",\n    \"password\": \"oauth:myOauthToken1234\",\n    \"clientId\": \"abcdefghijk\"\n  },\n  \"slack\": {\n    \"botToken\": \"xoxb-xxxxxxxxxx-yyyyyyyyyy\",\n    \"statusChannel\": \"somechannel\"\n  },\n  \"port\": 8232,\n  \"logLevel\": \"info\",\n  \"secretKey\": \"xxxxx\"\n}\n```\n- Run with `node server.js`\n\n## Example\nSee [lfg-siphon](https://github.com/SupportClass/lfg-siphon) for an example implementation.\n\n## Slack Commands\n### !channels\nLists the current Twitch chat channels that Streen is listening to.  \n![channels command example](https://i.imgur.com/072ECjo.png)\n\n### !online\nLists the online status of each Twitch stream that Streen is listening to.  \n![online command example](https://i.imgur.com/TMiOISh.png)\n\n### !notifyoffline \\\u003cchannel\\\u003e\nNotifies you when `channel` stops streaming. Useful for planning maintenance or remembering\nto speak to someone when they go offline for the day.  \n![notifyoffline command example](https://i.imgur.com/O7BDy6D.png)\n\n### License\nStreen is provided under the MIT license, which is available to read in the [LICENSE](LICENSE) file.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsupportclass%2Fstreen","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsupportclass%2Fstreen","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsupportclass%2Fstreen/lists"}