A Chrome extension that estimates real viewer counts on Kick.com by analyzing chat activity in real-time.
Kick has been reported to deflate viewer counts by averaging them over extended periods, which disproportionately hurts legitimate streamers. A streamer watched by 20,000+ people may see their count displayed as a fraction of that.
KickInsights intercepts chat messages via WebSocket and uses participation rate modeling to estimate the real viewer count. It displays the estimate as a range alongside Kick's displayed number, giving streamers and viewers an independent data point.
- Real-time estimation displayed inline next to Kick's viewer count (e.g.,
est. 4.8K-19K) - WebSocket interception captures every chat message with 100% reliability
- Interactive overlay with live graph comparing Kick vs estimated counts -- draggable, resizable, minimizable
- Dashboard popup with real-time stats, charts, and diagnostic counters
- Census mode -- ask chat to type, get a verified floor count and auto-calibrate the model
- Per-channel profiles -- each streamer gets their own learned participation rate
- Session history with CSV, JSON, and PNG summary card export
- Privacy-first -- all data stays local in your browser, nothing is sent anywhere
-
Chat capture: A WebSocket interceptor (injected at
document_start) patches the WebSocket constructor before Kick connects to Pusher. Every chat message is captured in real-time. -
Estimation: Unique chatters in a rolling window (default 5 min) are divided by a participation rate to estimate total viewers. The result is shown as a range using optimistic and pessimistic rates.
-
Calibration: The participation rate starts at 3% and can be adjusted manually. For better accuracy, streamers can run a Census -- ask everyone to type in chat for 60 seconds. The extension counts unique participants and uses the result to calibrate future estimates.
-
Visualization: Both an on-page overlay and popup dashboard show Kick's count vs the estimated range, with the estimation band (dashed low/high lines with filled area).
-
Clone this repository
git clone https://github.com/msanlisavas/KickInsights.git
-
Open Chrome and go to
chrome://extensions -
Enable Developer mode (top right)
-
Click Load unpacked and select the
kickinsightsfolder -
Visit any live stream on kick.com and click the extension icon to start tracking
Coming soon.
- Navigate to a live stream on Kick.com
- Click the KickInsights extension icon
- Click "Start Tracking" to begin monitoring
- View the estimated range next to Kick's viewer count
- Open the popup to see the Dashboard with live stats and graph
For the most accurate results:
- The streamer asks everyone to type something in chat (e.g., "type 1")
- Click Start Census in the popup (or press
Ctrl+Shift+C) - Wait 60 seconds while the extension counts unique chatters
- Review the result and click Apply Calibration to update the model
- Participation rate (0.5% - 20%): Adjustable slider, auto-calibrated by census
- Rolling window (2, 5, or 10 minutes): Time window for counting unique chatters
- Show/Hide overlay: Toggle the on-page graph widget
- Clear data: Per-channel or all data
kickinsights/
├── manifest.json # Chrome Extension Manifest V3
├── src/
│ ├── content/
│ │ ├── ws-interceptor-early.js # WebSocket patch (MAIN world, document_start)
│ │ ├── content.js # Main entry point, wires all modules
│ │ ├── chat-parser.js # Message parsing, unique chatter tracking
│ │ ├── estimation-engine.js # Viewer estimation with confidence/range
│ │ ├── calibration.js # Weighted averaging from census data
│ │ ├── census.js # Active census mode (60s counting)
│ │ ├── viewer-count-reader.js # Reads Kick's CSS odometer display
│ │ ├── dom-injector.js # Injects estimate into page
│ │ ├── overlay-graph.js # Interactive on-page widget
│ │ └── content.css # Injected styles
│ ├── background/
│ │ └── service-worker.js # Session pruning, alarms
│ ├── popup/
│ │ ├── popup.html/css/js # Extension popup UI
│ │ ├── chart-renderer.js # Canvas chart drawing
│ │ └── summary-card.js # PNG summary card generator
│ └── shared/
│ ├── constants.js # Configuration defaults
│ ├── format.js # Number/date formatting
│ └── storage.js # chrome.storage.local wrapper
└── tests/ # Jest test suite (59 tests)
- Chrome Extension Manifest V3 -- no frameworks, vanilla JavaScript
- Canvas API -- for charts and summary card rendering
- WebSocket interception -- patches constructor at document_start
- chrome.storage.local -- all data persisted locally (~10MB limit)
- Jest -- test suite with jsdom environment
cd kickinsights
npm install
npm test # Run all 59 tests
npm run test:watch # Watch modecd kickinsights
bash scripts/build.shThis creates a kickinsights-v{version}.zip ready for upload.
- Chat-based estimation gives a range, not an exact number
- Participation rates vary by channel, language, time of day, and chat restrictions
- Census requires streamer cooperation to be effective
- Chrome only (Manifest V3)
This is an open source project. Contributions, issues, and feature requests are welcome.
- Repository: github.com/msanlisavas/KickInsights
- Issues: github.com/msanlisavas/KickInsights/issues
MIT
Murat Sanlisavas -- @msanlisavas
Crafted by Ekolsoft