MicroRaceDriver: Shipping a Retro Racer with LLM Pair-Programming (Zero Human-Written Code)

19/10/2025

A retro, lane-based racer built in Flutter where every line of code was generated by LLMs. I handled direction, testing, and release; Codex CLI and ChatGPT wrote the code, fixed the errors, and shipped builds.

๐ŸŽฅ Project Video


Overview

MicroRaceDriver is a concise case study in end-to-end AI-assisted development: a complete Flutter game built through Codex CLI and ChatGPT, backed by real commits, logs, and reproducible prompts.

The experiment's goal was simple:

Explore how far a language model can go in building, debugging, and shipping a complete game with zero human-written code.

TL;DR

  • ๐Ÿšซ Zero human-written code: all patches were generated and applied via Codex CLI.

  • ๐ŸŽ๏ธ Built in Flutter: lane-based arcade racer using CustomPainter and synthesized audio.

  • ๐Ÿค– Autonomous dev loop: Codex built, ran, inspected logs, and fixed until clean builds.

  • โšก Wins: iteration speed, cross-domain reasoning (Flutter + DSP + CI), and clean release checklists.

  • ๐Ÿงฉ Hurdles: iOS audio quirks, low-end performance, HUD/safe-area layout, and store tooling.

  • โœ… Outcome: TestFlight 1.0.1 uploaded via Fastlane; Play Store AAB ready for release.

Evidence of LLM Collaboration

Every commit in the repo was authored by Codex CLI <dev@local>, reflecting a pure LLM coding pipeline.
Documentation files like STATUS.md and RELEASE.md show a chronological record of session-based iteration โ€” typical of LLM workflows.

Assets such as menu graphics and front-page visuals were generated with ChatGPT, while Codex integrated and rendered them in-app using CustomPainter.
Simulator logs (run.log, syslog.log) confirm that Codex autonomously ran and debugged builds.

Process (No Manual Coding)

The loop looked like this:

Prompt โ†’ Patch (diff) โ†’ Run on device โ†’ Iterate.

Codex used apply_patch to generate diffs, compiled builds, ran them, inspected logs, and authored follow-up fixes โ€” all autonomously.
The human role was purely directional: testing builds, giving feedback, and approving scope changes.

Publishing was fully automated via Fastlane:

  • Building IPAs/AABs

  • Uploading to TestFlight and App Store Connect

  • Generating metadata, screenshots, and release notes

Audio and music were synthesized entirely by Codex using Flutter audio APIs and DSP modeling.

Collaboration Model

The brief was:

"An 80s top-down racer in the spirit of Le Mans on the Commodore 64."

Codex proposed:

  • Core mechanics

  • Rendering architecture

  • Audio approach

  • Milestone roadmap

I acted as producer/tester, giving feedback such as "nitro feels slow" or "SFX timbre is off," and Codex produced focused patches in response.

The collaboration became a rhythm โ€” Codex suggested features (nitro, HUD clarity, night readability), I prioritized them, and the AI handled the rest.

Timeline (Commit-Backed Highlights)

2025-09-23

  • Initial gameplay: basic "Le Mans" style Flutter prototype.

2025-09-24

  • Menu, headlights, engine audio, road curvature, and pause overlay.

2025-09-25 (Major iteration)

  • Complete game loop: lives, continue screen, night mode, HUD lighting.

  • Introduced chiptune audio loop and Fastlane build setup.

2025-10-02

  • Swipe-only steering and nitro system with safe-area HUD fix.

  • App Store metadata automation via Fastlane.

2025-10-10 โ†’ 2025-10-11

  • Combat expansion: pickups, bullets, explosions, muzzle flash.

  • Final iOS signing and Fastlane upload for version 1.0.1+12.

Release & Publishing

Codex handled the full release flow:

  • Fastlane lanes for build/upload, metadata, and age ratings.

  • Artifacts:

    • iOS โ†’ build/ios/ipa/*.ipa

    • Android โ†’ build/app/outputs/bundle/prodRelease/app-prod-release.aab

Only human input: credentials, screenshots, and button clicks.

What Worked Well

  • ๐Ÿง  Cross-domain reasoning โ€” Codex managed Flutter graphics, audio DSP, and CI simultaneously.

  • ๐ŸŽง Audio quality โ€” iterative tuning with equal-power crossfades and loop balancing.

  • ๐ŸŒ™ Visual polish โ€” headlight cones, emissive tail lights, and painter-based readability.

  • ๐Ÿงพ Production checklists โ€” automated RELEASE.md steps reduced human load.

  • ๐Ÿš€ AI momentum โ€” Codex continuously proposed features and refinements between sessions.

What Was Tricky (and Fixes)

Challenge Fix
iOS silent-switch and audio glitches Used BytesSource(mimeType: 'audio/wav'), prewarmed caches
iOS low-end performance Reduced blur radii, painter repaints, low-graphics mode
HUD overlapping system UI Offset HUD by safe-area padding
Deprecated WillPopScope Migrated to PopScope, swipe-only steering
Store metadata/versioning Fastlane automation for metadata and uploads

Prompting Patterns That Worked

  • Start with constraints, not solutions: "CustomPainter, 60 FPS target, no shaders."

  • Ask for surgical diffs, not rewrites.

  • Validate on real devices early.

  • Keep clear naming and state tracking (e.g., "effective speed" vs "ground speed").

  • Use a session log like STATUS.md to maintain context and continuity.

Lessons Learned

  • Treat the LLM like a senior pair-programmer โ€” request reasoning, not just code.

  • Iterate quickly and test small.

  • Codify release pipelines from day one.

  • Prototype visuals early โ€” even rough painter passes clarify gameplay feel.

Selected Commits

  • 8998351: Audio engine tuning and crossfades

  • 2b147e8 / 14414a8 / 4aab9f0: Night lighting and emissive tail lights

  • 4bd2f5e / 37c8eec: Nitro system + HUD safe-area fix

  • 18f5c3e / fcc8490: Combat system: bullets, explosions, muzzle flash

  • 9a16da7: Final iOS audio/signing fixes + Fastlane upload

Credits

  • Code & direction: John Doktor

  • Pair-programming & documentation: Codex CLI

  • Graphics: ChatGPT-generated visuals integrated via CustomPainter

  • Audio: Synthesized and mixed entirely by Codex

Closing Thoughts

MicroRaceDriver isn't just a retro racer โ€” it's a glimpse of how LLMs can act as autonomous co-developers.
From scaffolding code to polishing visuals and publishing builds, the process blurred the line between coding and prompting.

The takeaway: LLMs aren't just assistants anymore โ€” they're beginning to ship.