Inspiration
A small streamer's chat is a wall of scrolling text. The same question gets asked fifteen times, the streamer sees none of them, and chat concludes the streamer is ignoring them. Big channels solve this with a producer and a moderation team. Solo streamers have nobody. CueSignal is that producer: it reads the flood so the streamer does not have to.
What it does
CueSignal connects to Twitch chat (live via EventSub, or a built-in simulated feed for demos and testing) and continuously clusters near-duplicate messages into cue cards: "what sensitivity do you use?" asked nine different ways becomes one card with a count of 9. Cards are ranked by how many people asked, how many viewers boosted the question with the !boost chat command, how recent it is, and whether it is phrased as a question. The streamer gets a clean dashboard of what chat actually wants to know. One click on Feature sends that cue to a transparent OBS overlay as a broadcast lower-third, so the answered question appears on stream. One click on Dismiss clears it.
How we built it
CueSignal was built in a single main OpenAI Codex session (Codex CLI, session 01a18dda-b213-7a81-9690-ed34a60f5ec5), which architected the app and split the work across its own sub-agents for the clustering engine, the chat sources, and the dashboard. The stack is deliberately lean: Node.js with a single runtime dependency (ws). The CueEngine normalizes chat text (case, punctuation, stopwords, a synonym map such as sens -> sensitivity), clusters messages by Jaccard similarity at a 0.5 threshold, and scores cues as count x 2 + boosts x 3 + recency + question bonus. The Twitch connection is a real EventSub WebSocket adapter that subscribes to channel.chat.message on session_welcome and reconnects on demand; with no Twitch credentials present it disables itself cleanly and the simulated feed takes over, so anyone can run and judge the full loop with zero setup. The server is plain Node http with a same-origin guard on its actions, serving the dashboard, the OBS overlay, and a small JSON API. The whole build is covered by 31 automated tests, all passing.
Challenges we ran into
The clustering threshold was the whole game: too loose and unrelated questions merge into mush, too strict and the same question in different words never merges. We landed on normalization plus synonyms first, similarity second, which is what makes the count on a card trustworthy. The second challenge was honesty in demo mode: a simulated feed is only useful if it behaves like real chat (repeats, near-duplicates, boosts, hype), so the simulator was built to generate exactly the failure modes the engine has to survive. Finally, the EventSub adapter had to be real but optional: judges without Twitch app credentials still get the complete product, and streamers with credentials get live chat by filling three values in a .env file.
What's next
Per-streamer synonym packs, a mod-approval mode for larger channels, and a hosted version so a streamer can run CueSignal without installing anything.
Built With
- api
- codex
- css
- eventsub
- html
- javascript
- node.js
- obs
- openai
- studio
- twitch
- websocket