01 · Overview

F-Zero X on a New 3DS, at 60, in 3D, in 24 days

A post-mortem of porting G-Diffuser, the F-Zero X decompilation on the libultraship runtime, to the New Nintendo 3DS. One person directed; one long-lived Claude session orchestrated; 147 subagents built. The console went from a black screen to a native-60 stereoscopic racer between 2026-08-11 and 2026-09-03.

59.6fps
median on hardware, full Grand Prix, final round (from 12–20 fps in the first emulator race)
51.4fps
tenth-percentile floor in 30-machine crowds (from 25–35)
53%
of frames at the 60 cap (from 14% one week earlier)
15
active days across 24 calendar days, three credit pauses
3.17 B
tokens across all sessions and agents
$4,974
at published API list prices (Fable $10/$50 per MTok, 1-hour cache writes); see Cost
250
commits touching the 3DS port
15,039
lines under port/3ds plus 48 pure-delta patches

On hardware

open clip
Grand Prix on a New 3DS, final build. The bottom screen is the port's debug menu: 59.8 fps, heap, build id.
open clip
Handheld, mid-race. Native 60 Hz pacing; no interpolation.
F-Zero X title screen on the New 3DS
Title screen, launched from the Homebrew Launcher (.3dsx).
Select Mode screen
Select Mode.
Select Machine screen
Select Machine.
Blue Falcon stats
Blue Falcon.

What was built

A New 3DS build of G-Diffuser that boots from the HOME menu (.cia) or the homebrew launcher (.3dsx), reads prebaked asset archives from the SD card (no ROM ever touches the console), and plays the whole game: Grand Prix, Time Trial, Practice, Death Race, the machine editor screens, with music and effects on the real DSP, stereoscopic 3D on the slider, a touch menu on the bottom screen with live performance levers and a log viewer, and clean HOME suspend, resume, close, lid sleep and power-off. Frame pacing is native 60 Hz, not 30 Hz with interpolation.

The stack

  • decomp: the F-Zero X decompilation (inspectredc/fzerox), untouched, plus 10 patches.
  • libultraship: the N64 runtime (Kenix3), untouched, plus 38 patches, including a 13-line newlib fix that lets it build on devkitARM.
  • port/3ds: 15,039 lines of new code: a citro3d rendering backend, stereo, audio, input, menu, lifecycle, render thread, profilers, packaging.

The headline numbers on hardware

WhenMedianp10At cap
08-14 first race (emulator)12–20
08-21 first hardware run48–50
08-28 release-grade build~51~40 (crowds, MINIMAL)
09-02 Round 1: Mainline before the campaign51.339.29%
09-02 Round 2: Bridge memos (brfast)57.246.629%
09-02 Round 3: HUD atlas · triangle memo · TMEM · audio56.048.032%
09-02 Round 4: Render thread on core 2 (pipe)57.644.614%
09-03 Round 5: Ahead mode · bridge on main · auto rival detail59.651.453%

The arc in five lines

  1. 08-11 → 08-14: from research to a race. Feasibility dossier, plan for a team of agents, five parallel foundation streams, six boot bugs, first race at 12–20 fps in the emulator.
  2. 08-20 → 08-22: from pink to playable, then to a real console. Fog, HUD, livery, shadow, sky fixed; the loadblock discovery took menus from 27 to 60 fps; first hardware run 08-21 ("wow it runs amazing"); audio the same evening.
  3. 08-27 → 08-28: product grade. Five-agent fleet drop, stereo armed, touch menu, rival detail, GPU vertex-transform moonshot built and shelved, README with legal notice, release package.
  4. 09-01 → 09-02: lifecycle and the last big lever. HOME crash and close-from-HOME hang fixed; bridge output cache proven a NO-GO and pivoted into brfast; LOCKED-60 campaign launched with four parallel levers.
  5. 09-02 → 09-03: multi-core. Render thread on core 2, one-frame-ahead mode, bridge on main, auto LOD; median 59.6 with 53% of frames at cap; crash fixed; viewport placement fixed; stereo markers anchored.

Read on

Every number on these pages has a source: git history, the research documents under docs/research/, the hardware logs, or the session transcripts on this machine. Where a value is an estimate (the dollar figures, which apply published API list prices to exact token counts), the assumption is stated next to it.