One Axis at a Time
For five weeks in the summer of 2026 I ran a systematic AI-assisted tuning operation inside Forza Horizon 6. fhtuner was an experiment in what it takes to turn an LLM into a competent domain copilot and building an instrument that removed guesswork. A native desktop app I wrote with Claude in Rust listened to the game’s telemetry broadcast and split out the data: tire temperatures by corner, slip angles, suspension travel, lap deltas. A Claude skill read that data, diagnosed handling problems by corner phase, and prescribed exactly one setup change at a time, each with metrics that could prove or refute it. Fourteen logbook entries across thirteen cars came out of that loop before I concluded my fun with the experiment.
Forza broadcasts a UDP telemetry stream, but in the Time Attack mode where tuning took place, the game leaves every lap counter frozen at zero - only the Time Attack race clock ticks. So lap detection had to be geometric: the app learns the start line from a standing start, then detects crossings by line-crossing math against position and heading. I validated it against the in-game clock at four laps out of four, exact to the displayed digit. Starting with a Python prototype; I then ported the hot path to Rust inside a Tauri shell with Opus 4.8’s help, the prototype’s test suite became the port’s spec. On top of the parser sat a live coaching HUD - running delta, a tire grid with wheelspin and lock rings, a top-down racing-line trace with an age-faded tail - and a voice announcer whose lines were rendered to static MP3s generated with an ElevenLabs API key at build time, so the running app needed no persistent API key and no network.
The method half was borrowed discipline, from Void’s Tuning Guide — a community-written document for Forza Horizon and Motorsport whose stated philosophy is “I won’t tell you how to tune your car. I’ll explain how everything works.” That framing is exactly what made it distillable into a skill: mechanisms and telemetry reads rather than magic numbers. Travel first, then camber against temps, then pressures, balance, gearing, brakes - and the skill enforced its cardinal rule: one axis per iteration, logged per motivation. The Lamborghini Countach is the clean example. After an engine swap it understeered hopelessly, and the naive read is “add front grip.” The telemetry said otherwise: the rear tires were running 29°C colder than the overheating fronts - the rear axle wasn’t working at all. The prescribed change was a stiffer rear anti-roll bar, one slider, and the temperature split halved on the next run. Four more single-axis iterations later the car locked in at 52.562 seconds, eight tenths under its first clean lap. The biggest gains have a corresponding entry in the logbook, because nothing ever changed two ways at once, (not accounting for skill/luck…)
This loop also taught me about what my own instrument could and could not say. The app’s auto-learned start line shifted from run to run, the offset against the game’s official timing line wandered between a tenth and 1.7 seconds. This meant the app could not reliably rank two laps. Rather than paper over it, that became a standing rule: trust the leaderboard for times, use the telemetry for per-corner signals only. And the single biggest gain of the whole project came from outside the tuning layer entirely. On a Toyota Sera build, one step of front tire width found five and a half seconds of lap time improvement. This was more than every tune iteration on that car combined. I had anti-roll-bar and camber changes already queued, and the right move was to throw them away, because the baseline they were prescribed against no longer existed. Knowing when to pivot or fold transfers to a lot of systems that aren’t cars.
The results were real enough to keep score with. The VW Corrado tune posted an official leaderboard time in the top 1.45% of 238,000 entries. The Countach and Sera both clocked PBs in the top % as well with a full diagnostic trail behind each. I also packaged the skill as my first Claude Code plugin.
I archived the project on July 13th. Tombstone written, repos buried, no loose ends pretending to be a roadmap. fhtuner ran its course, and closing it cleanly was the point. What transfers out is the pattern: an LLM advising on a physical system is only as useful as the measurement loop underneath it, a one-change-at-a-time discipline is what turns model suggestions into attributable causation, and a finished project you shut down on your own terms is a better proof of judgment than a zombie one you keep alive for the résumé.