MicroRaceDriver: Shipping a Retro Racer with LLM Pair-Programming (Zero Human-Written Code)
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.