# Jackbox Chat Tracker Chrome Extension A Chrome extension for tracking Jackbox game votes (`thisgame++` and `thisgame--`) from Kosmi chat. ## Features - ✅ Tracks `thisgame++` and `thisgame--` votes in Kosmi chat - ✅ Records username, full message, and UTC timestamp - ✅ Case-insensitive matching (works with `THISGAME++`, `ThisGame--`, etc.) - ✅ Matches votes anywhere in the message - ✅ Exports data as JSON in the format expected by the Jackbox Game Picker app - ✅ Real-time vote tracking with live updates - ✅ Simple, intuitive interface ## Installation 1. Open Chrome and navigate to `chrome://extensions/` 2. Enable "Developer mode" in the top right 3. Click "Load unpacked" 4. Select the `chrome-extension` folder 5. The extension is now installed! ## Usage ### Starting a Tracking Session 1. Navigate to a Kosmi room: `https://app.kosmi.io/room/...` 2. Click the extension icon in your browser toolbar 3. Click "Start Tracking" 4. The extension will now monitor chat for votes ### Viewing Votes - The popup shows all recorded votes in real-time - Each vote displays: - Username - Full message text - Timestamp (in your local timezone) - Vote type (positive/negative indicated by color) ### Exporting Data 1. Click "Export JSON" to download votes 2. The file format matches the Jackbox Game Picker import format: ```json [ { "username": "Alice", "message": "thisgame++", "timestamp": "2025-10-30T20:15:00Z" } ] ``` 3. Import this JSON file into the Jackbox Game Picker app ### Resetting Votes - Click "Reset Votes" to clear all recorded votes - Confirmation dialog prevents accidental resets ## How It Works The extension hooks into Kosmi's GraphQL WebSocket API (`wss://engine.kosmi.io/gql-ws`) to monitor real-time chat messages. This is much more reliable than DOM parsing! When a message is received, the extension: 1. Checks if it contains `thisgame++` or `thisgame--` (case-insensitive) 2. Extracts the **username** from the GraphQL response 3. Extracts the **full message text** 4. Records the **UTC timestamp** ### Why WebSocket? Previous versions used DOM parsing (MutationObserver), which was fragile and prone to breaking when Kosmi updated their UI. Version 3.0.0 uses Kosmi's own GraphQL API, which is: - ✅ More reliable (API is stable) - ✅ Faster (no DOM traversal needed) - ✅ More accurate (username is always correct) - ✅ Less CPU intensive (no constant DOM monitoring) ## Vote Format **Input** (Kosmi chat): ``` Alice: This is great! thisgame++ Bob: thisgame-- not my favorite Charlie: THISGAME++ love it! ``` **Output** (JSON export): ```json [ { "username": "Alice", "message": "This is great! thisgame++", "timestamp": "2025-10-30T20:15:00.123Z" }, { "username": "Bob", "message": "thisgame-- not my favorite", "timestamp": "2025-10-30T20:15:15.456Z" }, { "username": "Charlie", "message": "THISGAME++ love it!", "timestamp": "2025-10-30T20:15:30.789Z" } ] ``` ## Technical Details ### Files - `manifest.json`: Extension configuration - `content.js`: Monitors Kosmi chat and records votes - `popup.html`: Extension popup interface - `popup.js`: Popup logic and controls - `popup.css`: Popup styling - `icons/`: Extension icons ### Permissions - `storage`: Save votes locally - `activeTab`: Access current Kosmi tab - `downloads`: Export JSON files - `https://app.kosmi.io/*`: Access Kosmi chat ### Data Storage - Votes are stored locally using Chrome's `storage.local` API - Data persists across browser sessions - No data is sent to external servers ## Changelog ### Version 3.0.1 (Current) - 🐛 Fixed infinite retry loop when Apollo Client not found - 🐛 Disabled auto-start on page load (user must manually start tracking) - ✅ Added retry limit (10 attempts max, then gives up gracefully) - ✅ Only sets `isTracking = true` after successfully hooking into Apollo Client - ✅ Better error messages with attempt counter ### Version 3.0.0 - 🎉 **Complete rewrite using GraphQL WebSocket API** - ✅ Hooks directly into Kosmi's Apollo Client - ✅ 100% reliable message and username extraction - ✅ No more DOM parsing or MutationObserver - ✅ Lightweight and performant - ✅ Future-proof (API-based, not DOM-based) - ❌ Removed fragile DOM traversal code - ❌ No more "Unknown" usernames ### Version 2.0.2 - 🐛 Fixed sidebar responsiveness with polling updates - 🐛 Fixed MutationObserver not detecting new messages - 🐛 Suppressed "Could not establish connection" errors - ✅ Added extensive debug logging for troubleshooting - ✅ Observer now properly disconnects and reconnects on start ### Version 2.0.1 - 🐛 Fixed duplicate vote counting issue - 🐛 Improved username extraction with multiple fallback strategies - ✅ Re-added sidebar panel support ### Version 2.0.0 - ✅ Simplified to only track `thisgame++` and `thisgame--` - ✅ Removed complex game alias system - ✅ Captures full message context - ✅ UTC timestamp recording - ✅ New JSON export format - ✅ Improved UI with vote preview - ✅ Case-insensitive matching ## Troubleshooting **Extension not detecting votes:** 1. Make sure you're on a Kosmi room page (`app.kosmi.io/room/...`) 2. Click "Stop Tracking" then "Start Tracking" to reset 3. Check browser console for errors (F12 → Console tab) **Votes not saving:** 1. Check Chrome's storage permissions 2. Try resetting votes and starting fresh 3. Ensure extension has permission to access Kosmi **Export not working:** 1. Check Chrome's download permissions 2. Ensure popup blockers aren't blocking downloads 3. Try clicking "Export JSON" again **Extension not loading:** 1. Make sure you've reloaded the extension after updating files 2. Go to `chrome://extensions/`, find "Jackbox Chat Tracker", and click the reload icon 3. Refresh the Kosmi room page after reloading the extension **Apollo Client not found:** 1. The extension needs a moment after page load to find Apollo Client 2. Wait 2-3 seconds after the page loads, then click "Start Tracking" 3. Check console for "Apollo Client not found!" error 4. If error persists, Kosmi may have changed their client framework ## Support For issues or questions, please file an issue in the main repository. ## License Same as main Jackbox Game Picker project.