{"id":47942665,"url":"https://github.com/datashaman/emoji-pit","last_synced_at":"2026-04-04T08:12:46.015Z","repository":{"id":346859790,"uuid":"1191940541","full_name":"datashaman/emoji-pit","owner":"datashaman","description":"Real-time Slack emoji reaction visualizer with Matter.js 2D physics","archived":false,"fork":false,"pushed_at":"2026-03-26T14:01:50.000Z","size":246,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-26T19:14:11.328Z","etag":null,"topics":["emoji","matterjs","physics","real-time","slack","slack-bot","typescript","visualization","websocket"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/datashaman.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-25T18:27:37.000Z","updated_at":"2026-03-26T13:46:50.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/datashaman/emoji-pit","commit_stats":null,"previous_names":["datashaman/emoji-pit"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/datashaman/emoji-pit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datashaman%2Femoji-pit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datashaman%2Femoji-pit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datashaman%2Femoji-pit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datashaman%2Femoji-pit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/datashaman","download_url":"https://codeload.github.com/datashaman/emoji-pit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datashaman%2Femoji-pit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31392345,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T04:26:24.776Z","status":"ssl_error","status_checked_at":"2026-04-04T04:23:34.147Z","response_time":60,"last_error":"SSL_read: 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":["emoji","matterjs","physics","real-time","slack","slack-bot","typescript","visualization","websocket"],"created_at":"2026-04-04T08:12:45.078Z","updated_at":"2026-04-04T08:12:46.005Z","avatar_url":"https://github.com/datashaman.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Emoji Pit\n\nReal-time Slack emoji reaction visualizer with Matter.js 2D physics. Reactions fall and pile up in configurable sentiment groups with realistic collision and rotation. Supports multiple Slack workspaces via OAuth.\n\n## Setup\n\n### 1. Create a Slack app\n\n1. Go to https://api.slack.com/apps → **Create New App** → **From scratch**\n2. Under **OAuth \u0026 Permissions**, add these **Bot Token Scopes**:\n   - `reactions:read`\n   - `emoji:read`\n   - `chat:write`\n   - `channels:history`\n   - `users:read`\n3. Under **OAuth \u0026 Permissions** → add a **Redirect URL**: `https://your-domain.com/api/slack/oauth`\n4. Under **Event Subscriptions** → enable, set Request URL to `https://your-domain.com/api/slack/events`, then **Subscribe to bot events**:\n   - `reaction_added`\n   - `reaction_removed`\n   - `emoji_changed`\n   - `app_home_opened`\n5. Under **Sign in with Slack** → add a **Redirect URL**: `https://your-domain.com/api/auth/callback`\n6. Copy your **Client ID**, **Client Secret**, and **Signing Secret**\n\n### 2. Configure\n\n```bash\ncp .env.example .env\n# Fill in SLACK_CLIENT_ID, SLACK_CLIENT_SECRET, SLACK_SIGNING_SECRET, BASE_URL\n```\n\n### 3. Run\n\n```bash\nnpm install\nnpm run dev\n```\n\nOpen http://localhost:3000 — you'll see a landing page with \"Add to Slack\" and \"Sign in with Slack\" buttons.\n\n### 4. Install to a workspace\n\nClick \"Add to Slack\" to install the app. This creates an OAuth installation and redirects you to the dashboard. Invite the bot to channels where you want to track reactions.\n\n## How it works\n\n```\nSlack workspace\n     │  reaction_added event (HTTP Events API)\n     ▼\nserver/api/slack/events.post.ts (Nitro API route)\n     │  EventEmitter bus\n     ▼\nserver/routes/_ws.ts (Nitro WebSocket, session-scoped)\n     │  WebSocket broadcast\n     ▼\npages/index.vue (browser)\n     │  canvas animation\n     ▼\nEmoji pit — reactions fall and pile up with 2D physics\n```\n\n## Features\n\n- **Multi-workspace**: Install in multiple Slack workspaces via OAuth\n- **Sign in with Slack**: Users authenticate to view their workspace's pit\n- **Scope toggle**: View all workspace reactions or just your own\n- **Configurable buckets**: Admins set workspace-default emoji groups, users can override with personal buckets\n- **App Home**: Stats dashboard in Slack with top emoji and bucket config summary\n- **Real-time**: WebSocket streaming with Matter.js physics\n\n## Default emoji groups\n\n| Column   | Examples                              |\n|----------|---------------------------------------|\n| Love     | ❤️ 😍 💛                             |\n| Celebrate| 🎉 ✨ 🏆                             |\n| Hype     | 🔥 🚀 ⚡ 💪                          |\n| Agree    | 👍 ✅ 🤝                             |\n| Funny    | 😂 🤣 😆                             |\n| Thinking | 🤔 👀 🧠                             |\n| Negative | 👎 😢 😡                             |\n| Other    | everything else                       |\n\nGroups are configurable per workspace and per user at `/settings`.\n\n## Deploy\n\n```bash\nnpm run build\nnode .output/server/index.mjs\n```\n\nFor Laravel Forge with PM2, use `instances: 1` and `exec_mode: \"fork\"` (single process required for in-memory event bus).\n\nNginx needs WebSocket upgrade headers for the `/_ws` path:\n\n```nginx\nlocation /_ws {\n    proxy_pass http://127.0.0.1:3000;\n    proxy_http_version 1.1;\n    proxy_set_header Upgrade $http_upgrade;\n    proxy_set_header Connection \"upgrade\";\n    proxy_set_header Host $host;\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdatashaman%2Femoji-pit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdatashaman%2Femoji-pit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdatashaman%2Femoji-pit/lists"}