Inspiration

ODDBOUT is an agent community for character IP. People describe a character; their agents bring it to life, drawn, animated and ready to fight in an automatic arena.

But a character only truly comes alive when people cheer for it, and nobody cheers together like a Twitch chat. ODDBOUT Twitch Cup closes that loop: the fighter your agent made this afternoon can be called into the ring by your chat tonight.

What it does

1 · Create in Codex

Connect Codex to the ODDBOUT MCP server (https://mcp.oddbout.com/mcp) or install the ODDBOUT plugin, and ask in plain English. Dots, our creator agent in Codex, designs the look, animates every move (walks, attacks, hits, falls and KOs), walks you through each review, and sends the finished fighter to ODDBOUT through the MCP tools.

2 · Register on oddbout.com

ODDBOUT validates the package (fighter schema, file hashes, frame layout) and registers the fighter to its creator. One confirmation later, the fighter is entered for competition.

3 · Fight on Twitch

The streamer opens oddbout.com/twitch.html, connects Twitch with read-only chat access, and captures the page in OBS. Viewers type !join <fighter>. The first four viewers to claim different fighters take the slots. One press of Start cup, and two semifinals and a final play out in the arena on stream, ending with a champion and the viewer who backed it.

Built for the stream

  • Every fighter is a chat command. Our own fighters join by name (!join kuma); creator fighters join by their English name (!join velora).
  • Three ways to run it. Live with four different viewers, Solo rehearsal for a streamer testing with their own chat, and Try without Twitch for anyone, no account needed. Stream view hides the host tools for a clean capture.
  • Fair by design. Every winner comes from the fight engine, by KO or decision, never from a random pick. Cup bouts are exhibitions and never touch rankings, records or rewards.

How we built it

In one line: with Codex, we built a creator agent that turns a few keywords and a single reference image into a stylish, anime-style fighter, built the ODDBOUT MCP server and plugin so that agent runs inside a Dots VM, and built the Twitch Cup that puts those fighters on a live stream.

1 · Character planning

  • From keywords to a brief. Codex (gpt-6-sol, every tool switched off, the user's words treated as data) turns a short request into a structured brief: a safety verdict (no real people, no sexual content, no hate or gore), names in English and Korean, a concept, three lines of personality (a challenge, a victory line, a defeat line), stats for power, toughness and speed, a 60–150-word look with a 2–6 colour palette, a signature prop and an avoid list, and a fighting temper (heavy, balanced or light) with one signature attack.
  • One reference image, one house style. The creator's picture (up to two, used only after the creator confirms the rights) defines who the character is; a house colouring guide and a style-anchor image, attached to every generation, define how every ODDBOUT fighter looks.
  • Two fronts, side by side. Take A is the most faithful reading of the request; Take B is a deliberately different design of the same character. The creator picks one or asks for a change in one sentence (twice at most), or delegates the choice to a Codex judge that checks that the figure is whole, front-facing, on style, true to the request and clean.
  • Front first. The chosen front becomes the fighter's profile card, and every motion is drawn from a side still made from it, so the look never drifts.

2 · Motion planning

  • Built to the game contract. Every fighter needs 11 motions (idle, fight-idle, walk, run, combo, slam, dash, block, hit, groggy, and a fall with get-up), drawn facing right at a 400 px body height under our 16° camera; a special skill, an entrance and a victory pose are optional.
  • Keyposes in rows. Codex draws six rows of keyposes: stance and guard, two combo rows (three strikes, a recovery and a dash), a slam, hurt reactions (recoil, stagger, dizzy) and a five-step KO (snap, fly, crash, lie, rise). The first pose of every row is the standing pose, used as the scale reference, and every prompt carries the fighter's temper and signature attack.
  • Timing from our game. Keyposes are timed by beat templates ported from the ODDBOUT engine (holds in milliseconds plus drawn impact "jolts"), and contact frames are marked automatically.
  • Walks and runs as video. Walk and run cycles are filmed in place from the side still with Grok video; the engine cuts one clean cycle, and a Codex judge checks identity, anatomy and the loop seam.
  • Five review stops. In Dots, the creator reviews appearance → idle, walk and run → attacks → block, hit and fall → final package. Feedback such as "shrink the ears" or "the walk is too bouncy" redoes only that piece.

3 · Verifying every frame with sprite-gen-agent

Our fork of sprite-gen (https://github.com/aldegad/sprite-gen) gives the agent measurable gates instead of "looks fine to me":

  • Pose plans that must make physical sense: feet in contact stay within 2 px of the ground line, a walk never leaves the ground while a run must, and proportions may drift no more than 8% and scale no more than 4% across frames.
  • Geometry audit: a body-only fit (scale 0.85–1.15, shift ≤ 8%) with independent foot checks; a hidden point is reported as unverified, never as a pass.
  • Reviews bound to pixels: every pose review and sequence review (alternation, foot sliding, continuity, loop seam) is tied to the image hash, and per-stance foot-contact coverage must pass before export.
  • Consistent size: a head-matched scale check keeps a fighter the same size in every move.
  • A second opinion, kept honest: gpt-6-luna screens frames and sequences for identity, anatomy, pose match and contacts, and only answers at 0.8 confidence or higher count. It advises; it never passes a frame by itself.
  • Game-ready output: a deterministic, lossless WebP atlas with explicit frame rectangles, durations and anchors, so the game never guesses a grid.

4 · Running inside a Dots VM

  • Each creator's own machine. Dots runs the kit in a saved Codex Cloud Linux VM per user, with the creator's own Grok subscription through device sign-in, never an API key.
  • One pinned install. Node 22.22.2 (SHA-256 checked) and the Grok CLI 1.0.70 from a lockfile with install scripts disabled; the kit itself is fetched at one exact pinned release commit (0.6.10).
  • Clean by construction. A clean-image check refuses any image that already carries a login or a secret key, and the kit refuses paths into credential folders.
  • Private pictures stay private. Reference images travel through a sealed handoff: the VM creates its own key pair, the five-minute download grant is encrypted to it, and the file is hash-checked and fully decoded before use.
  • Always one next step. node dots.mjs tells the agent exactly what to do next: repair, resume a job, connect Grok, or prepare a new fighter.

5 · The ODDBOUT MCP server and plugin

  • One server for every agent. A stateless Streamable HTTP MCP server on Supabase Edge Functions behind mcp.oddbout.com, with OAuth (dynamic client registration, PKCE, Google sign-in). It works from Codex, ChatGPT and Dots, Claude, Grok and the Gemini CLI.
  • 54 tools for the whole journey: hosted generation (request a fighter, pick a look, revise a motion, register), packaging and registration (contract, hash-checked uploads, submission), profile cards, and the arena (rankings, cups, sparring, entering a fighter).
  • Safety on every write: rights confirmation for every user picture, idempotency keys so retries never duplicate work, uploads that must match their SHA-256, short-lived deletion tokens, daily limits and a token allowance per account.
  • Plugins: the ODDBOUT creator plugin (0.6.10) bundles the create-fighter skill and the MCP connection behind a hash-verified launcher; a Codex plugin installs from our Git marketplace; and the ChatGPT/Dots app (1.0.3) is submitted for review with documented review cases.
  • Tested: dedicated suites cover the cloud MCP, the gateway, account connection and the plugin bundles.

6 · The Twitch Cup

  • Codex built the live show: Twitch sign-in (implicit grant, chat:read only), the chat client, the bracket state machine, solo rehearsal mode and the battle host that runs every bout.
  • Codex shipped it as open source: one Codex session extracted the cup into the standalone repository. gpt-6-astra orchestrated and reviewed, gpt-6.1-sol took the code changes, and gpt-6-luna took the copying, audits and test runs. The session kept only our original fighters, verified the build, the tests and complete cups in a real browser, scanned for secrets, and published.

Under the hood of the Twitch Cup

  • Stack: TypeScript, Vite, Phaser 3 and Vitest, with Twitch chat over IRC on a WebSocket and creator fighters read from the ODDBOUT registry through public, read-only requests.
  • Deterministic fights: a pure, seeded 60 Hz fixed-step simulation. Same seed, same fighters, same bout, every time.
  • One battle host per cup: the page keeps a single iframe for the whole tournament and swaps bouts with postMessage commands, each checked by origin, by frame and by a one-time attempt token. A watchdog retries a stalled bout once with the same fighters and seed.
  • Creator fighters, verified at bout time: each package is loaded by id, hash-checked and validated against the fighter schema, and its approval is re-checked before every bout.

Challenges we ran into

  • Loading stalls. Reloading the bout iframe for every match occasionally stalled the next bout in testing, so the cup now keeps one game document and swaps only the battle scene.
  • Twitch's redirect rules. Twitch accepts only localhost for HTTP redirect URLs; the page detects 127.0.0.1 and offers the localhost link instead.
  • Names chat can type. Creator fighters needed commands a viewer can type. English names become lowercase commands; when two fighters share a name, the older one keeps it and the newcomer receives f plus the start of its id.
  • Heavier fighters. A creator package weighs about 7 MB, so bouts with creator fighters get a longer loading window, and Retry match rebuilds the battle frame to read a fresh package.
  • Rights. The public repository ships only fighters we designed ourselves.

Accomplishments that we're proud of

  • A complete creator pipeline (plan, draw, animate, verify, register) that runs inside each creator's own Dots VM and is driven entirely through conversation.
  • A fighter designed and animated by an agent in Codex entered a live Twitch bracket from a single chat command.
  • We took the cup live on our own Twitch channel in solo rehearsal mode: chat filled the bracket, and the semifinals and final played out to a champion on stream.
  • No game server required. The bracket runs in the browser, every bout is deterministic, and the chat connection is read-only.
  • Anyone can play it in seconds at oddbout.com/twitch.html with Try without Twitch.

What we learned

  • MCP turns creation into a conversation. Planning, drawing, animating, reviewing and registering all happen without the creator leaving the chat.
  • Measurable gates beat good intentions. Generated animation fails in small, specific ways: a sliding foot, a seam in the loop, a fighter who shrinks between moves. Turning each into a number or a pixel-bound review is what made the pipeline trustworthy enough to hand to an agent.
  • An agent is only as reliable as its environment. Pinning every tool, refusing images that carry secrets, and giving the agent one explicit next step turned a fragile setup into something a fresh Dots VM can repeat.
  • Matching the model to the task pays off. An orchestrator that plans and reviews, with lighter models on copying, audits and test runs, kept the strongest model for the judgment calls.
  • A live show is only as strong as its boundaries. Checking chat messages, the sign-in popup, iframe messages and fighter packages turns a mysterious failure on stream into a clear message and a clean retry.

What's next for ODDBOUT Twitch Cup

  • Public streams with many viewers, and larger brackets of 8 and 16 fighters.
  • Two-way chat: bracket announcements and results posted back to chat, plus Channel Points and Predictions on each bout.
  • A Twitch Extension overlay, so viewers can follow the bracket without the host page.
  • Streamer-curated pools of creator fighters, so every channel can run its own community league.

Built With

Share this project:

Updates

Submission history