The Roaming Trophy — Le Trophée Nomade

Elevator pitch

One shared relic travels between Twitch communities. Rally your chat for a 60-second heist, defend your channel, and write the next chapter of the trophy’s journey.

Inspiration

A raid already connects two communities. We wanted those encounters to leave a shared story: a trophy with one guardian, a visible history and a reason for viewers to rally together. Participation is free and never weighted by subscriptions or Bits.

What it does

Streamers opt in through Twitch. Viewers contribute with !attack and !defend during a 60-second heist. The server decides the result, saves the single owner and synchronizes transparent OBS overlays. Raids can transfer the relic to another consenting, eligible channel. After an offline grace period, a wild relic can be captured by three distinct viewers over 30 seconds.

The public radar records the journey and community records. Streamers can revoke their OBS URL, pause participation, choose French or English, reduce animation and adjust sound effects, musical tension and ambience independently. Original SVG/CSS visuals animate alerts, impacts, critical hits, defenses and transfers. Everything is quiet by default.

How we built it with Codex

Guillaume supplied the concept, priorities and design feedback. Codex implemented the Node.js application, SQLite transactions, Socket.IO synchronization, Twitch OAuth/EventSub integration, interface and tests. We worked in small verified steps: first persistent ownership, then battles and replay protection, then real Twitch reception, and finally the presentation and jury package.

Concrete corrections included locking a viewer’s camp for the entire battle, separating real Twitch rehearsals from the public world, fixing OBS transparency and fitting the combat display into shorter sources. The repository retains the regression tests for those behaviors. No purchased media or external model was required; the relic and sounds are generated by project code.

Codex session: 01a1875d-9ed6-79f0-8fe8-c01117203721.

Challenges

The hardest requirement was one authoritative outcome across independent views and reconnects. SQLite transactions prevent concurrent battles from creating multiple owners. EventSub messages are checked for broadcaster identity, timestamps and replay; repeated messages do not create extra per-phase contributions. Rare critical bonuses are server-generated and capped.

The developer had only one Twitch channel. We therefore added a clearly labelled private rehearsal: genuine Twitch chat competes against SENTINEL, an automated defender. This makes the full interaction testable without inventing a second real streamer or changing public-world eligibility rules.

What is verified

  • 51 automated tests, including two actual local Socket.IO clients, database persistence, migration, authorization, replay/camp restrictions and explicitly mocked Twitch failures.
  • Actual Madaraprag authorization, EventSub chat reception, token refresh and subscription restoration after restart.
  • A complete recorded rehearsal: four genuine Twitch actions, zero simulated attacking reinforcements, three automated defenses; Madaraprag wins 4–3.
  • Two local OBS views, simulated raids, wild capture, English/French presentation and a separately launched jury package.

Honest limits

The opponent in the real-chat video is simulated. A battle between two real broadcasters, actual raid/online/offline events, community-scale balance and a public shared deployment remain unverified. Each local demo has its own persistent world; it is not a deployed worldwide network. Native audio synthesis is implemented, but the contest recording is silent with English on-screen explanations.

This is a contest prototype, not a commercial service. There is no purchase or hosting subscription required to evaluate it.

Judge access

The repository contains source, an exact dependency lockfile and English instructions. Install free Node.js 24, run npm ci, then npm run jury. The prepared ZIP already includes dependencies: extract it and launch START-JURY-DEMO.cmd. The bilingual jury page runs the clearly disclosed local simulation without Twitch credentials. Read JURY-START-HERE.md for optional real Twitch setup.

Built with

OpenAI Codex, JavaScript, Node.js 24, SQLite, Socket.IO, Twitch OAuth, Twitch EventSub, HTML, CSS, inline SVG, Web Audio API, OBS Studio, Python and FFmpeg for the reproducible demonstration edit.

Future work

Validate with two consenting live broadcasters, exercise real raids and outages, and calibrate balance with actual communities. A shared public service would need persistent hosting and additional operational and moderation work. That is not presented as already deployed.

Share this project:

Updates

Submission history