Twitch chat is excellent at connecting viewers to the streamer, but it rarely connects viewers meaningfully with one another.

During an exciting or controversial stream moment, thousands of viewers may share the same reaction. Some may disagree with a character choice, feel disappointed by an outcome, find a guest frustrating, or want to celebrate an unexpected play. These viewers are technically together, but their messages quickly disappear into a fast-moving feed. They may never realize that other people feel the same way.

Existing chat is organized as one large conversation directed toward the streamer. It is not designed to help small groups of viewers discover each other around a specific live moment.

That inspired Roommate: a Twitch Extension that detects meaningful shared reactions and creates temporary, invite-only rooms for compatible viewers from the same stream. What Roommate does Roommate monitors the conversation happening in a Twitch channel and looks for emerging topics, opinions, and emotional reactions.

It does not create rooms simply because viewers repeated an emoji or copied the same message. Instead, it looks for several distinct viewers expressing a coherent reaction in their own words.

For example, imagine a streamer must choose between two game characters and selects Nova. Several viewers believe Brim would have been the better choice:

  • “kai would have worked much better here.”
  • “Picking ray was a mistake.”
  • “This lineup really needed Speed.”
  • “I cannot believe they skipped the stronger option.” Roommate recognizes that these messages refer to the same live moment and represent a shared viewpoint. It can then create a temporary room such as “Justice for Brim” and invite the relevant viewers.

The invitation appears through the Twitch Extension. Joining is always optional. Viewers who accept can continue watching the stream while discussing the moment in a smaller room with people who had a similar reaction.

Rooms are:

  • Limited to viewers from the same Twitch stream
  • Created around a specific live moment or opinion
  • Invite-only rather than publicly searchable
  • Temporary and automatically expiring
  • Equipped with leave, mute, dismiss and report controls How we built it Roommate uses a two-stage detection architecture designed for fast-moving chat.

First, a local processing pipeline receives real Twitch chat messages through EventSub. It removes low-information messages, repeated spam and emote storms. It incrementally groups substantive messages using text similarity, viewer diversity, coherence and activity within a rolling time window.

This local layer handles the high-volume work without sending every chat message to an external language model.

Only strong topic candidates are sent to Groq using the openai/gpt-oss-120b model. The model reviews a small amount of supporting evidence, determines whether the candidate represents a meaningful shared reaction, identifies different viewpoints and generates a relevant room title.

A viewer-matching layer then assigns interested viewers to temporary rooms. The Extension backend verifies Twitch-signed JWTs so invitations are returned only to the correct linked viewer and channel.

The Extension interface provides:

  • Viewer-specific invitations over the Twitch video
  • Explicit identity-sharing consent
  • Optional room joining
  • Temporary room messaging
  • Dismiss, leave, mute and report actions The backend is deployed on Render, while Twitch hosts the Extension frontend through its Extension CDN. Challenges we faced The first challenge was speed. A topic is only useful while viewers still remember the moment that caused it. Sending every chat message directly to a language model would have been too slow, expensive and vulnerable to API rate limits. We solved this by performing filtering and clustering locally and reserving the language model for compact, high-confidence candidates.

Another challenge was distinguishing meaningful reactions from noise. Twitch chat contains emotes, repeated phrases, jokes and coordinated spam. Early versions sometimes treated repetition as genuine agreement. We added duplicate penalties, substantive-message checks, viewer-diversity requirements and coherence thresholds.

Room generation also required careful tuning. Initially, too few rooms formed because language-model approval was overly strict. After testing different live-chat situations, we adjusted the criteria to recognize informal entertainment reactions without accepting meaningless activity.

Identity was another important challenge. EventSub identifies the authors of chat messages, while Twitch Extensions initially provide opaque viewer identities. Roommate uses Twitch’s identity-linking flow—with explicit viewer consent—to connect a chat participant to the correct private invitation.

We also had to work within Groq request and token limits. Roommate uses a latest-only scheduler, cooldown periods, bounded evidence and automatic backoff so older candidates do not overwhelm more relevant live moments. What we learned We learned that meaningful viewer connection does not require replacing Twitch chat. Large public chat is valuable for collective energy, while Roomamte adds a second layer for smaller, more focused conversations.

We also learned that language models are most effective here as selective reasoning components rather than the entire processing pipeline. Fast local processing handles volume; the model provides contextual judgment and human-friendly naming.

Codex helped us research Twitch EventSub and Extension requirements, design the real-time architecture, implement the detector and room system, troubleshoot rate limits, build the Extension interface, add JWT verification, write tests and prepare the deployment. What is next The next stage is improving moderation, persistence and topic quality using feedback from real streams. We also want to explore better multilingual matching, adaptive thresholds for different chat speeds and broadcaster controls for managing how and when rooms can form. Roommate goal is simple: transform a reaction that would normally disappear in seconds into a meaningful connection between viewers.

Built With

Share this project:

Updates

Submission history