Chat Makes a Movie

Your chat is the film crew. Viewers claim Actor, Camera or FX, then send fixed Twitch commands to change a little robot-and-star scene. The streamer records three five-second shots into a persistent movie, replays it, retakes just one shot and exports a silent WebM.

This is a local Windows prototype built with Codex. It receives real Twitch chat through official EventSub WebSockets and presents a separate, synchronized 1280×720 OBS Browser Source. A clearly labeled REHEARSAL mode lets judges try the complete creative loop without Twitch authorization.

The live demonstration uses one consenting channel owner's own offline channel and account for all three roles. The owner entered the first six commands; the agent entered the remaining fixed test messages through the ordinary Twitch UI after explicit permission. It demonstrates real Twitch transport, not a multi-viewer audience trial. The operator selects and records shots; chat determines the creative choices before each recording. There is no runtime AI, generated video, automatic posting or payment integration.

Inspiration

Streaming already makes creation social. We wanted the audience's choices to survive beyond an alert: a tiny film they helped direct, with a beginning, middle and end. Three limited creative jobs make cause and effect visible immediately.

What it does

  • Actor controls wave, jump or catch.
  • Camera controls wide, close or pan.
  • FX controls clear, rain or spark.
  • The operator records three five-second shots and replays the complete fifteen-second film.
  • Retaking shot two preserves shots one and three.
  • A local take survives reload; a separate OBS view stays synchronized.
  • WebM export contains the original scene, creative choices and source badge, without chat text or viewer identifiers.
  • Offline rehearsal is explicitly synthetic and cannot enter a LIVE movie.

How we built it

We directed Codex to build and test a new TypeScript project during the competition period. Vite builds two browser entries: the operator studio and a clean OBS output. Node serves both on loopback, keeps Twitch credentials in memory and distributes sanitized state over Server-Sent Events.

A typed command whitelist feeds role ownership, deduplication, cooldowns and a deterministic film reducer. Validated atomic local snapshots preserve the take. Both views render the same Canvas 2D scene and shared play clock. MediaRecorder exports the original scene locally.

Actual OBS testing exposed unsupported modern Canvas APIs in the installed CEF. Codex replaced rounded rectangles with a small quadratic-curve path and targeted compatible overlay JavaScript. Regression tests cover that fix and the creative/privacy boundaries.

Codex usage

Verified build thread/session ID: 01a171e3-97a3-7883-b093-c0f2a133bf4e

The ID was read from the current Codex environment and matched against the desktop thread read API on 25 October 2026. This long-running project chat also contains earlier unrelated work; no public share of its history is included. The entrant supplied the idea, priorities, limits and real Twitch input. Codex implemented the application, automated tests, local tooling and documentation.

A concrete implementation example is src/canvas-path.ts: an original quadratic-curve rounded path replacing an API unavailable in the installed OBS CEF. The compatibility regression is in tests/judge.test.ts. evidence/CODEX_SUBMISSION_PROOF.md is retained locally, outside the judge source package.

No runtime model calls are required by the product. The session ID is supplied for organizer verification; it is not a credential.

Challenges

The hardest parts were keeping an editable three-shot film intact across reloads, synchronizing a read-only OBS output, and supporting an older real OBS browser. We also kept live and synthetic provenance separate through recording, restore and export. Twitch gaps are disclosed instead of inventing missing messages.

Accomplishments

We verified real Twitch role/action messages, three recorded shots, full replay, a shot-two-only retake, persistent restore and local export. The installed OBS 23.1 browser rendered and recorded the clean 1280×720 output in an isolated test profile. Build Pass 03 passed 58 automated tests and 12 HTTP/SSE checks; final rerun evidence is summarized in TESTING.md.

What we learned

A small set of creative choices can read more clearly than unrestricted input. Recording choices into shots gives participation a durable result. Real browser-source testing matters: a working modern browser does not prove the installed OBS CEF supports the same APIs. Explicit provenance and safe restore deserve tests as much as animation does.

What's next

After the competition prototype, the next useful validation is an opt-in test with several real viewers: can they understand and coordinate the three roles? We would measure confusion and pacing before considering more scenes or creative commands. Those features are outside this submission build.

Testing

Baseline: 58 automated tests passed. Final local rerun: 60 tests passed after two export-quality regressions were added; 12 HTTP/SSE checks and strict TypeScript/Vite production build passed. Fixtures cover parser/whitelist, roles, cooldown, deduplication, reducers, retake, persistence, export state, source separation and Twitch reconnect/revocation.

Final QA found that simultaneous video encoders could stall capture and previously produce a tiny file marked successful. The final build rejects inadequate render cadence or excessive capture time before saving. Keep the studio active and export one video at a time; the guard is not a substitute for checking the resulting file/playback.

The real integration baseline used the channel owner's actual Twitch commands and installed OBS 23.1 CEF at 1280×720. Export playback, restore, overlays and a clean-folder install were exercised. A clean folder on the same Windows machine is not a fresh operating-system test. See FINAL_READINESS.md for final manual checks, limitations and any pending evidence. Tests use mocked Twitch transport where stated; they do not imply a large audience test.

Judge offline: run JUDGE_START.cmd, leave REHEARSAL selected and run the walkthrough. Replay, select shot 02, change an action, retake, replay, reload and export. Twitch is optional for offline evaluation and requires your own public Client ID and manual read-chat approval for LIVE mode.

License and rights

The project's original source, geometric Canvas scene and characters were created for this project. No stock imagery, music, generated video or NIGHT SHIFT code is included. Dependency licenses and copyright notices are retained in THIRD_PARTY_NOTICES.txt and package-lock.json.

The author selected private distribution and all rights reserved for original project code, artwork and documentation. LICENSE authorizes free, unrestricted installation, testing, evaluation and use by the competition Sponsor, Administrator and Judges through the Judging Period, without limiting rights granted by the competition rules. No original-code MIT license or general public redistribution license is granted. Third-party licenses and notices remain in force.

Fonts are selected from installed system fonts; font files are not distributed. Rendered video captions do not embed fonts. No third-party logos are intentionally added. Product names identify the integrations and do not imply sponsorship or ownership. The final footage/IP inventory is documented in FINAL_IP_PRIVACY_REVIEW.md. No unresolved UNKNOWN asset may be packaged.

Privacy

The server listens on 127.0.0.1 only. Twitch authorization requests user:read:chat only. Tokens remain in server memory and are cleared by restart/disconnect. There is no chat-send endpoint, bulk raw-chat log, profile collection, analytics, model API or automatic upload.

Whitelisted commands map to fixed typed choices. Session aliases enforce roles and are not saved in film snapshots or exports. The allowlisted local take contains creative state and LIVE/REHEARSAL provenance, without Twitch IDs, names, raw text or credentials. New Movie archives prior creative takes locally. Removing these files is the operator's manual choice.

Live demo input comes from the channel owner. No third-party viewer identity is required in the edited film. Source-code packages exclude .env.local, private state, raw recordings, local evidence and exports. A local download/export is not public sharing.

Built With

Share this project:

Updates

Submission history