{"id":30578379,"url":"https://github.com/ifvictr/whirl","last_synced_at":"2025-08-29T03:13:32.137Z","repository":{"id":42723157,"uuid":"269083482","full_name":"ifvictr/whirl","owner":"ifvictr","description":"🌀 Fun, anonymous chats with random members of your Slack","archived":false,"fork":false,"pushed_at":"2023-02-03T12:12:35.000Z","size":340,"stargazers_count":8,"open_issues_count":9,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2023-02-27T17:22:46.476Z","etag":null,"topics":["anonymity","chat","fun","slack"],"latest_commit_sha":null,"homepage":"https://whirl.ifvictr.com/slack/install","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ifvictr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-06-03T12:34:37.000Z","updated_at":"2022-12-13T13:25:25.000Z","dependencies_parsed_at":"2023-02-17T11:55:16.372Z","dependency_job_id":null,"html_url":"https://github.com/ifvictr/whirl","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"purl":"pkg:github/ifvictr/whirl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ifvictr%2Fwhirl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ifvictr%2Fwhirl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ifvictr%2Fwhirl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ifvictr%2Fwhirl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ifvictr","download_url":"https://codeload.github.com/ifvictr/whirl/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ifvictr%2Fwhirl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272618237,"owners_count":24965406,"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","status":"online","status_checked_at":"2025-08-29T02:00:10.610Z","response_time":87,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["anonymity","chat","fun","slack"],"created_at":"2025-08-29T03:13:31.563Z","updated_at":"2025-08-29T03:13:32.130Z","avatar_url":"https://github.com/ifvictr.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003cimg alt=\"Whirl\" width=\"128\" src=\"https://files.ifvictr.com/2020/06/whirl.png\" /\u003e\n\u003c/p\u003e\n\u003ch1 align=\"center\"\u003eWhirl\u003c/h1\u003e\n\u003cp align=\"center\"\u003e\n    \u003ci\u003eFun, anonymous chats with random members of your Slack!\u003c/i\u003e\n    \u003cbr /\u003e\n    \u003cbr /\u003e\n    \u003ca href=\"https://whirl.ifvictr.com/slack/install\"\u003e\n        \u003cimg alt=\"Add to Slack\" add=\"\" to=\"\" slack\"\"=\"\" height=\"40\" width=\"139\" src=\"https://platform.slack-edge.com/img/add_to_slack.png\" srcset=\"https://platform.slack-edge.com/img/add_to_slack.png 1x, https://platform.slack-edge.com/img/add_to_slack@2x.png 2x\" /\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003cimg alt=\"Whirl home tab\" width=\"600\" src=\"https://files.ifvictr.com/2020/08/whirl_home.png\" /\u003e\n    \u003cimg alt=\"Example chat\" width=\"1000\" src=\"https://files.ifvictr.com/2020/08/whirl_messages.png\" /\u003e\n\u003c/p\u003e\n\n## Deploy\n\n[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy)\n\n## Setup\n\nWhirl comprises of four components:\n\n1. The web server for receiving and responding to event payloads from Slack\n2. A **MongoDB database** to save chat metadata (e.g., start time, message count, participants, etc.) after a chat has ended\n3. A **Redis cache** for storing references to the users who should receive messages from a chat while it is ongoing\n4. The Slack app itself\n\n### Environment variables\n\nHere are all the variables you need to set up on the server, with hints.\n\n```bash\n# Port to run the server on\nPORT=3000\n\nDATABASE_URL=mongodb://…\nREDIS_URL=redis://…\n\n# App config. Obtained from the \"Basic Information\" page of your app.\nSLACK_CLIENT_ID=…\nSLACK_CLIENT_SECRET=…\nSLACK_SIGNING_SECRET=…\n# Can be anything you want it to be.\nSLACK_STATE_SECRET=…\n\n# A chat must have at least this many messages for its metadata to be saved.\nCHAT_METADATA_THRESHOLD=3\n```\n\n### Starting the server\n\n_This section is only relevent to you if you’ve decided to run Whirl on a platform other than Heroku._\n\n```bash\ngit clone https://github.com/ifvictr/whirl\ncd whirl\n\n# Install dependencies\nyarn\n\n# Start Whirl in production! This will build the source files and then run them.\nyarn start\n# Or, if you need to run it in development mode instead.\nyarn dev\n```\n\n### Creating the Slack app\n\nFor Whirl to work, you’ll need to [register a Slack app](https://api.slack.com/apps) with the appropriate OAuth permissions, event subscriptions, and commands.\n\n#### App Home\n\nFor Whirl to work, you’ll need to enable both the **Home** and **Messages** tabs of the app.\n\n#### Interactivity \u0026 Shortcuts\n\nFor the **Request URL** under the **Interactivity** section, enter `http://\u003cYOUR DOMAIN HERE\u003e/slack/events`. This will be used for the app’s buttons.\n\n#### Slash Commands\n\nThe following commands are needed. Enter the same request URL you used in the previous section.\n\n- `/end`: Ends the current chat\n- `/next`: Go to the next chat\n\n#### OAuth \u0026 Permissions\n\nInstall the Slack app to your development Slack workspace first.\n\nThe following bot token scopes are required:\n\n- `chat:write`: Used for sending messages.\n- `chat:write.customize`: Used for sending messages to the receiving side of a chat with the sender’s pseudonym.\n- `commands`: Used for `/end` and `/next`.\n- `im:history`: Used for reading the messages a user sends in a DM with Whirl. If they’re in a chat, Whirl will send it to the other users with a pseudonym.\n- `reactions:read`: Used for notifying users that reactions aren’t currently supported 😞\n- `reactions:write`: Used for chat read receipts.\n\n#### Event Subscriptions\n\nSubscribe to the following bot events:\n\n- `app_home_opened`\n- `message.im`\n- `reaction_added`\n\nThe request URL is also the same here.\n\nAfter you’ve followed all the above steps, you should see something like this in the console:\n\n```bash\nStarting Whirl…\nListening on port 3000\n```\n\n## License\n\n[MIT License](LICENSE.txt)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fifvictr%2Fwhirl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fifvictr%2Fwhirl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fifvictr%2Fwhirl/lists"}