Runnin' Mules! real-time multiplayer racing arcade
Role creator 路 Where: personal (cege7480/sigma-derby) 路 Built: April鈥揓uly 2026
Stack: Three.js + React Three Fiber 路 Rapier physics 路 Socket.IO 路 React 18 + TypeScript 路 Node/Express 路 Firestore 路 Google Cloud Run
A real-time multiplayer digital horse-racing arcade: five horses, ten quinella bets, continuous race cycles. The Socket.IO server is authoritative on outcomes and payouts; clients are pure renderers, and a session can reconnect mid-race and slot back in without losing balance or wagers.
It is also the project that proves a point the other three can't: a solo developer with AI can now ship a full product across disciplines they don't personally practice: 3D art, rigged animation, voice acting, sound design.
How it was built, the AI angle
This is generative AI in the product, not just assistive AI in the editor.
| Discipline | Normally needs | Here |
|---|---|---|
| 3D horse models | a character artist | Meshy AI-generated GLBs, one per horse, each rigged with Walk/Trot/Gallop/Rest |
| Broadcast announcer | a voice actor + booth | Google Chirp 3 HD (en-US-Chirp3-HD-Charon), the whole phrase library rendered to MP3 on boot and cached in GCS |
| Splash / tutorial art | an illustrator | generated stills, reused as the four-step first-time-player walkthrough so the tutorial reads native to the brand |
| Jockey rig | a technical animator | a v3 rig with a proper racing seat, plus a 13-joint procedural fallback horse with velocity-driven crossfade |
Measured 511 commits across all branches over ~12 weeks, 360 of them (70%) AI-attributed, mostly Claude co-authorship, plus 20 authored outright by copilot-swe-agent and
anthropic-code-agent. A further 139 commits come from semantic-release, which automates
versioning and changelog; those are release plumbing, not AI, and aren't counted.
The hand-built parts are the ones you'd expect to be hand-built: the authoritative race simulation, the payout math, the reconnection protocol, and the security model.
The screens
The stadium

Procedural grandstands, pine-tree perimeter, lamp posts, scoreboards, and a stadium-shaped infield, with procedural mowed turf and rake-lined dirt. Alfa Slab One for display headings; JetBrains Mono for every live numeral: odds, balance, timer.
Board + phone: the whole loop
![]() Board / kiosk: a full-screen attract overlay with the station code and QR. Phones scan it (or type the 4-character code) to pair. |
![]() Racing: the QR fades out and the race-cam follows the field around the oval with a TV broadcast HUD. |
![]() Results: winning quinella and payout summary, then straight into the next cycle. |
![]() Phone: quinella picker with all ten pairings and odds (left), and the jockey rhythm minigame that modulates your horse's speed (right). |
The parts I'm proudest of
- A reusable camera cutscene system. Every shot is just a
{ position, lookAt, duration }function, so a new cutscene is a new array. Ships with the race-start gate cut, the pre-race paddock walk (one cameo per horse, spotlight card reveals the jockey bio), and a photo-finish inspector. - A ragdoll jockey. Rare chance per race a horse stumbles; the jockey detaches into a six-body ragdoll with spherical joints and gets launched into the grandstand. There is also a gameplay-triggered teeth-throw cutscene that fires when one rider's tap-rhythm crosses 85% while a rival's drops below 30%: cartoon overlay on every client, in-engine ragdoll on the board.
- Real observability for a toy. Custom metrics to Google Cloud Monitoring every 60s, visualized
in Grafana: request rate and latency, race throughput, betting economy, tap-rhythm distribution,
auth rejections by reason, HTTP 4xx/5xx, Firestore errors, and client-side errors via a
window.onerrorbeacon. - Security taken seriously anyway. The
/hardwareSocket.IO namespace requires a shared secret with constant-time compare (previously anyone could connect and spoof position events to alter race outcomes). Secrets live in Secret Manager and mount natively. Per-user rate limits on bets, taps, markers, and reactions. An aggregate marker cap so a careless admin can't inflate one player's balance indefinitely. - The iOS bug nobody warns you about. Mobile socket heartbeat-on-resume catches Safari's
half-open WebSocket failure mode,
socket.connected === truewhile every emit drops on the floor.
Why it matters
Everything else in this portfolio is enterprise plumbing. This one is the counter-example: the same AI-assisted method, pointed at a domain with no requirements document and no stakeholders, still produced a deployed, monitored, security-reviewed, continuously-released product, with 3D art and a broadcast voice a solo developer could not have made five years ago at any price.
Also, the jockeys throw their teeth. That part was not AI's idea.



