A native port of Super Mario Maker 2 (v3.0.3) for macOS, iOS / iPadOS, Windows, Linux and Android, made by static recompilation. The game's AArch64 code is translated to C ahead of time and compiled for your platform. A native runtime stands in for the Switch's system services, and the game's graphics run on Metal or Vulkan. Nothing is emulated at run time.
On top of the original game it adds:
- The 100 Mario Challenge from Super Mario Maker 1, with SMM1's difficulty select, world map, start card and ending, next to SMM2's own Endless Challenge
- Course World without Nintendo's servers, through a self-hostable open-source course server, or courses from TGRCode's public archive
- SMM1 features as mods, each with its own switch: Mystery Mushroom costumes, Lanky Mario (the Weird Mushroom), mid-air shell jumps, overlapping pipes, and "Try it now" buttons to try them in a course
- Co-op in Endless and 100 Mario, Super Worlds in Course World, and editing any course you downloaded
You need your own copy of the game. This repository and its downloads contain no code, assets, text, keys or recompiled output from Super Mario Maker 2 or Super Mario Maker. You point the program at your own dump, and everything made from it is generated on your machine.
A download is a launcher plus the recompiler, not the game: on first start it takes your dump, checks it, recompiles the game code on your computer, and then runs it.
-
Download the package for your system from Releases:
System Package Also needs Windows 10 / 11, x64 SMM2Recomp-windows-x86_64.zipa CPU with x86-64-v2 (AVX2 used when available), a Vulkan 1.3 graphics driver (docs/windows.md) Linux, x64 or arm64 SMM2Recomp-linux-x86_64.tar.gz,-linux-aarch64.tar.gzSDL3 3.2+ and a Vulkan 1.3 driver from your distribution (Debian 13, Ubuntu 25.04, Fedora 41, Arch or newer); x64: x86-64-v2 (AVX2 used when available) macOS 15+, Apple silicon SMM2Recomp-macos-arm64.zip(Super Mario Maker 2.app)nothing; the app isn't notarized: right-click > Open the first time (macOS then checks the whole app once, which can take a few minutes)
| macOS 15+, Intel (x86-64) | no package yet: build it from source (see Building) | a CPU with AVX2 (Intel Haswell / 2013 or newer); Homebrew sdl3 |
- Unpack it and start it (
smm2recomp.exe,./smm2recomporSuper Mario Maker 2.app). Windows keeps everything in the unpacked folder, so put it somewhere writable. - Point it at your dump. The setup screen asks for:
- Super Mario Maker 2 with the 3.0.3 update: the game's NSP or XCI and the update's NSP, or folders with their extracted ExeFS and RomFS. The version is checked against the known 3.0.3 files (build ids and hashes of your own files).
- Your console's
prod.keysand firmware (the folder of its system.ncafiles): the game's fonts come from there. If an emulator already has them, they're filled in. They're read where they are, never copied, and key values are never shown or logged. - Optionally Super Mario Maker (Wii U), for the SMM1 mods.
- Set up and play. The first time it extracts and lays out your files, copies the fonts and recompiles the game code with the bundled compiler: a few minutes to half an hour. Then the game starts, and later starts go straight to it.
If something goes wrong, please open an issue
and attach the log files from the program's data folder: smm2recomp.log (the program) and
logs/setup.log (the setup's steps). Neither contains key values. After a crash, the next start keeps the crashed
session's log as smm2recomp.previous.log: attach that one. The data folder is:
| System | Data folder |
|---|---|
| Windows | the unpacked folder, next to smm2recomp.exe |
| Linux | ~/.local/share/smm2recomp (or $XDG_DATA_HOME/smm2recomp) |
| macOS | ~/Library/Application Support/org.smcraft.smm2recomp |
The setup screen tells you when a newer release is out and links to it; nothing is downloaded by itself. Android and iOS / iPadOS have no download: they're built yourself from source (recomp/README.md); iOS needs a Mac to build, sign and install the app.
| Title screen | Playing the title course | Make / Play |
|---|---|---|
![]() |
![]() |
![]() |
100 Mario Challenge
| Difficulty select | World map | Course-in card |
|---|---|---|
![]() |
![]() |
![]() |
| Ending | Credits |
|---|---|
![]() |
![]() |
Early development. Release packages for Windows, Linux and macOS are on the Releases page; iOS / iPadOS and Android are built from source.
| Platform | Graphics | Status |
|---|---|---|
| macOS (Apple Silicon) | Metal | Plays courses. Input replays stay frame-for-frame in sync with the game running in Ryujinx, and in-course frames are pixel-identical in 71 of 90 style × theme combinations. The reference platform. The player app goes from an empty data folder through its setup screen and the first-launch recompile to the title screen. |
| macOS (Intel, x86-64) | Metal | Builds and runs natively on an Intel Mac: the game code uses the portable-C lowering (as on Windows / Linux x64) and the SIMD differential tests pass. Booted to the title at 60 fps and into Course World on a Metal 2-only GPU (NVIDIA GT 755M), which needs the driver limits in PROGRESS.md worked around (no ASTC textures, no packed 16-bit colour textures, no swizzle views, no Metal binary archives). MetalFX (the upscaler) needs Apple silicon or a supported GPU: the app falls back to bilinear scaling. |
| iOS / iPadOS (arm64) | Metal | Plays at 60 fps on iPad Pro, with an on-screen controller and touch. Built on a Mac and installed on your own device. |
| Windows (x64) | Vulkan | Testers play the release package; their reports are in Issues. See docs/windows.md. |
| Linux (x64, arm64) | Vulkan | Testers play the release packages (a Steam Deck runs it, slowly so far); arm64 boots to the title screen in a VM. |
| Android (arm64, Android 13+) | Vulkan | Builds an APK on your computer from your dump; boots and plays the title course in the Android emulator. Not yet tested on a real device. |
| Feature | Status |
|---|---|
| Title, menus, course play, Course Maker test play | Working; fidelity work ongoing |
| 100 Mario Challenge (SMM1) | Playable start to finish, ending included; co-op with more controllers |
| Endless Challenge (SMM2) | Playable against the course server; co-op with more controllers |
| Course World (lists, search, download, play, leaderboards, uploads, Super Worlds) | Working against the course server; likes and comments in progress |
| Edit any course (as in SMM1) | Working |
| SMM1 feature switches | Costumes, Lanky Mario, shell jumps, overlapping pipes |
| Online multiplayer | Through Nextendo (sign-in); new, not yet tested on hardware |
PROGRESS.md has the detailed checklist and the evidence behind each item, and DECISIONS.md records the design decisions and why they were made.
- Recompile. The recompiler (
recomp/tools/, Python) reads the game's executable from your dump and translates every function to C. - Build. That C is compiled together with the runtime (
recomp/runtime/, C and Objective-C), which implements the Switch's kernel, system services, audio, input and the NVN graphics API on Metal or Vulkan. - Play. The result is an ordinary native app that loads the game's assets straight from your dump.
Mods hook into the recompiled game at chosen functions. The course server (core/, Rust) answers
the requests the game would normally send to Nintendo.
The recompiler is a fork of LAS Recomp (MIT).
- A dump of Super Mario Maker 2: the base game RomFS plus the v3.0.3 update ExeFS and RomFS, extracted
- For the 100 Mario Challenge, a dump of Super Mario Maker (Wii U)
- macOS on Apple silicon or Intel (x86-64, with AVX2) with the Xcode command-line tools, Homebrew
sdl3andffmpeg, and Python 3.12 or newer - About 2 GB of free disk space
make -C recomp venv # once: the recompiler's Python environment
make -C recomp smm2 # verify the dump, recompile it to C, build (10–20 min the first time)
make -C recomp run-smm2 # playControls: a controller works out of the box. On the keyboard:
| Keys | Switch button |
|---|---|
| WASD | left stick |
| arrow keys | D-pad |
| K / J / L / I | A / B / X / Y |
| Q / E | L / R |
| 1 / 3 | ZL / ZR |
| Enter / Backspace | + / − |
| F1 or Esc | settings menu |
| F11 | full screen |
- Windows: cross-compiled from macOS into a package that recompiles the game from your dump on first launch. See docs/windows.md.
- iOS / iPadOS, Linux, Android: see recomp/README.md.
make -C recomp GAME=smm2 app-macos # dist/SMM2Recomp-macos-arm64.zip
recomp/tools/fetch_zig.sh && recomp/tools/fetch_deps.sh windows-x86_64
make -C recomp TARGET=windows-x86_64 GAME=smm2 DEPS="$PWD/recomp/build/deps-windows-x86_64" packageEach package is checked for anything from a game dump before it is archived
(scripts/check_package.py). .github/workflows/release.yml builds all of them when a v* tag
is pushed and attaches them to the release; details in recomp/README.md.
Course World, the Endless Challenge and the 100 Mario Challenge talk to a self-hostable open-source server instead of Nintendo's. The server holds accounts, courses, leaderboards and challenge runs, and can also pull courses from TGRCode's archive. On iOS a copy runs inside the app, so no setup is needed.
To run your own:
cd core
cargo run --release -p mmk-cli -- server --dir ./server-data --addr 0.0.0.0:8640
cargo run --release -p mmk-cli -- register Ada --server http://localhost:8640 # prints a token
cargo run --release -p mmk-cli -- upload --token <token> courses/*.bcd --keys <course key table>docs/self-hosting.md covers ports, HTTPS, accounts and moderation. The API
is documented at the top of core/crates/server/src/lib.rs.
| Path | Contents |
|---|---|
recomp/ |
the recompiler, the runtime and SMM2's game-specific code and mods (recomp/README.md) |
core/ |
the course server and shared course logic (Rust) |
smmfmt/, tests/ |
a Python reference implementation of the course file formats |
docs/ |
course file formats, toolchain, self-hosting, Windows |
scripts/install-hooks.sh # pre-commit check that blocks proprietary files
scripts/check.sh # everything CI runs: server fmt / clippy / tests, recomp compile check, proprietary-file checkNever commit game files or anything generated from them. Generated output stays in the gitignored
recomp/private/, recomp/generated/ and recomp/build/. scripts/check_no_proprietary.py runs
in CI and in the pre-commit hook to enforce this.
This is an unofficial fan project, not affiliated with or endorsed by Nintendo. Super Mario Maker, Super Mario Maker 2 and related names are trademarks of Nintendo. No Nintendo code or assets are distributed here. You need a legally obtained copy of the game, and you build everything from it yourself.
SMM2 Recomp is licensed under the GNU General Public License v3.0 or later.
It includes code under other licenses, which keep their own terms:
- the recompiler started as a fork of LAS Recomp (MIT, recomp/LICENSE-LASRecomp)
- the third-party libraries in
recomp/third_party/each have their own license file (Dear ImGui, SMAA, bcdec, Mbed TLS and others)
recomp/UPSTREAM.md lists each upstream project and its license.
The license covers this project's own code only. It grants no rights to Nintendo's games, code or assets, or to anything generated from your dump.







