Inspiration

Solo streamers juggle content, chat and pacing. An alert can announce a raid, but it does not connect the response to the show the streamer planned. We brought the rundown to that moment: a sequence of blocks, each with a goal and a time budget, connected to live social obligations.

What it does

Run of Show keeps one readable cue on a 720×220 OBS browser source. Nine deterministic rules consider the current block, elapsed time, EventSub events and observed chat activity. A raid becomes a thank-you with a deadline; quiet chat gets a question tied to the block goal; an overlong segment gets a wrap-or-extend prompt. Competing cues stay in a priority queue, with their reason and source visible. The human acknowledges and advances.

Chat can participate through a local two-option vote using !1 and !2. The first ballot from each stable Twitch user ID counts. A timer or manual close produces the result, including explicit ties and no votes. A post-show report compares recorded block times with the plan and counts answered and missed obligations.

A five-block scripted show exercises every automatic rule and a vote without credentials, a paid model or an external connection. Replay and live input use the same normalized show actions and engine. A judge can run the interesting path immediately.

Why it matters

The audience event, the pacing decision and the next sentence are in one place. The streamer keeps control of the show while spending less attention translating scattered signals into a response. The block goal gives quiet-room prompts context, and the report makes a plan's drift visible after the stream.

How AI is used at runtime

AI does not choose advice. The rules first select one obligation. Optional Gemini phrasing can then choose only from faithful English wordings approved for that selected action. Unlisted text, a changed action, invalid output, an error or a request/body timeout falls back to the exact template. The hard deadline is two seconds, and the panel labels the actual source. Templates appear immediately, so a provider never freezes the show clock. Replay ignores ambient Gemini keys and makes no provider request.

How Codex was used

The human chose the product, rundown model, nine rules and priorities, four permitted inputs, read-only scope and the model's restricted role. The human approved the spike baseline and local vote defaults.

Codex implemented the Node ESM application, SQLite checkpoints, OAuth flows, EventSub handoff/revocation handling, IRC ingestion, rules, bounded phraser, editor, SSE overlay, replay, voting and reports. It wrote positive and negative rule fixtures, tested an intentional overrun-boundary mutation and drove installed Chromium for UI evidence.

P8 used separate standards and spec review agents. They confirmed five issues: unsafe model wording, rejected OAuth replacement reconnecting old clients, saved-mode startup handling, reconnects discarding valid spike-baseline history, and Shift-modified hotkeys. Each was fixed, given regression coverage and re-reviewed. This is recorded agent review; we do not describe it as an unperformed human review.

How it is built

There are no runtime dependencies or build step. Node's built-in HTTP server serves the editor, OBS page and one-way SSE. Native SQLite stores the plan and runtime checkpoints. User OAuth feeds read-only EventSub WebSocket and IRC clients for the authorized user's own channel. Normalized events enter pure show actions and a now-driven rules engine. Optional bounded phrasing follows the decision; presentation then reaches the panel.

The same boundaries permit fake providers, explicit test clocks and deterministic replay without accounts or a network. Restart keeps acknowledgements and script position. A mismatched saved input mode pauses explicitly instead of converting a show silently.

Challenges and lessons

API verification corrected assumptions about WebSocket user tokens and authenticated IRC. Rules claiming to know whether someone spoke were removed because the product has no audio or gameplay input. A precise chat-spike definition needed complete observed windows, including valid baseline history before reconnect gaps. Negative fixtures and independent review found cases a positive-only demo would have missed.

What is verified

The current suite passes 180 tests with fake providers and external network guards, including a regression for heartbeat delivery jitter found in a real-channel test. Browser checks cover source labels, controls, plain and modified hotkeys, votes, reports, restart/reconnect, mobile layout and the native/1080p overlay. Clean-directory evidence uses no .env, provider credentials, dependency installation or hosted service.

Real own-channel application OAuth, five enabled EventSub subscriptions, chat/voting and intentional loss/reconnection were verified on 2026-10-25. Actual social-event notifications and a real Gemini response remain unverified. Native OBS Studio 32.2.1 on macOS captured the replay and real-chat tests to local 1920×1080, 60fps videos; see screenshots/computer-use.json and screenshots/twitch-live.json. Earlier screenshots are browser fixtures, and source: llm images use a mock provider. No claim of real Twitch delivery is made from those fixtures. The public creator-narrated demo uses the real-chat source takes and an explicitly labelled walkthrough of saved Codex build evidence. It includes the creator’s camera, original voice and English captions; scripted replay is labelled. An actual authenticated clone of the private implementation checkpoint also passed 179 tests and offline startup; see screenshots/remote-clone.json. No second-machine run is claimed.

Judge testing instructions

The source package requires Node 22.5+ and npm. The earlier 179-test suite passed on Node v26.12.1 and v22.23.2; the current 180-test suite passed on v22.23.2.

npm start

Open http://localhost:8787/ and http://localhost:8787/panel. A fresh database starts Raid night at 10× speed. A halfway cue appears around nine seconds, silence rescue around 29 seconds, the raid cue around 36 seconds, and the show ends around two minutes. Open its report to see Build segment +03:00 and the 2–1 Oak vote. The editor has Stop and Replay demo controls. No account, .env, install or API key is needed.

npm test
npm run test:offline
npm run test:clean -- --full

The full clean check copies candidate files to a temporary directory, strips credentials, blocks external connections and runs the actual npm start through the complete default replay. It verifies all nine visible rules plus the vote result, the five blocks, template source labels and the ended-show report. It takes roughly two minutes after tests. This is a clean candidate copy, not proof of a remote clone or another physical machine.

For actual own-channel setup, use the two OAuth paths in the README. For exact OBS source dimensions, use the setup guide.

Built With

Share this project:

Updates

Submission history