Skip to the page
It's Decomplicated
Nintendo, 2006

Wii decomp guide

New recomp tools and one finished decomp make the Wii a strong second system to learn.

What this system is like

The Wii runs PowerPC code, like the GameCube. The two systems share most tools. A Wii game is one main program file, main.dol. Many games also load extra code files called RELs.

Path A uses static recompilation. A tool reads the game's code and writes C++ that does the same thing. Since August 2026, most Wii ports reviewed here use the WiiCompiled translator and the Aurora graphics layer. The hard part is not the translator. It is the runtime: the code that stands in for the Wii's graphics, sound, input and files.

Path B is a matching decompilation. You write C or C++ that the original compiler turns back into the same bytes. The tools are decomp-toolkit, objdiff and the Metrowerks compiler. At least one Wii game, Mario Strikers Charged, is fully matched and linked. A PC port was built on top of it.

Almost everything runs on Windows. WSL is only needed for decomp-permuter's shared mode and for Linux builds. Wii games are big. The games checked here have 14,620 to 92,522 functions, so plan for a long Path B.

Same chip family as the GameCube

The Wii uses a faster GameCube chip. So decomp-toolkit, objdiff, Aurora and Dolphin all serve both systems. You can borrow GameCube work and advice.

Code is split into DOL and REL files

The main program is main.dol. Many games load more code from .rel modules at run time. A recompiler cannot see that code unless you link the RELs first, at fixed addresses.

GX graphics become many shaders

GX is a fixed-function pipeline. On PC each setting mix becomes its own GPU pipeline. One port compiled for 17 minutes on first launch. Ports ship a pipeline cache to avoid this.

A full recomp stack appeared in 2026

WiiCompiled came out in August 2026. By the end of October, six more of the ports reviewed here used it. Each new game still needed its runtime hooks moved to new addresses.

Every disc version has different code

Regions and revisions put functions at different addresses. Ports accept one exact disc and reject the rest. Pin your disc by its game ID and a hash before you start.

Motion controls need a stand-in

The Wii Remote uses an IR pointer and motion. Ports map these to mouse, keys and gamepads. At least two ports, Mario Kart and Metroid Prime 3, have no IR pointer for a real Wii Remote.

Two paths

Path A

Get it running on PC

You write a small YAML manifest for your game. The WiiCompiled translator reads main.dol and writes C++. You compile that with a runtime that replaces the Wii's system code. Aurora draws the GX graphics on your GPU. Most work goes into moving runtime hooks to your game's addresses and fixing one crash at a time.

Go to the steps

Path B

Full decomp for porting

You split the game with decomp-toolkit using the dtk-template layout. You write C or C++ until each unit builds to the same bytes with the original Metrowerks compiler. objdiff scores each unit, and ninja checks the whole DOL hash. Then you port the source to PC with Aurora, using small patches.

Go to the steps

Path A: Get it running on PC

You write a small YAML manifest for your game. The WiiCompiled translator reads main.dol and writes C++. You compile that with a runtime that replaces the Wii's system code. Aurora draws the GX graphics on your GPU. Most work goes into moving runtime hooks to your game's addresses and fixing one crash at a time.

Method: static recompilation (WiiCompiled translator + Aurora)

Pick this first when you want to play on PC soon. It does not give you readable source code. If a finished decomp of your game exists, port that instead.

  1. Scope the game and pin the disc

    You pick one game and one exact disc version. You record its ID and hash. You also look for work that already exists. A symbol map or a sister port can save weeks.

    • Pick one disc version. Write down its six-letter game ID, for example RMCE01.
    • Check the image with nodtool info <IMAGE> and nodtool verify <IMAGE>.
    • Extract it outside your repo: nodtool extract <IMAGE> D:/wii/<GAMEID>.
    • Hash the code in PowerShell: Get-FileHash D:/wii/<GAMEID>/sys/main.dol -Algorithm SHA256.
    • List the REL modules under files/. Check subfolders and other names too: Mario Kart has files/rel/StaticR.rel, and Super Paper Mario uses files/rel/relF.bin. Note any .map file on the disc.
    • Search decomp.dev and GitHub for a decomp, a symbol list or a WiiCompiled port of a sister game.
    • Write SCOPE.md: goal, disc ID and revision, hash, technique, first milestone and what is out of scope.
    Prompt for Claude
    GOAL: Draft `SCOPE.md` for a static recomp of <GAME> (<GAMEID>, revision <REV>) on WiiCompiled.
    READ FIRST: `D:/wii/<GAMEID>/` (read-only), https://github.com/patchzyy/Wiicompiled/blob/main/translator/README.md
    FENCE: Edit only `SCOPE.md` and `notes/prior-work.md`. Never copy game files into the repo. Do not install anything.
    CHECK: Run `Get-FileHash D:/wii/<GAMEID>/sys/main.dol -Algorithm SHA256`. Done means the hash matches the one in `SCOPE.md`, and `SCOPE.md` names the disc ID, revision, the REL modules, the prior work found with links, and one first milestone with a check a script can run.
    BUDGET: Stop after 45 minutes of searching.
    IF BLOCKED: Stop. Do not guess a hash or a link. Tell me what you could not confirm and what you need.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the hash command output. 3) Files changed. 4) Open questions for me. 5) New parking-lot items.
    Done whenSCOPE.md lists the disc ID, revision and main.dol SHA-256, and you approved it.

    Proof this works: Mario Kart WiiCompiled, Shake It! Native PC, https://github.com/encounter/nod

  2. Set up the toolchain and the one check

    You install the tools and clone WiiCompiled. Then you write one script that builds and tests everything. Claude runs that script after every change.

    • Install the .NET 8 SDK, CMake 3.25 or newer, Ninja, Git, Python and PowerShell 7. The install commands are in the tools list.
    • PowerShell 7 runs as pwsh. It is a separate install from the powershell that comes with Windows.
    • Unzip llvm-mingw-20261104-ucrt-x86_64.zip from the llvm-mingw releases page. Add its bin folder to PATH.
    • Clone with submodules: git clone --recursive https://github.com/patchzyy/Wiicompiled, then cd Wiicompiled. The submodule aurora-main is the project's copy of Aurora.
    • Build the translator: dotnet build translator/Translator.sln -c Release.
    • The translator then runs as dotnet translator/src/Translator.Cli/bin/Release/net8.0/Translator.Cli.dll <COMMAND>.
    • Run its tests: dotnet test translator/Translator.sln -c Release. They need no game files.
    • Add generated/, build/ and your game folder to .gitignore.
    • Write tools/check.ps1. It translates, builds, runs the golden run and prints one line: PASS or FAIL.
    • Give it the switches later steps use: -BuildOnly, -Scenario <NAME> and -Full. Unfinished parts may print FAIL for now.
    • Write CLAUDE.md, PROGRESS.md and notes/parking-lot.md.
    Prompt for Claude
    GOAL: Make `pwsh tools/check.ps1` run translate, build and golden run, accept `-BuildOnly`, `-Scenario <NAME>` and `-Full`, and print PASS or FAIL as its last line.
    READ FIRST: `SCOPE.md`, `translator/README.md`, `projects/examples/generic-dol.yml`
    FENCE: Edit only `tools/check.ps1`, `.gitignore`, `CLAUDE.md`, `PROGRESS.md`. Do not change `translator/` or `runtime/`. Do not install anything; tell me what is missing.
    CHECK: Run `dotnet test translator/Translator.sln -c Release` (must pass). Then run `pwsh tools/check.ps1`. Done means it runs to the end and prints PASS or FAIL. FAIL is fine at this stage.
    BUDGET: Stop after 3 failed tries on the same error.
    IF BLOCKED: Stop. Do not work around a missing tool. Tell me which tool and version is missing.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the last 20 lines of both commands. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whendotnet test passes and pwsh tools/check.ps1 runs to the end with a clear PASS or FAIL line.

    Proof this works: Mario Kart WiiCompiled, NSMB Wii Recompiled, https://github.com/patchzyy/Wiicompiled

  3. Write the manifest and the function map

    The translator only knows code it can reach from the entry point. A function map tells it where every function starts. You also link RELs offline so their code gets translated too.

    • Copy projects/examples/generic-dol.yml to projects/<game>/recomp.yml.
    • Set inputs.dol.path to your main.dol and add its SHA-256 pin from step 1. A pinned file with a wrong hash is rejected.
    • Read the DOL header with dtk dol info D:/wii/<GAMEID>/sys/main.dol. The entry point sits at offset 0xE0.
    • Read the lis/ori pairs in __init_registers. Write them as sda_base (r13) and sda2_base (r2). The translator will not guess them.
    • Build MAP.txt with one hexaddr name line per function. Take names from a decomp's symbols.txt if one exists. Point translation.function_map.path at it.
    • With no decomp, use function starts from dolrecomp and names from Dolphin's signature database. Keep only exact-size, unique matches.
    • Change allow_unsupported_instructions to false. The example file sets it to true, and a build with it on can never ship.
    • If the game loads RELs at boot, link them offline at fixed addresses into one file, like prelink_rels.py does.
    • Write notes/functions.csv with address, size, name source and status.
    Prompt for Claude
    GOAL: Write `projects/<game>/recomp.yml` and `projects/<game>/MAP.txt` so `translate-recursive` covers the whole game.
    READ FIRST: `SCOPE.md`, `translator/README.md`, `projects/examples/generic-dol.yml`, `<SYMBOL_SOURCE>`
    FENCE: Edit only `projects/<game>/` and `notes/functions.csv`. Never edit `generated/`. Set `allow_unsupported_instructions: false` and keep it there.
    CHECK: Run `dotnet translator/src/Translator.Cli/bin/Release/net8.0/Translator.Cli.dll translate-recursive <ENTRY> --project projects/<game>/recomp.yml`. Done means it exits 0 with no unsupported instruction, and `notes/functions.csv` has one row per function.
    BUDGET: Stop after 5 failed translate runs, or 60 minutes with no new functions found.
    IF BLOCKED: Stop. Do not turn on `allow_unsupported_instructions`. Paste the failing address and instruction.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the translator summary. 3) Files changed. 4) How each SDA value was found. 5) New parking-lot items.
    Done whentranslate-recursive exits with no unsupported instruction, and notes/functions.csv lists every function with its name source.

    Proof this works: Brawl Recompiled, New Super Paper Bros, Shake It! Native PC, OceanTriRecomp

  4. Translate and build the program

    You run the three translator commands. Then CMake and Ninja compile the result. This is the first full pass from disc to .exe. The game will not run yet.

    • Run each translator command as dotnet translator/src/Translator.Cli/bin/Release/net8.0/Translator.Cli.dll <COMMAND>. Any command lists its options with --help.
    • Run translate-recursive <ENTRY> --project projects/<game>/recomp.yml.
    • Run generate-data-init --project projects/<game>/recomp.yml.
    • Run emit-build-shards --project projects/<game>/recomp.yml. It writes the CMake build graph. The Mario Kart, NSMBW and Paper Mario builds also run emit-base-manifest before it.
    • Configure with CMake, the Ninja generator and clang from llvm-mingw. Build the WiiCompiled target.
    • Allow one compile job per 2.5 GB of RAM. One job per core ran a 16 GB PC out of memory.
    • Mark very slow functions noopt or isolate instead of waiting on them.
    Prompt for Claude
    GOAL: Build one native `.exe` from the translated game with no compile or link errors.
    READ FIRST: `SCOPE.md`, `translator/README.md`, `projects/<game>/recomp.yml`
    FENCE: Edit only `tools/check.ps1` and `projects/<game>/`. Never edit `generated/` or `runtime/`.
    CHECK: Run `pwsh tools/check.ps1 -BuildOnly`. Done means the link step succeeds and a second clean run gives the same result.
    BUDGET: Stop after 3 failed builds on the same error. Use at most <N> parallel compile jobs.
    IF BLOCKED: Stop. If an error is in generated code, do not patch it; name the translator rule that made it.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the last 30 build lines. 3) Files changed. 4) Build time and peak RAM. 5) New parking-lot items.
    Done whenThe build links one .exe with no errors, twice in a row from a clean build/ folder.

    Proof this works: Mario Kart WiiCompiled, Brawl Recompiled, Resident Evil: The Umbrella Chronicles

  5. Boot to the first frame

    The runtime calls into the game at fixed addresses. These are hooks. You move each hook from the base game to yours. Every address needs proof, or the game breaks in odd ways.

    • Start from the WiiCompiled runtime. Copy it; do not write a new one.
    • List every hook and replaced SDK function the base runtime uses.
    • Find each one in your game by a string, a caller or a matching code shape.
    • Record it in projects/<game>/hle_targets.tsv with how you proved it.
    • Check the register use of each replaced SDK call against the real code.
    • Run until a window shows the first frame. Save the screenshot and the log in notes/.
    Prompt for Claude
    GOAL: Boot <GAME> to its first drawn frame.
    READ FIRST: `SCOPE.md`, `PROGRESS.md`, `projects/<game>/hle_targets.tsv`, `runtime/` (hook list only)
    FENCE: Edit only `runtime/` and `projects/<game>/`. Never edit `generated/`. Every new address needs a proof note in `hle_targets.tsv`.
    CHECK: Run `pwsh tools/check.ps1 -Scenario boot`. Done means a frame is drawn, a screenshot is saved, and it shows the same screen Dolphin shows at that point.
    BUDGET: Stop after 4 hooks you could not prove, or 90 minutes with no new progress in the log.
    IF BLOCKED: Stop. Do not stub a function or fake an event to get past a screen. List the hook and the evidence you have.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Screenshot path and the last 20 log lines. 3) Files changed. 4) Hooks still unproven. 5) New parking-lot items.
    Done whenA window shows the first frame, and the screenshot matches the same moment in Dolphin.

    Proof this works: NSMB Wii Recompiled, New Super Paper Bros, Resident Evil: The Umbrella Chronicles

  6. Build a test harness

    Claude needs to run the game without you. A harness feeds scripted input, waits for game states and saves proof. It becomes the golden run in your check script.

    • Add scripted input and a time limit. Never send real keyboard or mouse input.
    • Copy saves into a folder per run. Never touch your real saves.
    • Run in a 1280x720 window, never fullscreen.
    • Wait on game state, not on sleep timers.
    • Write report.json with the state reached, the time and a screenshot. On failure, write failure.json.
    • Add a level sweep: load each level, count undrawn pixels and keep a small screenshot.
    • Make tools/check.ps1 call the harness.
    Prompt for Claude
    GOAL: Add a harness so `pwsh tools/check.ps1` boots to the title screen with no person and writes `report.json`.
    READ FIRST: `SCOPE.md`, `PROGRESS.md`, `tools/check.ps1`
    FENCE: Edit only `tools/`, `tests/` and the harness hook in `runtime/`. Do not change game logic. Never use real input or real saves. Never run fullscreen.
    CHECK: Run `pwsh tools/check.ps1` three times. Done means all three runs reach the title screen and each writes `report.json` with a screenshot.
    BUDGET: Stop after 3 failed designs, or 2 hours.
    IF BLOCKED: Stop. Tell me what game state you could not detect and what you tried.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the three PASS lines and report paths. 3) Files changed. 4) What the harness cannot do yet. 5) New parking-lot items.
    Done whenpwsh tools/check.ps1 reaches the title screen three runs in a row and writes report.json each time.

    Proof this works: Resident Evil: The Umbrella Chronicles, New Super Paper Bros, Brawl Recompiled

  7. Fix one problem at a time

    This is the long middle. Each task is one crash, one missing call or one wrong picture. Claude proves the cause first, then fixes the right layer.

    • Pick one item from PROGRESS.md.
    • Reproduce it with a harness scenario before changing code.
    • For Missing translated target, add the address to MAP.txt or add a seeding rule for that code shape.
    • For a wrong picture, compare with Dolphin. Use a savestate and a FIFO log of one frame.
    • Fix the translator, the manifest or the runtime. Never the generated code.
    • Add a scenario that would have caught the bug.
    Prompt for Claude
    GOAL: Fix <BUG_ID>: <ONE_LINE_DESCRIPTION>.
    READ FIRST: `PROGRESS.md`, `notes/findings.md`, the run folder `<RUN_DIR>` with `failure.json`
    FENCE: Edit only `runtime/`, `projects/<game>/` or `tests/`. Never edit `generated/`. No stubs, no fake events, no per-screen hacks.
    CHECK: Run `pwsh tools/check.ps1 -Scenario <SCENARIO>` and then the full `pwsh tools/check.ps1`. Done means both print PASS.
    BUDGET: Stop after 3 failed fixes, or 60 minutes without a proven cause.
    IF BLOCKED: Stop. Write what you know in `notes/findings.md` and tell me which evidence you need, such as a Dolphin capture.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) The proven cause and both PASS lines. 3) Files changed. 4) The new scenario name. 5) New parking-lot items.
    Done whenThe bug's scenario passes, and every older scenario still passes.

    Proof this works: OceanTriRecomp, Resident Evil: The Umbrella Chronicles, Crash of the Titans: Wiicompiled

  8. Harden and package

    You make sure old fixes stay fixed. You remove first-launch stutter. You package tools so players build the game from their own disc.

    • Run the full level sweep on a clean checkout.
    • Ship a seed of GPU pipelines seen in test runs, so first launch does not stall.
    • Pin every input by hash: the disc, the toolchain and every download.
    • Scan git for game files and translated code before each release.
    • Ship the tools and let the player's PC translate and build, as WiiCompiled does.
    • Write player docs: the exact disc ID, CPU needs such as AVX2, and how to report a bug.
    Prompt for Claude
    GOAL: Make a clean checkout pass the full check and produce a release with no game data.
    READ FIRST: `SCOPE.md`, `PROGRESS.md`, `tools/check.ps1`, `.gitignore`
    FENCE: Edit only `tools/`, `docs/` and packaging files. No gameplay changes.
    CHECK: In a fresh clone, run `pwsh tools/check.ps1 -Full`. Done means PASS, and `git ls-files` shows no `.dol`, `.rel`, disc image or `generated/` file.
    BUDGET: Stop after 3 failed tries on one problem.
    IF BLOCKED: Stop. List what fails and the log line.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the PASS line and the file scan. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenA clean clone prints PASS from pwsh tools/check.ps1 -Full, and git holds no game data or translated code.

    Proof this works: Mario Kart WiiCompiled, Metroid Prime 3: Corruption PC, Shake It! Native PC

Path B: Full decomp for porting

You split the game with decomp-toolkit using the dtk-template layout. You write C or C++ until each unit builds to the same bytes with the original Metrowerks compiler. objdiff scores each unit, and ninja checks the whole DOL hash. Then you port the source to PC with Aurora, using small patches.

Method: matching decompilation (decomp-toolkit + objdiff + Metrowerks), then a port on Aurora

Pick this when you want source code you can read, change and port. Check decomp.dev first. Your game may already be done or well started.

  1. Scope and look for prior work

    A full decomp is months or years of work. First check if someone has started. A sister game decomp can give you a lot of code.

    • Look up your game on decomp.dev and GitHub. Note matched and linked percent.
    • If a decomp is at 100%, skip to the port steps.
    • Look for a sister game on the same engine. The Strikers Charged decomp borrowed code from the GameCube Super Mario Strikers decomp.
    • Read the project's rules on AI changes. Petari does not accept AI changes.
    • Expect a large game. Strikers Charged has 17,689 functions. Brawl has 92,522.
    • Write SCOPE.md with the version, the main.dol SHA-1 and the first milestone.
    Prompt for Claude
    GOAL: Draft `SCOPE.md` for a matching decomp of <GAME> (<GAMEID>).
    READ FIRST: https://decomp.dev, https://github.com/encounter/dtk-template, `notes/prior-work.md`
    FENCE: Edit only `SCOPE.md` and `notes/prior-work.md`. Do not clone or download any decomp yet.
    CHECK: Run `Get-FileHash <DISC_FOLDER>/sys/main.dol -Algorithm SHA1`. Done means the hash matches the one in `SCOPE.md`, and `SCOPE.md` names the version, every prior project found with its matched and linked percent, any sister-game decomp, and upstream AI rules.
    BUDGET: Stop after 45 minutes.
    IF BLOCKED: Stop. Say which facts you could not confirm. Do not guess percentages.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) A table of prior work with links. 3) Files changed. 4) Your advice: start new, join, or port. 5) New parking-lot items.
    Done whenSCOPE.md names the version, its SHA-1 and all prior work, and you approved it.

    Proof this works: https://decomp.dev/yannicksuter/mscharged-decomp, https://github.com/yannicksuter/mscharged-decomp, Nebula

  2. Set up from dtk-template

    dtk-template is the layout most GameCube and Wii decomps use. It needs only Python and Ninja. The first build downloads the compilers and tools for you.

    • Create a new repo from dtk-template and clone it.
    • Install Python and Ninja on Windows: pip install ninja. WSL is not needed.
    • Rename orig/GAMEID and config/GAMEID to your game ID.
    • Put extracted game files in orig/<GAMEID>, so orig/<GAMEID>/sys/main.dol exists. Use Dolphin's Data Partition, Extract Entire Partition, or nodtool extract <IMAGE> orig/<GAMEID>. The template also takes a whole disc image, but then sys/main.dol only appears after the first build, so the hash command below fails.
    • Edit config/<GAMEID>/config.yml. Remove modules if the game has no RELs.
    • Make the hash file: dtk shasum orig/<GAMEID>/sys/main.dol orig/<GAMEID>/files/*.rel -o config/<GAMEID>/build.sha1. On Wii, RELs often sit in a subfolder such as files/rel/, so list each REL path you found in step 1.
    • Change the paths in build.sha1 to point at build/. The DOL builds to build/<GAMEID>/main.dol and each module to build/<GAMEID>/<MODULE>/<MODULE>.rel.
    • Set VERSIONS in configure.py. Run python configure.py, then ninja.
    Prompt for Claude
    GOAL: Get a `dtk-template` project for <GAMEID> to run its first analysis.
    READ FIRST: `SCOPE.md`, `docs/getting_started.md`, `docs/dependencies.md`, `config/GAMEID/config.example.yml`
    FENCE: Edit only `config/<GAMEID>/`, `configure.py` and `.gitignore`. Never commit anything from `orig/`.
    CHECK: Run `python configure.py` then `ninja`. Done means the analysis finishes and writes `config/<GAMEID>/symbols.txt` and `splits.txt`.
    BUDGET: Stop after 3 failed runs on the same error.
    IF BLOCKED: Stop. Paste the error. Do not edit `build.sha1` hashes to get past it.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the last 20 lines of `ninja`. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenninja finishes the first analysis and writes symbols.txt and splits.txt.

    Proof this works: https://github.com/encounter/dtk-template, https://github.com/yannicksuter/mscharged-decomp

  3. Map the binary and pass the hash

    You make the project rebuild the original DOL while all code is still assembly. You mark library code so nobody decompiles it by hand first. The result is a ledger of every unit.

    • If the disc has a .map file, add a map key in config.yml. Remove it after the analysis.
    • Set up the C++ exception split for Wii linkers, as the template docs show.
    • Put SDK, runtime and middleware units in the sdk progress category.
    • Build until ninja prints build/<GAMEID>/main.dol: OK.
    • Write notes/units.csv from build/<GAMEID>/report.json: unit, size, category, status.
    Prompt for Claude
    GOAL: Make `ninja` rebuild a byte-identical `main.dol` with every unit still in assembly, and write the unit ledger.
    READ FIRST: `SCOPE.md`, `config/<GAMEID>/config.yml`, `config/<GAMEID>/splits.txt`, `docs/splits.md`, `docs/symbols.md`
    FENCE: Edit only `config/<GAMEID>/`, `configure.py` and `notes/units.csv`. Never edit `build.sha1`.
    CHECK: Run `ninja`. Done means it prints `build/<GAMEID>/main.dol: OK` and `notes/units.csv` has one row per unit.
    BUDGET: Stop after 5 failed split fixes, or 2 hours.
    IF BLOCKED: Stop. Paste the first link or hash error and the split you suspect.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the OK line. 3) Files changed. 4) Unit counts by category. 5) New parking-lot items.
    Done whenninja prints build/<GAMEID>/main.dol: OK and notes/units.csv lists every unit.

    Proof this works: https://github.com/encounter/dtk-template/blob/main/docs/getting_started.md, https://github.com/encounter/decomp-toolkit

  4. Match one small unit end to end

    This is first light for Path B. One unit goes from assembly to matching C. It proves the compiler, flags and diff loop all work.

    • Pick the smallest game unit with few functions.
    • Draft C with m2c, using the target ppc-mwcc-c++ or ppc-mwcc-c.
    • Open the project in objdiff. It reads objdiff.json and rebuilds on save.
    • Edit until the unit shows 100% in objdiff.
    • Mark the unit as matching in configure.py.
    • Run ninja. The DOL must still print OK.
    Prompt for Claude
    GOAL: Make unit <UNIT> match 100% and link it from source.
    READ FIRST: `SCOPE.md`, `notes/units.csv`, the unit's assembly, `configure.py`
    FENCE: Edit only `src/<UNIT_PATH>`, its header in `include/`, and the unit's line in `configure.py`. No inline `asm`, no `#pragma` tricks, no edits to `build.sha1`.
    CHECK: Run `ninja`. Done means `build/<GAMEID>/main.dol: OK` and `build/<GAMEID>/report.json` shows the unit at 100%.
    BUDGET: Stop after 5 real tries per function with no gain.
    IF BLOCKED: Stop. Show the best score and the exact differing instructions.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the OK line and the unit's score. 3) Files changed. 4) Compiler flags that mattered. 5) New parking-lot items.
    Done whenobjdiff shows 100% for the unit, and ninja prints build/<GAMEID>/main.dol: OK with the unit linked from source.

    Proof this works: https://github.com/matt-kempster/m2c, https://github.com/encounter/objdiff, https://github.com/yannicksuter/mscharged-decomp

  5. Grind units in parallel

    Now many workers each take one unit. A script picks the next unit, not Claude. Each worker has a strict try limit and its own git worktree.

    • Write tools/next_units.py. It picks the smallest units first, then those most like matched code.
    • Give each worker one unit and one git worktree.
    • Each worker drafts with m2c, compiles, compares, and stops after 5 real tries.
    • Run decomp-permuter in WSL only on near misses. Add permuter_settings.toml with build_system = "ninja" to the repo root. Then run ./import.py <FILE.c> <FILE.s> and ./permuter.py <DIR> -j <THREADS>.
    • Explain a permuter result before you keep it.
    • Merge one unit per commit. Run ninja on the merged branch after each merge.
    • Log every failed try in notes/units.csv so no one repeats it.
    Prompt for Claude
    GOAL: Run one batch of <N> units from `tools/next_units.py`, one worker per unit.
    READ FIRST: `CLAUDE.md`, `notes/units.csv`, `notes/compiler-quirks.md`
    FENCE: Each worker edits only its unit's `src/` file, its header and its `configure.py` line, in its own worktree. Use absolute paths. No inline `asm`.
    CHECK: After each merge, run `ninja` on the main branch. Done means `build/<GAMEID>/main.dol: OK` after every merge and each merged unit is at 100% in `report.json`.
    BUDGET: Each worker stops after 5 real tries with no gain. The batch stops after <M> units or 3 hours.
    IF BLOCKED: A blocked worker writes its best score and differing instructions to `notes/units.csv` and stops.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) A table: unit, result, score. 3) Merged commits. 4) Units sent to the hard queue. 5) New parking-lot items.
    Done whenThe matched count in notes/units.csv rises and ninja prints OK after every merge.

    Proof this works: https://github.com/doldecomp/melee/pull/2076, https://github.com/encounter/objdiff, https://github.com/simonlindholm/decomp-permuter

  6. Crack hard units and link the files

    Some units resist. A stronger job type takes them with fresh eyes. Matching is not the end: each file must also link from source.

    • Send units that failed 5 tries to a hard job.
    • Before calling a unit stuck, name the exact differing instructions and a reason class.
    • Search matched units for the same code shape. Copy the pattern, not the code.
    • Keep a unit NonMatching rather than force it with inline assembly.
    • Track linked percent as well as matched percent in report.json.
    Prompt for Claude
    GOAL: Match unit <UNIT>, which failed <K> earlier tries.
    READ FIRST: `notes/units.csv` row for <UNIT>, the earlier attempt files, `notes/compiler-quirks.md`
    FENCE: Edit only the unit's `src/` file and header. No inline `asm`, no section forcing, no `volatile` added only to match.
    CHECK: Run `ninja`. Done means `build/<GAMEID>/main.dol: OK` and the unit is 100% in `report.json`.
    BUDGET: Stop after 8 real tries with no gain.
    IF BLOCKED: Stop. 'Compiler artifact' is not an answer. Name the differing instructions and two matched units with a similar shape.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Score before and after. 3) Files changed. 4) A one-line rule for `notes/compiler-quirks.md`. 5) New parking-lot items.
    Done whenEvery unit is matched or marked NonMatching with a written reason, and ninja prints OK.

    Proof this works: https://github.com/zcanann/SFA-Decomp/blob/main/CLAUDE.md, https://jpb.dev/blog/teaching-a-model-to-decompile

  7. Harden the decomp

    A byte match proves the code. It does not prove names or types. You add checks that keep the build honest and review the source.

    • For each supported version, run python configure.py --version <GAMEID>, then ninja all_source and ninja.
    • Write a lint that fails on inline asm, odd #pragma lines and edits to build.sha1.
    • Review names and types. Keep a name neutral when you are not sure.
    • Keep a baseline report. No change may lower any unit's score.
    • Have a fresh verify session read each batch for cheating.
    Prompt for Claude
    GOAL: Add a full check that builds every version, runs the lint and compares against the baseline report.
    READ FIRST: `SCOPE.md`, `configure.py`, `notes/units.csv`
    FENCE: Edit only `tools/` and CI files. Do not change `src/`.
    CHECK: Run `python tools/full_check.py`. Done means it prints OK for every version, the lint finds nothing, and no unit scores lower than the baseline.
    BUDGET: Stop after 3 failed tries on one problem.
    IF BLOCKED: Stop. List what fails.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the output. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenA clean clone builds every version to OK, and the lint and baseline check pass.

    Proof this works: https://github.com/yannicksuter/mscharged-decomp, https://github.com/lukechampine/melee-harness

  8. Port the decomp to PC

    You build the matched source for a 64-bit PC. The decomp stays untouched. Every change is a small patch applied at build time.

    • Start a new repo. Pin the decomp, Aurora, Dawn and nod as git submodules at exact commits.
    • Never edit the decomp. Write each change as a small patch with its reason in the header.
    • Keep two patch series: faithful fixes for a 64-bit little-endian PC, and gameplay tweaks.
    • Use Aurora for GX, video and disc reads. Run the SDK's own audio and controller code on a native layer.
    • Swap the byte order of game data once, at load or import.
    • Compile with clang and -fno-strict-aliasing and -ffp-contract=off.
    • Read the player's own disc image at run time. Ship no game data.
    Prompt for Claude
    GOAL: Boot the ported game to its title screen on Windows from my own disc image.
    READ FIRST: `SCOPE.md`, `patches/README.md`, https://github.com/encounter/aurora
    FENCE: Edit only `patches/`, `src/platform/` and `src/runtime/`. Never edit the pinned decomp copy. One patch per change, with a reason in its header.
    CHECK: Run `pwsh tools/check.ps1 -Scenario title`. Done means the title screen is reached by scripted input and a screenshot is saved.
    BUDGET: Stop after 3 failed tries on one crash, or 2 hours.
    IF BLOCKED: Stop. Paste the crash address and the patch you suspect.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Screenshot path and log tail. 3) New patches with one line each. 4) What is left. 5) New parking-lot items.
    Done whenThe port reaches the title screen from the player's disc, and the decomp copy has no direct edits.

    Proof this works: Recharged, Nebula, https://github.com/encounter/aurora

  9. Prove the port with golden runs

    You need proof the port plays like the original. A scripted tour with screenshots catches changes between builds. Random input finds crashes.

    • Script a tour of the game with fixed inputs.
    • Run it on the old and new build. Compare every screenshot.
    • Add random-input crash runs and many boot runs.
    • Ship a GPU pipeline list recorded from scripted runs.
    • Build one game module per disc version from the decomp's version macros.
    Prompt for Claude
    GOAL: Add a scripted tour that compares screenshots between two builds.
    READ FIRST: `SCOPE.md`, `PROGRESS.md`, `tools/check.ps1`
    FENCE: Edit only `tools/` and `tests/`. Do not change game code.
    CHECK: Run `pwsh tools/tour.ps1 -Old <OLD_BUILD> -New <NEW_BUILD>`. Done means every stop is reached and the report lists each picture as same or changed.
    BUDGET: Stop after 3 failed designs, or 3 hours.
    IF BLOCKED: Stop. Tell me which stop cannot be reached by script.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the summary. 3) Files changed. 4) Stops still missing. 5) New parking-lot items.
    Done whenThe scripted tour reaches every stop on a clean checkout, with no picture changes you did not intend.

    Proof this works: Nebula, Recharged

Tools you need

ToolWhat it doesHow to get itHow we know
WiiCompiled translator
Required both
Turns a Wii main.dol and its RELs into C++. It comes with a runtime for the Wii's system code. It needs the .NET 8 SDK, CMake 3.25 or newer, Ninja and Clang.
Path A
git clone --recursive https://github.com/patchzyy/Wiicompiled ; cd Wiicompiled ; dotnet build translator/Translator.sln -c ReleaseREADME, translator/README.md, projects/examples/generic-dol.yml and .gitmodules (read 2026-11-13). The README shows only the build line; --recursive is needed because aurora-main is a submodule. Used by: Mario Kart WiiCompiled, NSMB Wii Recompiled, Brawl Recompiled, New Super Paper Bros, Shake It! Native PC
LLVM-MinGW
Required Windows
A Clang compiler for Windows. WiiCompiled builds with it; its docs say MSVC is not the tested path.
Path A Path B
Download `llvm-mingw-20261104-ucrt-x86_64.zip` from the releases page, unzip it and add `bin` to PATHREADME and releases page (read 2026-11-13; release 20261104 has llvm-mingw-20261104-ucrt-x86_64.zip); WiiCompiled translator README names it as the shipped compiler; used by: NSMB Wii Recompiled, Brawl Recompiled, New Super Paper Bros, Shake It! Native PC, Metroid Prime 3: Corruption PC, Recharged, OceanTriRecomp
Aurora
Required both
A GameCube and Wii layer for PC. It draws GX graphics through WebGPU and also handles pads, discs and saves.
Path A Path B
Comes inside WiiCompiled as `aurora-main` (a fork, patchzyy/aurora-wiicompiled). For a port, add it as a submodule: git submodule add https://github.com/encounter/aurora extern/aurora ; then add `add_subdirectory(extern/aurora EXCLUDE_FROM_ALL)` to your CMakeLists.txtREADME and docs/building.md (read 2026-11-13; needs CMake 3.25 or newer and a C++20 compiler); WiiCompiled .gitmodules; used by: Recharged, Brawl Recompiled, New Super Paper Bros, Metroid Prime 3: Corruption PC
nodtool
Required both
Reads, checks, extracts and converts Wii disc images, including RVZ and WBFS.
Path A Path B
Download `nodtool-windows-x86_64.exe` from the nod releases page (v2.0.0-alpha.12), or `cargo install --locked nodtool`README and releases page (read 2026-11-13); used by: Mario Kart WiiCompiled, Recharged, Metroid Prime 3: Corruption PC
Dolphin
Required both
The GameCube and Wii emulator. Use it as the reference: compare frames, take savestates and FIFO logs, and debug through its GDB stub.
Path A Path B
Download a build from dolphin-emu.orgrepo and GDBStub source read 2026-11-13 (stub has Windows code); used by: Resident Evil: The Umbrella Chronicles, Mario Kart WiiCompiled, NSMB Wii Recompiled
decomp-toolkit (dtk)
Required both
Splits a DOL and its RELs into objects, finds functions and library code, and checks hashes. It also prints DOL headers.
Path B Path A
Downloaded by dtk-template on first build; or get `dtk-windows-x86_64.exe` (v1.8.4) from the releases pageREADME and releases page (read 2026-11-13); used by: mscharged-decomp (base of Recharged)
dtk-template
Required both
The standard project layout for GameCube and Wii decomps. It needs only Python and Ninja.
Path B
Create a repo from the template on GitHub, clone it, then `pip install ninja`, `python configure.py`, `ninja`README, docs/dependencies.md, docs/getting_started.md, configure.py and tools/project.py (read 2026-11-13). Docs say native Windows is highly recommended and WSL is not required; Linux and macOS are also covered. It pins dtk v1.8.3 and objdiff v3.6.1. Used by: mscharged-decomp
objdiff
Required both
Shows how close your compiled object is to the original, per function and data. Its CLI writes progress reports.
Path B
Download `objdiff-windows-x86_64.exe` (v3.8.3) from the releases page; dtk-template downloads `objdiff-cli` itselfREADME and releases page (read 2026-11-13): PowerPC for GameCube and Wii is supported, and Linux builds exist. dtk-template's docs/dependencies.md says that under WSL objdiff gets no file change alerts, so run it on Windows
Metrowerks CodeWarrior compilers
Required both
The original compilers. A match only counts when this compiler makes the same bytes.
Path B
dtk-template downloads a pinned set on first build (`compilers_20251118`); you do not install them by handdtk-template configure.py (compilers_tag = "20251118") and docs/dependencies.md (read 2026-11-13). They are Windows programs; on Linux and macOS the template downloads wibo to run them
m2c
Helpful both
Turns PowerPC assembly into a first draft of C or C++. The draft rarely matches at once.
Path B
git clone https://github.com/matt-kempster/m2c ; cd m2c ; python m2c.py -t ppc-mwcc-c++ <ASM_FILE> -f <FUNCTION>README and m2c/options.py (read 2026-11-13): targets are platform-compiler-language triples, and ppc, mwcc, c and c++ are all accepted, so ppc-mwcc-c++ and ppc-mwcc-c parse
decomp-permuter
Helpful WSL/Linux
Tries many small random code changes to close a near miss.
Path B
In WSL: git clone https://github.com/simonlindholm/decomp-permuter ; cd decomp-permuter ; python3 -m pip install pynacl toml LevenshteinREADME and src/main.py (read 2026-11-13): supports PowerPC; permuter_settings.toml with build_system = "ninja" for Ninja projects; -j takes a thread count; pynacl and Levenshtein are optional; permuter@home does not work on native Windows, WSL works
DolRecomp
Helpful both
Another GameCube and Wii recompiler. Useful here for its function boundary list and REL folder mode.
Path A
git clone https://github.com/ExpansionPak/DolRecomp ; cd DolRecomp ; cmake -S . -B build ; cmake --build build --config ReleaseREADME (read 2026-11-13): needs CMake 3.16 and a C11 compiler; Windows tested with MSVC and MinGW; REL folder mode; Wii disc extraction needs wit. The README does not show how to export a function list; that use comes from the Shake It! card. Used by: Kirby Wii Recomp (ModernGekko), Shake It! Native PC (function boundaries)
Ghidra with the GameCube Loader
Helpful both
A free disassembler and decompiler. The loader opens DOL and REL files with symbol maps.
Path A Path B
Install Ghidra 12.1.4, the version GhidraMCP needs. Copy the loader zip from its releases page to `<GHIDRA>/Extensions/Ghidra`, then use File, Install Extensions. If Ghidra refuses the zip, build the loader with `./gradlew` and `GHIDRA_INSTALL_DIR` set, as its README showsREADME and releases (read 2026-11-13): loads DOL, REL, apploaders and RAM dumps. The latest zip (1.3.1) is labelled Ghidra 12.1; Ghidra's latest is 12.2 and GhidraMCP asks for 12.1.4. Ghidra used by: OceanTriRecomp
.NET 8 SDK
Required both
Builds and runs the WiiCompiled translator, which is written in C#.
Path A
winget install Microsoft.DotNet.SDK.8Microsoft .NET install page (read 2026-11-13) gives the winget install Microsoft.DotNet.SDK.<VERSION> form; the winget package list has SDK 8 (8.0.428). WiiCompiled translator README requires the .NET 8 SDK
CMake and Ninja
Required both
CMake sets up a C++ build. Ninja runs it. Path A builds the translated game with both, and dtk-template runs on Ninja.
Path A Path B
winget install Kitware.CMake ; pip install ninjacmake.org download page (read 2026-11-13, CMake 4.5.0 listed); winget package list has Kitware.CMake; pip install ninja is from dtk-template docs/dependencies.md. WiiCompiled needs CMake 3.25 or newer
Python 3
Required both
Runs dtk-template's configure.py, m2c and the helper scripts most Wii ports use.
Path A Path B
Download the installer from python.org and add Python to PATHdtk-template docs/dependencies.md (read 2026-11-13) says to install Python from python.org and add it to PATH; Python scripts used by: NSMB Wii Recompiled, Brawl Recompiled, New Super Paper Bros
PowerShell 7 (`pwsh`)
Required Windows
Runs the tools/check.ps1 script in this guide. It installs next to the older Windows PowerShell 5.1 and does not replace it.
Path A Path B
winget install --id Microsoft.PowerShell --source wingetMicrosoft PowerShell install page (read 2026-11-13): PowerShell 7 runs as pwsh.exe, side by side with Windows PowerShell 5.1
Git
Required both
Clones the tools and keeps your project history. Path B uses one git worktree per worker.
Path A Path B
winget install --id Git.Git -e --source wingetgit-scm.com Windows install page (read 2026-11-13) gives this winget command

Skills and add-ons

Read any skill before you install it. A skill is a set of instructions that Claude will follow. See Tools and Skills for the full list and safety notes.

debug-game-in-emulator

skills.sh

Makes each Dolphin run the same way: a throwaway data folder, a log and a time limit. Claude must name the failing layer before it changes code.

npx skills add xsyetopz/skills --skill debug-game-in-emulator -a claude-code

decompile-to-matching-c-cpp

skills.sh

Rules for matching C and C++ with decomp-toolkit, m2c, objdiff-cli and the permuter. It bans fake matches. Read it first; the author is new.

npx skills add xsyetopz/skills --skill decompile-to-matching-c-cpp -a claude-code

matcher

skills.sh

A careful loop for one function. Claude tests one idea at a time and reports a fake match as not done. Install its sister skills too; they call each other.

npx skills add lemiur/game-decompilation-skill-for-claude --skill matcher -a claude-code

decomp-matching-workflow

skills.sh

Sets a try limit per function and gives parallel workers a claim queue, so two workers never take the same unit.

npx skills add madpai/game-decomp-compendium --skill decomp-matching-workflow -a claude-code

static-recomp-scope-plan

skills.sh

Makes you write down what a correct port means before Path A starts: the disc, the scenes to test and the numbers to hit.

npx skills add bgyss/switchrecomp --skill static-recomp-scope-plan -a claude-code

verification-before-completion

skills.sh

Claude may not say done without fresh proof. It must run tools/check.ps1 or ninja and show the output.

npx skills add obra/superpowers --skill verification-before-completion -a claude-code

handoff

skills.sh

Writes a short note so a fresh session can carry on. Tell it to save inside your repo, not the temp folder.

npx skills add mattpocock/skills --skill handoff -a claude-code

GhidraMCP

MCP server

Lets Claude list, decompile and rename functions in a Ghidra project. Useful for proving hook addresses on Path A. A headless mode also exists.

Install `uv` and the GhidraMCP extension in Ghidra 12.1.4, then: claude mcp add ghidra -- uvx --from git+https://github.com/LaurieWired/GhidraMCP ghidra-mcp --ghidra-server http://127.0.0.1:8080/

dolphin-debugger-mcp

MCP server

Lets Claude set breakpoints and read registers in Dolphin, with names from a dtk project's symbols. It was built for a GameCube decomp, so test it on your Wii game first.

Set `GDBPort = 2159` under `[General]` in `Dolphin.ini`, then: claude mcp add dolphin -e DOLPHIN_REPO_ROOT=<DECOMP_REPO> -e DOLPHIN_GAMEID=<GAMEID> -- python3 <PATH>/server.py

wii-run-scenario

write-your-own

Every Path A worker tests the game the same way. This copies the test skill that Resident Evil: The Umbrella Chronicles keeps in its repo.

A project skill in `.claude/skills/wii-run-scenario/SKILL.md`. It runs `pwsh tools/check.ps1 -Scenario <NAME>`, waits on game state, never uses real input or saves, runs at 1280x720, and on failure reads `failure.json` and the last screenshot.

wii-prove-address

write-your-own

Moving hooks is most of Path A. A fixed method stops Claude from trusting a signature name or guessing an address.

A project skill in `.claude/skills/wii-prove-address/SKILL.md`. Given a hook from the base runtime, it finds the address in your DOL by string, caller or code shape, and writes one row to `hle_targets.tsv` with the proof.

Claude setup for this system

Path A: one task is one hook to move, one crash, one missing call or one wrong picture. Each has a harness scenario that must pass. Path B: one task is one unit, a source file the compiler builds alone. ninja must still print OK after the merge. Keep the lists in PROGRESS.md and notes/units.csv, never in the chat.

Which model and effort for each job

The model and effort names come from one shared table, so they stay the same on every guide. See Claude Setup for the reasons.

JobWhat it means on this systemMax 20x (now called Ultra)Max 5x (now called Max)
Plan the projectPick the disc version and the path. Look for decomps, symbol maps and sister ports. Write SCOPE.md.Fable 5.2
effort high
One session. This choice shapes months of work.
Opus 5.5
effort high
Use Fable 5.2 for this one session if you have weekly room.
Set up the projectInstall .NET 8, LLVM-MinGW and Ninja, or set up dtk-template. Write tools/check.ps1 and CLAUDE.md.Opus 5.5
effort medium
Sonnet 5.5
effort medium
Study the game fileFind SDA bases, entry point and function starts. Build MAP.txt. Prove hook addresses. Mark SDK and NW4R units.Opus 5.5
effort high
Opus 5.5
effort medium
Raise to high for function edges and data layouts. A mistake there spreads.
Bulk unitsPath B: small units with a 5-try limit, one per worktree. Path A: plain hook moves that follow a proven pattern.Sonnet 5.5
effort medium
Haiku 5.5 for the plainest units.
Sonnet 5.5
effort medium
Fewer workers at once. Haiku 5.5 for the plainest units.
Hard unitsUnits that failed 5 tries, jump tables, odd register shapes, and translator bugs in rare PowerPC instructions.Fable 5.2
effort high
Go to xhigh only after a failed try at high.
Opus 5.5
effort high
Send only the last few that still fail to Fable 5.2.
Build the runtimeSDK stand-ins for OS, DVD, NAND, WPAD, AX audio and GX through Aurora. Port patches for 64-bit and byte order.Opus 5.5
effort high
Opus 5.5
effort medium
Raise to high for timing and graphics bugs.
Find a bugFind why the game crashes or draws wrong. Use failure.json, Dolphin savestates and FIFO logs. Prove the cause before any fix.Opus 5.5
effort high
After two failed tries with full evidence, move to Fable 5.2.
Opus 5.5
effort high
One bug at a time.
Check the workA fresh session reruns the check, reads the diff and hunts for stubs, fake events, inline asm and edited hashes.Opus 5.5
effort medium
Always a new session, never the one that did the work.
Sonnet 5.5
effort high
Always a new session, never the one that did the work.
Keep the recordsUpdate PROGRESS.md, notes/units.csv, notes/findings.md and the dead-end list after each batch.Haiku 5.5
effort medium
Haiku 5.5
effort medium

How many sessions at once

Max 20x (now called Ultra)

Path A: one lead session plus two or three workers, each on one bug in its own worktree. Translated shards are big, so cap compile jobs at one per 2.5 GB of RAM across all workers. Path B: one lead plus four to six unit workers, each in its own worktree, and one verify session per batch.

Max 5x (now called Max)

Path A: one worker at a time, with the lead and the worker in turns. Path B: one lead and two unit workers. Run long batches overnight. Save hard units for a few focused sessions.

Lines for this project's CLAUDE.md

Add to CLAUDE.md
- At the start of every session, read `SCOPE.md`, `PROGRESS.md` and `notes/findings.md`. Only the owner edits `SCOPE.md`.
- The one check is `pwsh tools/check.ps1` (Path A) or `ninja` printing `build/<GAMEID>/main.dol: OK` (Path B). No PASS or OK line means not done.
- Never edit `generated/`. It is build output. Fix the translator, `recomp.yml`, `MAP.txt` or `runtime/` instead.
- Keep `allow_unsupported_instructions: false`. A build with it on can never ship.
- Read-only: `orig/`, the disc folder, `config/<GAMEID>/build.sha1` and the SHA-256 pin in `recomp.yml`.
- Every hook or SDK address goes in `hle_targets.tsv` with how it was proven. Signature names alone are not proof.
- No stubs and no fake events. A missing SDK call stops with a clear error naming the address.
- Live tests use the harness only: no real input, no real saves, 1280x720 window, never fullscreen.
- No inline `asm`, `#pragma` tricks or match-only `volatile` in `src/`. A clean `NonMatching` unit beats a forced match.
- In a worktree, use absolute paths and edit only the files on your task card. One writer per file.
- Write dead ends and findings in `notes/findings.md`. Side issues go in `notes/parking-lot.md`; do not act on them.
- Never commit disc images, `.dol` or `.rel` files, extracted assets or translated code.

Keep the context small

  • Give Claude one address or one unit name, not pasted assembly. It can read the file itself.
  • Have a subagent read big logs and the harness failure.json, then report ten lines back.
  • Keep CLAUDE.md short. Point to notes/compiler-quirks.md and the hook table by name.
  • Clear the chat between units. The ledger files carry the state, not the chat.
  • Never let Claude read all of generated/. Search it for one function by address.

More prompts for this system

Each step above has its own prompt. These extra prompts cover the rest of the work. Fill in the parts in <ANGLE_BRACKETS>.

Scope and feasibility

Before any work, to choose between a recomp, a decomp or a port of an existing decomp.

Prompt for Claude
GOAL: Tell me which path fits <GAME> (<GAMEID>) and draft `SCOPE.md`.
READ FIRST: https://decomp.dev, https://github.com/patchzyy/Wiicompiled, `notes/prior-work.md`
FENCE: Edit only `SCOPE.md` and `notes/prior-work.md`. Do not download anything.
CHECK: Run `Get-FileHash <DISC_FOLDER>/sys/main.dol -Algorithm SHA256`. Done means the hash matches the draft, and the draft lists the disc ID, revision, REL modules, every prior decomp or port with its percent, and one milestone with a runnable check.
BUDGET: Stop after 45 minutes.
IF BLOCKED: Stop. List the facts you could not confirm.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Your pick: recomp, decomp or port, with three reasons. 3) Files changed. 4) Risks. 5) New parking-lot items.

A good answer: A short pick with reasons tied to real links and percents. Any unknown is marked unknown, not guessed.

Map the binary

After setup, to build the function ledger that every later task uses.

Prompt for Claude
GOAL: Write `notes/functions.csv` with every function in `main.dol` and the RELs.
READ FIRST: `SCOPE.md`, `projects/<game>/MAP.txt` or `config/<GAMEID>/symbols.txt`
FENCE: Edit only `notes/functions.csv`. Do not change the manifest or symbols.
CHECK: Run `python tools/check_ledger.py`. Done means every function in the symbol file is in the ledger once, with size, name source and status.
BUDGET: Stop after 60 minutes.
IF BLOCKED: Stop. List the address ranges you could not classify.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Counts: game, SDK, middleware, unknown. 3) Files changed. 4) Ranges to look at. 5) New parking-lot items.

A good answer: A ledger with counts by category. SDK and NW4R code is marked so nobody works on it by hand first.

Path A unit loop: one crash

For each crash or missing call in the grind phase.

Prompt for Claude
GOAL: Fix the crash in scenario <SCENARIO> at guest address <ADDR>.
READ FIRST: `<RUN_DIR>/failure.json`, `PROGRESS.md`, `notes/findings.md`
FENCE: Edit only `runtime/`, `projects/<game>/` or `tests/`. Never edit `generated/`. No stubs or fake events.
CHECK: Run `pwsh tools/check.ps1 -Scenario <SCENARIO>`, then `pwsh tools/check.ps1`. Done means both print PASS.
BUDGET: Stop after 3 failed fixes or 60 minutes without a proven cause.
IF BLOCKED: Stop. Write the evidence in `notes/findings.md` and tell me what capture you need.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Cause and both PASS lines. 3) Files changed. 4) New scenario. 5) New parking-lot items.

A good answer: DONE with the proven cause in one sentence, the fix in the right layer, and both PASS lines pasted.

Path B unit loop: one unit

For each unit a bulk worker takes.

Prompt for Claude
GOAL: Make unit <UNIT> match 100%.
READ FIRST: the unit's assembly, `notes/units.csv` row for <UNIT>, `notes/compiler-quirks.md`
FENCE: Edit only `src/<UNIT_PATH>`, its header and its `configure.py` line. No inline `asm`, no `#pragma` tricks, no edits to `build.sha1`.
CHECK: Run `ninja`. Done means `build/<GAMEID>/main.dol: OK` and the unit is 100% in `build/<GAMEID>/report.json`.
BUDGET: Stop after 5 real tries with no gain. Each try is a new file, so the best one survives.
IF BLOCKED: Stop. Give the best score and the differing instructions.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) OK line and score. 3) Files changed. 4) One quirk learned, if any. 5) New parking-lot items.

A good answer: DONE with the OK line and 100% for the unit, or PARTIAL with the best score and exact differences.

Batch dispatch

In the lead session, to hand out the next set of tasks to workers.

Prompt for Claude
GOAL: Launch <N> workers, one per task from `tools/next_units.py` (or the top of `PROGRESS.md`).
READ FIRST: `CLAUDE.md`, `notes/units.csv` or `PROGRESS.md`
FENCE: Do not do the tasks yourself. Give each worker its own worktree with absolute paths and one task card. Edit only the ledger.
CHECK: After all workers report, run the full check on the main branch. Done means it passes and the ledger matches the reports.
BUDGET: Stop after <N> tasks or 3 hours. Cap compile jobs at one per 2.5 GB of RAM in total.
IF BLOCKED: Stop launching. Tell me which worker is stuck and why.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) A table of task, worker result and proof. 3) Merges made. 4) Tasks for the hard queue. 5) New parking-lot items.

A good answer: A table with one row per worker, each with pasted proof, and a final full check that passes.

Debug with evidence

When the port draws something wrong or behaves unlike the real game.

Prompt for Claude
GOAL: Find the cause of <SYMPTOM> at <PLACE_IN_GAME>. Do not fix it yet.
READ FIRST: the harness screenshot, a Dolphin savestate and FIFO log of the same frame at <PATHS>
FENCE: Read-only. You may add logging in `runtime/` behind a flag. Write findings only in `notes/findings.md`.
CHECK: First run `pwsh tools/check.ps1 -Scenario <SCENARIO>` and confirm it shows the symptom. Done means you name the first point where the port and Dolphin differ, such as a TEV stage, matrix load or memory write, with the values from both.
BUDGET: Stop after 90 minutes.
IF BLOCKED: Stop. Tell me what extra capture would split the cause.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) The first difference with both values. 3) Files changed. 4) The likely fix and its layer. 5) New parking-lot items.

A good answer: One named difference with values from the port and from Dolphin, not a guess about what might be wrong.

Verify claimed work

After every batch, in a brand-new session that did none of the work.

Prompt for Claude
GOAL: Check that the work in commits <RANGE> is real.
READ FIRST: `git diff <RANGE>`, `CLAUDE.md`, the workers' reports
FENCE: Read-only. Do not fix anything.
CHECK: Rerun the full check from a clean build. Then search the diff for edits to `generated/`, `build.sha1` or the hash pin, inline `asm`, `#pragma`, stubs, fake events, disabled tests and edits outside each task's fence.
BUDGET: Stop after 45 minutes.
IF BLOCKED: Stop. Say which claim you could not test.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) The check output. 3) Each problem with file and line. 4) Which claims hold. 5) New parking-lot items.

A good answer: A rerun check output and a list of problems with file and line, or a plain statement that none were found.

Status report

Once a week, or before you plan the next batch.

Prompt for Claude
GOAL: Give me a status report from the ledger files only.
READ FIRST: `PROGRESS.md`, `notes/units.csv` or `notes/functions.csv`, `notes/findings.md`
FENCE: Read-only.
CHECK: Every number comes from a file or a command you ran, such as `build/<GAMEID>/report.json`.
BUDGET: 15 minutes.
IF BLOCKED: Say which file is missing or out of date.
REPORT: 1) Milestone and its check result. 2) Counts: done, in progress, stuck. 3) Top three blockers. 4) Next three tasks. No other text.

A good answer: Four short sections with numbers and their source files. No filler.

Session handoff

At the end of every session, so a fresh session can pick up.

Prompt for Claude
GOAL: Write what the next session needs into the ledger files.
READ FIRST: this session's changes (`git status`, `git log -5`), `PROGRESS.md`
FENCE: Edit only `PROGRESS.md`, `notes/findings.md` and `notes/units.csv`.
CHECK: Run `git diff --stat -- PROGRESS.md notes/` and paste it. Done means a new session could start the next task from these files alone, and each open task has its next step and its check command.
BUDGET: 10 minutes.
IF BLOCKED: Say what you could not record.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`.
REPORT: 1) DONE or PARTIAL. 2) What works now, with proof. 3) Dead ends tried. 4) The next task card, ready to paste.

A good answer: Updated ledger files and a ready task card. Dead ends are written down so nobody repeats them.

Blocked or cannot deliver

When a task has gone around in circles, or Claude says it is impossible.

Prompt for Claude
GOAL: Give me a plain answer on <TASK>: can it be done, and how?
READ FIRST: `notes/findings.md`, the attempt files for <TASK>
FENCE: Read-only.
CHECK: Run the task's own check command once more and paste the output. Your answer names the exact blocker with evidence: differing instructions, a log line or an address. 'Compiler artifact' or 'probably' is not evidence.
BUDGET: 20 minutes.
IF BLOCKED: Say BLOCKED and what would unblock it.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) The blocker in one sentence. 3) The evidence. 4) Two or three options with cost. 5) Your pick.

A good answer: A one-sentence blocker, real evidence and a few options. No pretending the task is done.

Scope change request

When Claude thinks a fix needs files outside the task's fence.

Prompt for Claude
GOAL: Ask me before you leave the fence for <TASK>.
READ FIRST: the task card, `SCOPE.md`
FENCE: Change nothing until I answer yes.
CHECK: Your request names the files, why the current fence is not enough, and the risk to other units or scenarios.
BUDGET: 10 minutes.
IF BLOCKED: Wait for my answer.
REPORT: 1) BLOCKED. 2) Files you want to change. 3) Why. 4) Risk and how you would check it. 5) What you will do if I say no.

A good answer: A short request that waits for your yes or no. Nothing is changed before you answer.

Keep Claude on task

These are the detours Claude tends to take on this system, and the rule that stops each one. The full method is on Stay on Task.

The detourThe rule to give Claude
Claude edits translated C++ in generated/ to stop a crash.Never edit generated/. Fix the translator, the manifest or the runtime. Block writes to generated/ with a hook.
Claude turns on allow_unsupported_instructions to get past a translation error.Keep it false. A failing instruction is a translator task with its own card.
Claude stubs an SDK call or fakes an event so the game passes a screen.No stubs, no fake events. An unimplemented call stops with an error that names its address.
Claude trusts a signature name or guesses a hook address.Every address needs proof in hle_targets.tsv: a string, a caller or a code shape. Check the register use too.
Claude claims a speed-up from one timed run.Judge speed only with a fixed test and guest instruction counts, as the Resident Evil: The Umbrella Chronicles port does. One timed run can move by about 1% from code layout alone.
Claude takes over your keyboard, plays on your real saves or runs fullscreen.Live tests go through the harness only: scripted input, copied saves, a 1280x720 window.
On Path B, Claude forces a match with inline asm, #pragma lines or a changed build.sha1.Ban these in CLAUDE.md, lint for them, and block edits to build.sha1 with a hook. NonMatching is accepted.
Claude calls a unit impossible and blames the compiler.Before 'stuck', name the differing instructions and two matched units with a similar shape.

Problems other projects hit

A different region or revision puts code at other addresses. The game breaks in ways that are hard to debug.

Fix: Pin one disc by game ID and main.dol SHA-256 in the manifest. Reject every other dump.

Seen in: Mario Kart WiiCompiled, NSMB Wii Recompiled, Brawl Recompiled, Shake It! Native PC

Code in REL modules is not translated, so the game stops when it loads one.

Fix: Link the RELs offline at the fixed addresses the game uses, then translate them with the DOL.

Seen in: NSMB Wii Recompiled, Brawl Recompiled, New Super Paper Bros, OceanTriRecomp

A missed vtable method, thunk or jump table entry stops the game with Missing translated target.

Fix: Seed function starts by code shape, such as vtables and thunks. Add each leftover address to the function map.

Seen in: OceanTriRecomp, Resident Evil: The Umbrella Chronicles

Compiling the translated game runs out of memory. A few huge functions take most of the time.

Fix: Run one compile job per 2.5 GB of RAM. Mark the slowest functions noopt or isolate.

Seen in: Brawl Recompiled, Resident Evil: The Umbrella Chronicles

First launch freezes while GX shaders compile. One port took about 17 minutes and 9 GB of RAM.

Fix: Record GPU pipelines in test runs and ship them as a cache. Compile them before the game starts.

Seen in: Metroid Prime 3: Corruption PC, Recharged

A hand-written SDK stand-in read the wrong registers, so loading stalled.

Fix: Check each stand-in's register use against the real code. Test it against the translated original, as OceanTriRecomp does.

Seen in: Resident Evil: The Umbrella Chronicles

Unlocking the frame rate broke code that counts frames, not time. Timeouts and fades ran at the wrong speed.

Fix: Audit code that steps per frame. Fix each site and keep a list of them.

Seen in: Resident Evil: The Umbrella Chronicles, OceanTriRecomp

Licences clash. NWiiRecomp is non-commercial, and Dolphin's audio code is GPL, so a built game could not be shared.

Fix: Read every licence in SCOPE.md. Let players build from their own disc if you mix licences.

Seen in: Crash of the Titans: Wiicompiled

Decomp code assumes 32-bit pointers and big-endian data, so it breaks on a PC.

Fix: Keep a faithful patch series for pointer width and byte order. Swap data bytes once at import.

Seen in: Recharged, Nebula

The upstream decomp refuses AI-made changes, so port fixes cannot go back.

Fix: Check the project's rules before you start. Keep your changes as patches in your own repo.

Seen in: Nebula

How long it takes

Max 20x (now called Ultra)Max 5x (now called Max)One person, no AIHow sure
Path A: running on PC3 to 10 weeks2 to 6 months6 to 18 monthsmedium confidence
Path B: full decomp5 to 18 months, of which 1 to 3 months is the port9 months to 3 years, port included5 to 10 yearslow confidence

Read this first

All ranges assume one medium game and one person giving 10 to 15 hours a week. Path A is medium confidence. One project is dated clearly, and several partly dated ones agree on weeks. Most Wii ports hid private work before their first commit, so real times may be longer. Path B is low confidence. No one-person, AI-assisted Wii decomp has published dates. The numbers lean on community projects and on GameCube's Melee, so treat them as rough. Path B ranges include porting the finished decomp to PC.

What makes it faster or slower

  • Whether a sister game already has a WiiCompiled port or a decomp. Brawl Recompiled had its first release a day after it forked the same author's Super Paper Mario port.
  • Whether a symbol map exists. Without one, missed functions show up one crash at a time.
  • How many RELs the game loads. A game with one main.dol is simpler than Metroid Prime 3 with 74 modules or Brawl with 126.
  • Game size. Strikers Charged has 17,689 functions; Brawl has 92,522.
  • Whether you build a harness early. Without it, every test needs you at the keyboard.
  • Compile time and RAM. Building the Wario Land port on a player's PC takes 15 to 45 minutes and 16 GB of RAM is advised.

The facts behind these numbers

ProjectWhat happenedLink
Resident Evil: The Umbrella ChroniclesFirst commit 2026-10-11, first real translation 2026-10-12, first playable release 2026-10-26. One person, own translator, AI agents per the developer.source
Mario Kart WiiCompiledRepo created 2026-08-10, first release 2026-08-23, 21 releases by 2026-11-10, 20 contributors. README says AI coding tools were used.source
Brawl RecompiledForked from the author's Super Paper Mario port on 2026-10-21. First release 2026-10-22, v0.5.3 on 2026-10-31. 26 of 40 commits have AI co-author lines.source
Crash of the Titans: WiicompiledRepo created 2026-10-18, first public pre-release 2026-10-23 per the changelog. Developer says AI agents wrote all of it.source
Mario Strikers Charged decompFirst commit 2026-08-20. All 17,689 functions matched and linked for five disc versions by about 2026-10-23. Four contributors. AI use not stated. It borrowed code from the GameCube sister-game decomp.source
RechargedPort of the finished Strikers decomp. First commit 2026-10-01, first release 2026-10-10. README says it is built with AI help.source
Petari (Super Mario Galaxy decomp)Repo created 2019-04-28. On 2026-11-10: 100% of 42,036 functions matched, 68.8% of code linked. 66 contributors. Does not accept AI changes.source
Super Smash Bros. Brawl decompRepo created 2024-03-30. On 2026-11-08: 1.7% of code matched across 92,522 functions.source
Super Smash Bros. Melee decomp (GameCube, same tools)48.54% matched on 2026-01-10 and 100% on 2026-09-07, with AI-assisted pull requests from a community.source
NWiiRecompA recompiler built mostly by hand. Repo created 2026-05-30, 226 commits by 2026-08-07. Its README says AI was used only for commit titles and for putting code comments into English.source

Projects reviewed (13)

The top-starred project for each of the top 12 Wii games on RecompLauncher, plus one project its developer says was written by AI. RecompLauncher lists 25 Wii projects for 19 games. None came from outside it.

What each project teaches

Mario Kart WiiCompiled

Mario Kart Wii

Top rated on RecompLauncherstatic recompplayable
WiiCompiled translatorAuroraDawnnodtoolLLVM-MinGWCMake

Started: 2026-08. First release: 2026-08. Code: C# and C++.

AI: yes: README says AI coding tools were used; output is checked against real hardware

Lesson: Keep the translator generic and put every game address in one YAML manifest. Ghosts, which are input replays, gave a free check that physics match the Wii.

Nebula

Super Mario Galaxy

Top rated on RecompLauncherport of a decompplayable
Petari decompclangMSVCCMakeNinjanod

Started: 2026-10. First release: 2026-10. Code: C++.

AI: yes: README says the host, renderer, installer, tests and docs were written with Claude agents

Lesson: It began as a recomp and moved to the decomp once the host was ready. A scripted tour with 386 screenshots checks each new build.

Project Reignition

Sonic and the Secret Rings

Top rated on RecompLauncherreimplementationin progress
Godot 4.7C#GDScript

Started: 2022-03. First release: 2024-06. Code: C# and GDScript.

AI: none stated

Lesson: This is a remake, not a decomp. It took 4,476 commits and 14 people since 2022, so it is no shortcut.

Brawl Recompiled

Super Smash Bros. Brawl

Top rated on RecompLauncherstatic recompplayable
WiiCompiled translatorAuroradoldecomp/brawl symbolsLLVM-MinGWCMakeNinja

Started: 2026-10. First release: 2026-10. Code: C++ and C#.

AI: yes: 26 of 40 commits carry Claude co-author lines; an AGENTS.md is cited but not published

Lesson: It started as a copy of the same author's Super Paper Mario port, so its first release came one day later. It used a decomp only for its symbol list.

Recharged

Mario Strikers Charged

Top rated on RecompLauncherport of a decompplayable
mscharged-decompAuroraDawnnodSDL3CMake

Started: 2026-10. First release: 2026-10. Code: C++.

AI: yes: README says AI agents help with refactors, tests and repeated changes; game code comes from the matching decomp

Lesson: It never edits the decomp. Every change is a small patch on a pinned copy. Faithful fixes and gameplay tweaks sit in two separate series.

NSMB Wii Recompiled

New Super Mario Bros. Wii

Top rated on RecompLauncherstatic recompplayable
WiiCompiled translatorAuroraDawn.NET 8LLVM-MinGWPython scripts

Started: 2026-08. First release: 2026-10. Code: C++ and C#.

AI: yes: README says the port was entirely coded by Claude, directed and tested by the author

Lesson: The translator moved to a new game unchanged. The runtime did not. Every hook moved to new addresses, with scripts to find and check them.

New Super Paper Bros

Super Paper Mario

Top rated on RecompLauncherstatic recompplayable
WiiCompiled translatorAuroraspm-decomp symbolsLLVM-MinGWCMakeNinja

Started: 2026-10. First release: 2026-10. Code: C++ and C#.

AI: yes: 70 of 72 commits carry Claude co-author lines; agent notes are git-ignored

Lesson: A map sweep loads every level, counts undrawn pixels and keeps a screenshot. It also matched code shapes against the NSMBW port to move hooks fast.

Kirby Wii Recomp

Kirby's Return to Dream Land

Top rated on RecompLauncherstatic recompplayable
DolRecompRecompCore (Dolphin-based)CMakeNinjaCTest

Started: 2026-07. First release: 2026-07. Code: C++.

AI: none stated (one branch name starts with agent/)

Lesson: One shared runtime can serve many GameCube and Wii games. The Kirby files are not public, so you cannot repeat its build.

Resident Evil: The Umbrella Chronicles

Resident Evil: The Umbrella Chronicles

Top rated on RecompLauncherstatic recompplayable
own translatorown Vulkan and Direct3D renderersclang-clCMakeNinjaDolphin as reference

Started: 2026-10. First release: 2026-10. Code: C++ and Python.

AI: yes: developer says Claude and Codex did research, launcher code, port code and docs Agent files: AGENTS.md, .claude/skills/uc-test/SKILL.md.

Lesson: A test server inside the game lets an agent play it with no keyboard. Small dated tests, each with a pass mark, came before every big choice.

Shake It! Native PC

Wario Land: Shake It!

Top rated on RecompLauncherstatic recompplayable
WiiCompiled translatorDolRecomp boundariesDolphin signature databaseLLVM-MinGWAurora

Started: 2026-10. First release: 2026-10. Code: C++ and C#.

AI: none stated

Lesson: A game with one main.dol and no RELs is the easiest kind to start with. Proven addresses live in small tables next to the manifest.

Metroid Prime 3: Corruption PC

Metroid Prime 3: Corruption

Top rated on RecompLauncherstatic recompin progress
WiiCompiled (modified)AuroraDawnnodLLVM-MinGW

Started: 2026-10. First release: 2026-10. Code: unknown (source not public).

AI: yes: 13 of 20 commits in the docs repo carry Claude co-author lines; the port source is private

Lesson: GX state turns into thousands of GPU pipelines. Ship a seed cache, or first launch takes about 17 minutes. A key that zips a bug report helps testers.

OceanTriRecomp

Monster Hunter Tri

Top rated on RecompLauncherstatic recompplayable
WiiCompiled translator (copy)Aurora (modified)ANGLESDL3Ghidra

Started: 2026-10. First release: 2026-10. Code: C++.

AI: yes: README says Claude did about 85% of the work (CONTRIBUTING.md says 65%)

Lesson: Seed function starts by code shape, not one crash at a time. Beware: its README build steps do not match the files in the repo.

Crash of the Titans: Wiicompiled

Crash of the Titans

Added: developer used AIstatic recompplayable
NWiiRecompWinLibs GCCCMakeNinjaPython build stagesTauri

Started: 2026-10. First release: 2026-10. Code: Python and C++.

AI: yes: developer says AI agents wrote all of it under his guidance and testing

Lesson: About 300 small fix scripts and 114 check scripts run in order, and the build stops at the first failure. Read licences early: NWiiRecomp is non-commercial.

What we could not check

  • When most Wii ports really started. Many published their first commit and first release on the same day, so earlier private work is unknown.
  • Whether AI was used on the Mario Strikers Charged decomp. Its README and CONTRIBUTING.md do not say, and no commit has an AI co-author line.
  • When exactly the Strikers decomp reached 100%. The date above comes from its last regional linking commits.
  • Whether plain decomp-permuter runs on native Windows. Its README only says permuter@home does not.
  • Whether the Ghidra GameCube Loader opens Wii DOL files. Its README names GameCube only, and its latest zip targets Ghidra 12.1.
  • Whether dolphin-debugger-mcp works on a Wii project. It was built for a GameCube decomp.
  • The Dolphin download page. It refused automated reading again on 2026-11-13 (HTTP 403), so the install line was not checked there.
  • Which compilers third-party Wii games used. The reviewed decomps only show Metrowerks tools.
  • The tools/check.ps1 (with its -BuildOnly, -Scenario and -Full switches), tools/check_ledger.py, tools/next_units.py, tools/tour.ps1 and tools/full_check.py files are ones you write. No reviewed project ships them under these names. Only Shake It! Native PC keeps an hle_targets.tsv.
  • The manifest key name for the main.dol SHA-256 pin. The translator README says the pin exists, but the example manifest does not show it. Copy it from a reviewed port's recomp.yml.
  • Whether the Ghidra GameCube Loader zip labelled Ghidra 12.1 installs on Ghidra 12.1.4. If not, build it from source.
  • How to export a function list from DolRecomp. Its README does not show it; Shake It! Native PC says it used DolRecomp boundaries.
  • The folder layout nodtool extract gives for a Wii disc. The sys/ and files/ layout here comes from WiiCompiled's macOS guide, read through its review card. Check that sys/main.dol exists after you extract.
  • The exact arguments WiiCompiled build scripts pass on Windows. The full list was read only from its macOS guide and from the Brawl and Super Paper Mario cards.
  • Time ranges for one person. No reviewed project gives hours spent.

Sources