Skip to content
All builds

DialedForza Tune Keeper

What it does for you

A garage notebook for Forza tunes with versions, a line-by-line diff, tuning calculators, and a 134-character checksummed share code.

Dialed screenshot

Screenshots

Dialed screenshot 1

In more detail

Dialed is a garage notebook for Forza tunes. A tune is about 35 numbers spread across nine menus, and the game gives you no way to see what changed between the setup that worked and the one that did not. Dialed saves every setting, keeps versions, compares two setups line by line, and packs a whole tune into one short code you can paste to a friend.

Honest limits

Slider ranges follow Forza Horizon 5 conventions, and the calculators give a starting point, not a verified fast setup. There is no link to the game, so every value is typed in by hand. Storage is localStorage only. It was checked by automated tests and screenshots, not by a season of actual racing.

How I built it

This one is pure interest, and it came out of the September 19 one-shot night as one of the parallel Claude Code builders. I directed the scope: tunes as versioned records, a real diff, a share code short enough for a chat message, and calculators grounded in actual formulas. Claude Code wrote the core (tune.js), the bit-level writer and reader, the checksum, and 201 assertions before any UI existed. Then it built the four views on top: library, editor with 27 sliders plus gear ratios, compare, and a helper with five baseline calculators.

The first session got cut off before the write-up. A second session reran the tests, confirmed both forced themes rendered the 10 sample cards in headless Chrome, reviewed the screenshots, and wrote the docs from the code as it stood. Logged time was about 0.6 hours.

What I learned

  • Store every setting as an integer step count (value minus min, divided by step). 29.5 psi becomes step 145 in 9 bits and decodes to exactly 29.5, so round trips are tested with strict equality, and a whole tune fits in about 100 bytes instead of 840 characters of JSON.
  • A checksum is what makes a share code usable by people. A one-byte CRC-8 on the end turns a cut-off or mistyped paste into a clear error instead of a quietly wrong tune.
  • Keep storage in one unit system and convert only at display. Otherwise flipping psi to bar and back can walk a value off its grid.
  • Cutting a UTF-8 string to a byte limit has to back up past continuation bytes, or a car name with an accent decodes as a broken character.

What carried forward

One field registry (range, step, unit, default) drives the sliders, validation, the diff, unit display, and the codec, so adding a setting is a one-line change. That "one definition, many readers" idea showed up all night: #22 rendered a whole page from one config, and #27 drove a comparison table from one row definition. The build also followed the brief's reusable pieces: the DOM-free core that verify.mjs tests, the standard serve.mjs, and ?demo=1 and ?theme= for screenshots.

One small thing that kept coming up: verify.mjs held a literal em dash inside its own no-em-dash check, which a text lint flags. It got swapped for an escape. #29 and #30 hit the exact same thing.

If I took it further

I would add a version byte per field group so the share code can grow new settings without breaking old codes. I would also plot the gear spread as an rpm sawtooth chart, since that is the view tuners actually read.

#025 Built with Claude Code September 20, 2026 201 automated checks

Want one like this?