Inspiration

A viewer suggests a route, fixes an audio problem or starts a running joke. The streamer adopts it, but that contribution disappears in the chat scroll. Credits Roll gives those moments an on-screen credit and a place in the stream's closing credits.

The key question is not whether a message is popular or on topic. It is whether the streamer actually used it.

What it does

Credits Roll listens to a Twitch broadcast and reads its chat together. It looks for explicit spoken adoption of a viewer's message, then shows an OBS pop-up such as "@mapmaker moved the stream: Try the northern bridge." It classifies the contribution as an idea, assist or riff, gives it reputation points and saves a short quote with the streamer's adopting words.

The dashboard explains each credit and keeps a searchable history across restarts. End credits list credited viewers with their quotes. Optional live clips and VOD markers help preserve a moment; media failures never block a credit. A separate bot account can announce confirmed clips, end credits and wheel winners. It never answers chat questions.

On eligible Affiliate or Partner channels, viewers can enter a reputation-weighted Channel Points wheel for creative prizes. Credited viewers' entries can be refunded without removing them from the draw. A native Twitch Prediction lets chat forecast whether it will move the stream at least three times during a measurement period. The app counts credits, proposes the result and gives the streamer 120 seconds to correct it. Twitch alone distributes Prediction points and refunds canceled entries; Credits Roll never creates Channel Points or pays money.

Auto language follows the stream's language, including Spanish, while explicit language choices remain available. Auto-listen can wait for a channel to go live and recover after a restart. Matching estimates influence; it does not prove causation.

How we built it

Most of the application was built over thirteen turns in one main Codex thread: 01a1760f-9f48-7093-9e77-540f44c5027b. I supplied the product idea, stack, priorities and feedback from streaming. Codex wrote the TypeScript backend, SQLite store, private credit ledger, Twitch integrations, audio/transcription pipeline, matcher, scoring, OBS overlay, dashboard, offline providers, synthetic fixtures, tests and documentation.

Planning and independent reviews happened outside Codex, including Claude Code as a planning/review assistant outside the repository. Deployment and infrastructure were handled separately outside Codex. They are not claimed as Codex's work. Project code and fixtures were newly written during the hackathon; standard libraries provide the framework and tooling.

The backend uses Fastify and SQLite. The overlay uses Vite, TypeScript and canvas, with server-sent events for updates. Twitch EventSub uses outbound WebSockets. Live audio goes through streamlink and ffmpeg into OpenAI transcription; embeddings and a JSON judge evaluate candidate messages. Provider interfaces and deterministic fakes let judges run the rehearsal without Twitch credentials or an API key.

Challenges we ran into

  • Distinguishing a genuinely adopted contribution from a greeting, answered question or merely related topic. We require spoken adoption, track ordering and keep negative controls in the synthetic evaluation.
  • Making Spanish streams work on a fresh installation. Auto resolves and refreshes the stream language, and the judge considers Spanish and mixed-language meaning.
  • Keeping capture running through transient provider failures and empty cached Twitch responses without displaying a stale Listening state.
  • Testing beyond one working tree. Fresh Windows clones exposed line-ending assumptions, and an installed-browser check caught a native fetch invocation regression.
  • Making recognition durable while supporting privacy requests. The ledger stores short evidence excerpts, and privacy commands erase local viewer records. Twitch-hosted clips require separate deletion by the streamer.

Accomplishments that we're proud of

We built the complete chat-to-credit pipeline, OBS pop-ups, explainable credit history and closing credits, with live integrations and a credential-free way to try the product.

November 1 fresh-clone verification recorded 403 passing tests across 58 files with external network requests blocked. The offline rehearsal produced five moments from four fictional viewers, followed by end credits. Browser checks exercised the dashboard and overlay. These are deterministic software checks, not a live recognition accuracy measurement.

Optional real clips, markers, Prediction outcomes, payouts and wheel refunds still need feature-specific live evidence; the offline tests do not certify them.

What we learned

Recognition needs an explanation: both what the viewer wrote and what the streamer said when adopting it. The dashboard therefore shows the evidence alongside each credit.

Live reliability also needs visible state. Listening, Standby, a provider rejection and a reconnecting dashboard mean different things. Language warnings, audio/chat ages and counter-only diagnostics make those differences inspectable without printing live conversations.

Offline fakes make development repeatable. They do not replace checking Twitch permissions, actual payouts, clip timing or model quality on a real channel.

What's next

Expand the multilingual evaluation and review false credits and missed adoptions before changing matching thresholds. Verify individual clip, marker, Prediction and refund behavior on real streams. Improve onboarding and make the recognition easier for streamers and their communities to understand.

Try it yourself

The public repository contains source, assets and setup instructions: https://github.com/0xultravioleta/credits-roll

Use Node.js 22.13 or later within Node 22, and npm 10 or later. From the repository directory, run:

npm ci
npm run demo -- --port=3101

Open http://localhost:3101/dashboard and http://localhost:3101/overlay/?preview=1. Wait about 48 seconds for five synthetic moments, four fictional viewers and the end credits. No Twitch account or OpenAI key is needed. Installation requires registry access or a populated npm cache; the rehearsal itself makes no external requests.

After playback, use "Try it without being live": simulate a viewer message, then simulate the streamer speaking within 90 seconds. Watch the credit, then try that panel's Roll credits and Spin the wheel controls. All inputs are synthetic; practice spends no Twitch points and posts nothing to Twitch. Local demo media is labeled "Demo clip - not on Twitch."

If port 3101 is busy, use --port=3102 and the printed URLs. Leave the terminal open while testing; Ctrl+C stops the demo.

Built With

Share this project:

Updates

Submission history