Inspiration

What if a chat vote changed the next decision, as well as the current one?

That question became REACTOR ROOM: a fictional orbital station with enough reserve to get home, provided its crew agrees on how to spend it. I wanted the audience to have different responsibilities and a reason to coordinate across rounds.

What it does

Viewers join Power, Coolant or Comms through Twitch chat. Each crew votes on its part of a shared plan. A viewer has one role and one current ballot; changing a vote replaces the previous choice.

Three short rounds carry the same reserves forward. Running bypass pumps can preserve coolant while spending power. Isolating the damaged loop preserves electrical reserve at a different cost. Both coordinated routes can succeed, but the next round needs the reserve that the crew kept.

The streamer controls the pace from a director view. A separate broadcast view shows the station, crews, commands and consequences. The clock can close a round, or the streamer can resolve it. A tied crew gets no chosen action and pays a cost.

How I built it

I used Codex to build the deterministic game engine, the director and broadcast interfaces, and the Twitch adapter. The interface uses HTML, CSS and SVG, with JavaScript modules and Node.js servers.

The adapter receives genuine Twitch chat through EventSub and requests only user:read:chat. It does not send messages or start a stream. Credentials and tokens stay in private local storage outside the source tree. Both services bind to loopback.

The game also has a clearly labelled Rehearsal mode. Judges can run a complete local episode without a Twitch account or an AI API. Live Twitch operation requires the operator's own dedicated Twitch application and consent.

Challenges I ran into

The real connection exposed cases that a happy-path demo could miss. A healthy socket handoff must keep accepting validated messages while its replacement connects. An expired round must reject a late ballot at the engine boundary. Changing roles between rounds must preserve the already applied result.

I also tightened account isolation, concurrent OAuth updates and command normalization. Those fixes have focused regression checks.

Accomplishments

The audited revision passed 96 automated tests: 51 app checks and 45 integration checks, including an independent clean installation on Node 20.

After those fixes, a fresh own-channel test delivered three genuine events: join Power, vote reserve, then replace it with cut. The game retained one ballot. The video shows that continuous connection test, followed by separately labelled synthetic rehearsals and authentic source/test artifacts from the Codex build.

The live check used one account and one role. It establishes the demonstrated connection and replacement behavior; audience-scale playtesting is still ahead.

What I learned

Working through the deadline and reconnection cases made the rules more precise. Preserving a ballot during an interruption and clearing derived data when an account changes need different behavior. Making those distinctions explicit improved both the implementation and the way the interface explains its state.

What's next

The next step is a multi-viewer playtest with three real crews, followed by tuning round length, command onboarding and accessibility from that feedback. A hosted version would need a separate deployment and security design. The submitted version is a runnable local application with its own setup instructions.

Built With

Share this project:

Updates

Submission history