You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Asked from use: "I saw there was a recomp launcher that used recomps. Can we do that on our system?"
What exists out there
N64 static recompilations — N64Recomp turns a ROM into a native PC
executable; the port ships as a normal GitHub Release and the user supplies their own ROM. Fourteen are
playable today (Majora's Mask, Mario Kart 64, Star Fox 64, Banjo-Kazooie, Goemon, Harvest Moon 64, Dr. Mario
64, Quest 64, Snowboard Kids 2, Bomberman 64/Hero, Duke Nukem ZH, Dinosaur Planet, Extreme-G) per readonlymemo's list and Held Games.
The launcher the user saw is SirDiabo/GithubLauncher
(formerly "N64Recomp Launcher", renamed at the N64Recomp developers' request), MIT. It is generic: an apps.json of {name, repository, folderName, appIconUrl} entries, each pointing at a GitHub repo whose
latest Release it downloads and updates. It does nothing about ROMs — the user handles that per port.
Why this fits EB almost entirely with what already exists
A recomp port is, structurally, a standalone emulator that can run exactly one game. EB's standalone tier
(EmulatorRegistry::ExternalEmulator) already has every mechanism the launcher has, and more:
resolution from api.github.com/repos/<o>/<r>/releases/latest (updateJsonUrl) — the same thing the
launcher does
per-OS artifact patterns and binaries (winArtifact/linuxArtifact/macArtifact, winBinaries…)
auto-install into emulators/<id>/, argsTemplate, fullscreen args, a homepage fallback
a load-bearing systems binding that makes an entry selectable for a system, and a per-game /
global emulator picker in both settings builders (this is how ares became a selectable N64 emulator)
What it does not have is the one new concept a port needs: binding to a game, not a system. ares
can run every N64 game; Zelda64Recomp can run one. Offering it on every N64 row would be wrong.
Proposed behaviour
A port catalog as data, not code — native/ports/n64recomp.json shipped in-tree, overridable from <data>/ports/*.json exactly as <data>/systems/*.json overrides systems (Data-driven system catalog: grow toward ES-DE's system coverage without recompiling #92). Per entry: display
name, GitHub owner/repo, per-OS asset patterns, executable name, the game it runs (No-Intro title
accepted region/revision + known-good hash where published), how it takes the ROM, portable-mode
flag, license, homepage. Data because the catalog rots: readonlymemo's Mario Kart link 404s today,
the upstream is not on GitHub under that name, and asset naming differs per port
(Zelda64Recompiled-v1.2.2-Windows.zip vs MarioKart64Recompiled-0.9.2-anylinux-x86_64.AppImage).
A "Native port" verb on the matching game's row only — surfaced beside the existing backend/emulator
choice for that one N64 title, never on the system. Matching is by identity: the game's catalog key
and, where the user has a No-Intro DAT loaded, HashVerify against the port's accepted dump. Without a
DAT, fall back to the title match and let the port's own check speak (Zelda64Recomp refuses a wrong
ROM itself).
Install = the existing standalone-emulator install, pointed at the port's release. Tolerate releases/latest 404 (prerelease-only projects) by falling back to the newest release in the list.
ROM provisioning per port's declared mode. Zelda64Recomp asks for the ROM in its own main menu and
auto-converts formats; some ports want the file beside the exe; some take a CLI path. The catalog entry
declares which; EB does the placing/pointing where it can and otherwise opens the port and tells the
user what to pick. Never modify the user's ROM.
Saves stay the port's (%LOCALAPPDATA%\<Port>\saves etc.), with portable.txt honoured where a
port supports it so a per-profile layout is possible later. Not in scope now: importing/syncing them.
Not in scope
Building recomps from source; non-N64 decomps (Ship of Harkinian, sm64 PC port — different tooling, a
follow-up if wanted); modding/mod-manager integration each port offers; anything that ships a ROM.
Risks stated up front
Catalog maintenance is the real cost. Fourteen upstreams, several under individual accounts,
renames and 404s already observed. Data + user override keeps that off the build.
Naming. The N64Recomp developers asked a third party to stop using their name in a launcher. EB
should call these "native ports" and credit each upstream by its own name; do not brand anything
"N64Recomp".
Defender. Every port is an unsigned exe downloaded from GitHub and will hit the same Bearfoos.A!ml-class ML heuristic that took EB's own build this week. Expect it; surface it as a
message rather than a silent failure.
Asked from use: "I saw there was a recomp launcher that used recomps. Can we do that on our system?"
What exists out there
N64 static recompilations — N64Recomp turns a ROM into a native PC
executable; the port ships as a normal GitHub Release and the user supplies their own ROM. Fourteen are
playable today (Majora's Mask, Mario Kart 64, Star Fox 64, Banjo-Kazooie, Goemon, Harvest Moon 64, Dr. Mario
64, Quest 64, Snowboard Kids 2, Bomberman 64/Hero, Duke Nukem ZH, Dinosaur Planet, Extreme-G) per
readonlymemo's list and
Held Games.
The launcher the user saw is SirDiabo/GithubLauncher
(formerly "N64Recomp Launcher", renamed at the N64Recomp developers' request), MIT. It is generic: an
apps.jsonof{name, repository, folderName, appIconUrl}entries, each pointing at a GitHub repo whoselatest Release it downloads and updates. It does nothing about ROMs — the user handles that per port.
Why this fits EB almost entirely with what already exists
A recomp port is, structurally, a standalone emulator that can run exactly one game. EB's standalone tier
(
EmulatorRegistry::ExternalEmulator) already has every mechanism the launcher has, and more:api.github.com/repos/<o>/<r>/releases/latest(updateJsonUrl) — the same thing thelauncher does
winArtifact/linuxArtifact/macArtifact,winBinaries…)emulators/<id>/,argsTemplate, fullscreen args, a homepage fallbacksystemsbinding that makes an entry selectable for a system, and a per-game /global emulator picker in both settings builders (this is how ares became a selectable N64 emulator)
What it does not have is the one new concept a port needs: binding to a game, not a system. ares
can run every N64 game; Zelda64Recomp can run one. Offering it on every N64 row would be wrong.
Proposed behaviour
native/ports/n64recomp.jsonshipped in-tree, overridable from<data>/ports/*.jsonexactly as<data>/systems/*.jsonoverrides systems (Data-driven system catalog: grow toward ES-DE's system coverage without recompiling #92). Per entry: displayname, GitHub
owner/repo, per-OS asset patterns, executable name, the game it runs (No-Intro titleflag, license, homepage. Data because the catalog rots: readonlymemo's Mario Kart link 404s today,
the upstream is not on GitHub under that name, and asset naming differs per port
(
Zelda64Recompiled-v1.2.2-Windows.zipvsMarioKart64Recompiled-0.9.2-anylinux-x86_64.AppImage).choice for that one N64 title, never on the system. Matching is by identity: the game's catalog key
and, where the user has a No-Intro DAT loaded,
HashVerifyagainst the port's accepted dump. Without aDAT, fall back to the title match and let the port's own check speak (Zelda64Recomp refuses a wrong
ROM itself).
releases/latest404 (prerelease-only projects) by falling back to the newest release in the list.auto-converts formats; some ports want the file beside the exe; some take a CLI path. The catalog entry
declares which; EB does the placing/pointing where it can and otherwise opens the port and tells the
user what to pick. Never modify the user's ROM.
%LOCALAPPDATA%\<Port>\savesetc.), withportable.txthonoured where aport supports it so a per-profile layout is possible later. Not in scope now: importing/syncing them.
Not in scope
Building recomps from source; non-N64 decomps (Ship of Harkinian, sm64 PC port — different tooling, a
follow-up if wanted); modding/mod-manager integration each port offers; anything that ships a ROM.
Risks stated up front
renames and 404s already observed. Data + user override keeps that off the build.
should call these "native ports" and credit each upstream by its own name; do not brand anything
"N64Recomp".
Bearfoos.A!ml-class ML heuristic that took EB's own build this week. Expect it; surface it as amessage rather than a silent failure.