seedds c5fa7d6c58 Three Houses' and Engage's shader tables split again: the NSP script stopped at the shader split for both (#35)
Since 56b8061 the split reads the GLSLC outputs of every main and pairs only vertex shaders of single-stage sources (GLSLC, Unreal, MT Framework) with the cover, but these two profiles kept the tables of the old split, so the NSP script's comparison failed ("the split shader tables differ from game profile ...").

- Fire Emblem: Three Houses: shader_pairs.tsv 415 -> 398 rows. Its 17 BNSH vertex shaders (nn::ui2d's __ArchiveShader.bnsh in DATA1.bin and two BNSH archives in main) keep the pairs of their own variations and lose only the cover 042f574560d4d29c, so vs_pad gives them only the outputs their own pixel shaders read. nn::gfx binds a variation's stages as one program, and the 246 pipelines in the Mac pso_user.tsv agree: 6 of the 17 were drawn, each only with a pixel shader of its own variation.
- Fire Emblem Engage: the 11 GLSLC shaders Unity has in main are added (shader_map.tsv 9270 -> 9281 rows, one compute row in shader_facts.tsv, 6 cover pairs for its 3 vertex shaders). No existing row changed.

Chain procedure for both: dmsh_chain.h (Three Houses b-58aa432ce3c0, Engage b-1e9d905b402b), Mac and iOS libraries rebuilt (the same metal failures as before: Three Houses 2, Engage 1), c1_full.tsv and cb_extent.tsv regenerated (Three Houses: header lines only). Mac boots of 100 s: Three Houses pre-builds the same 234 pipelines as before, those with the 17 vertex shaders among them, with no pipeline failure and only its known cube texture red line; Engage has no red lines.
2026-10-22 08:42:06 +08:00

nxnative

Play your own Nintendo Switch games natively on iPhone and iPad. Bring your game (its NSP files) and your prod.keys; one script turns them into an IPA that you sideload.

It is not an emulator: the game's own code runs directly on the Apple chip, with Switch graphics rebuilt on Metal. Nothing from any game is in this repository, and the project is not affiliated with Nintendo or any game publisher.

Acknowledgements

This project is built on other people's work:

  • d2r-mobile (MIT) developed this native-execution approach, for Diablo II: Resurrected. nxnative (first called smbw-mobile) started as a copy of its generic parts: the NSO rewriter, the host that stands in for Horizon, the NVN-on-Metal layer and the iOS app shell. Fixes go both ways.
  • Ryujinx (MIT): its shader translator (Ryujinx.Graphics.Shader, Ryujinx.Common and Spv.Generator 1.3.2, in dm/third_party/ryujinx with a few fixes listed in its README) turns the games' Maxwell shaders into SPIR-V. Its emulation of the kernel and system services is also a reference when the host's behaviour is in doubt.
  • Atmosphère: its kernel, mesosphère, is the reference for Horizon's synchronization semantics (address arbiter, condition variables).
  • yuzu: Maxwell instruction encodings for the shader reference tool, and a cross-check for kernel behaviour.
  • LibHac: reads NSPs and layers updates over the base game in dm/tools/nx_extract. hactool did the first extractions.
  • SPIRV-Cross: SPIR-V to Metal Shading Language.
  • deko3d (zlib): its texture layout size algorithm is ported in dm/gfx/nvn/nvn_tex.c.
  • libvpx (VP9 movies), stb_vorbis (movie sound), the Vulkan headers and NVIDIA FLIP ship in dm/third_party with their licenses (list).
  • Capstone, lz4, fontTools and XcodeGen are used by the build.

Games

All of these are tested on an iPhone and playable:

Needs iOS / iPadOS 26 or later on an iPhone 15 Pro or newer (A17 Pro chip or later) or an iPad with an M1 chip or later: the games' textures are BC-compressed, and older iPhones can't read that format. Other games aren't supported yet. For them the script writes a survey and still tries its best to pack an IPA, guessing the game's settings; such an IPA may not start.

Super Mario Bros. Wonder
Super Mario Bros. Wonder
IPA ~4 GB
Fire Emblem Engage
Fire Emblem Engage
IPA ~15 GB · 60 fps (30 on Switch) with update 2.0.0
Metroid Dread
Metroid Dread
IPA ~5 GB
13 Sentinels: Aegis Rim
13 Sentinels: Aegis Rim
IPA ~5 GB
Super Mario 3D World + Bowser's Fury
Super Mario 3D World + Bowser's Fury
IPA ~3 GB
The Legend of Zelda: Breath of the Wild
The Legend of Zelda: Breath of the Wild
IPA ~16 GB · 60 fps (30 on Switch) with update 1.9.0
The Legend of Zelda: Link's Awakening
The Legend of Zelda: Link's Awakening
IPA ~6 GB
Super Mario Odyssey
Super Mario Odyssey
IPA ~6 GB
Hades
Hades
IPA ~4 GB
Hyrule Warriors: Age of Calamity
Hyrule Warriors: Age of Calamity
IPA ~15 GB · 60 fps (30 on Switch) with update 1.3.0
Fire Emblem: Three Houses
Fire Emblem: Three Houses
IPA ~13 GB · 60 fps (30 on Switch) with update 1.2.0
Super Mario Galaxy
Super Mario Galaxy
IPA ~3 GB
The Legend of Zelda: Tears of the Kingdom
The Legend of Zelda: Tears of the Kingdom
IPA ~17 GB · 60 fps (30 on Switch) with update 1.4.3
Monster Hunter Rise
Monster Hunter Rise
IPA ~22 GB · 60 fps (30 on Switch) with update 16.0.2
Ace Attorney Investigations Collection
Ace Attorney Investigations Collection
IPA ~7 GB
Hades II
Hades II
IPA ~4 GB
Unicorn Overlord
Unicorn Overlord
IPA ~4 GB
Rhythm Heaven Groove
Rhythm Heaven Groove
IPA ~3 GB
Octopath Traveler 0
Octopath Traveler 0
IPA ~4 GB · 60 fps (30 on Switch) with update 1.0.5
Pokémon Legends: Z-A
Pokémon Legends: Z-A
IPA ~6 GB
Cuphead
Cuphead
IPA ~5 GB
Super Mario Galaxy 2
Super Mario Galaxy 2
IPA ~3 GB
FINAL FANTASY TACTICS - The Ivalice Chronicles
FINAL FANTASY TACTICS - The Ivalice Chronicles
IPA ~11 GB
Absolum
Absolum
IPA ~2 GB
Captain Toad: Treasure Tracker
Captain Toad: Treasure Tracker
IPA ~2 GB
Brain Memory Training Academy
Brain Memory Training Academy
IPA ~0.1 GB
The Great Ace Attorney Chronicles
The Great Ace Attorney Chronicles
IPA ~4 GB
STEINS;GATE RE:BOOT
STEINS;GATE RE:BOOT
IPA ~6 GB
Big Brain Academy: Brain vs. Brain
Big Brain Academy: Brain vs. Brain
IPA ~0.8 GB
Patrick's Parabox
Patrick's Parabox
IPA ~0.2 GB

Pack an IPA

1. Get nxnative and its tools (once, on a Mac with Xcode and Homebrew):

git clone https://github.com/seedds/nxnative.git && cd nxnative
brew install xcodegen zstd spirv-cross
brew install --cask dotnet-sdk
python3 -m pip install lz4 capstone fonttools "backports.zstd; python_version < '3.14'"

2. Put one game's NSPs in a folder, base game (an NSP, or an XCI cartridge dump) and update (and any DLC):

~/Games/MarioWonder/
  Super Mario Bros. Wonder [010015100B514000][v0].nsp
  Super Mario Bros. Wonder [010015100B514800][v327680].nsp

3. Run the script:

python3 scripts/build_ipa_from_nsp.py ~/Games/MarioWonder -k ~/keys/prod.keys

The IPA appears in the same folder (here ~/Games/MarioWonder/SMBWMobile.ipa). The first build takes 30–60 minutes, later ones about 10. You need free disk space of about twice the NSPs' size plus 10 GB. Options such as -o (output path) and --app-name are listed by -h.

4. Install the IPA with your sideloading tool (AltStore, Sideloadly, LiveContainer, …). The app gets the game's name, icon and version (the update's version, for example 1.2.1 for Mario Wonder; the base game's when there is no update).

Play

Touch controls. Tap 2D / 3D at the top to switch layouts; the app remembers your choice. Wonder, Engage, Dread, 13 Sentinels, Link's Awakening, Ace Attorney Investigations Collection, Unicorn Overlord, Rhythm Heaven Groove, Octopath Traveler 0, Pokémon Legends: Z-A, Cuphead, Absolum, Brain Memory Training Academy, The Great Ace Attorney Chronicles, STEINS;GATE RE:BOOT, Big Brain Academy: Brain vs. Brain and Patrick's Parabox start in 2D, the other games in 3D (STEINS;GATE RE:BOOT's quick save is R3, in the 3D layout). In 3D, the right stick (the camera in most games) is not drawn: swipe on the right third of the screen, starting anywhere off the buttons. In Super Mario Galaxy and Super Mario Galaxy 2, other touches outside the controls move the pointer; in Captain Toad: Treasure Tracker they touch the game's screen (touch blocks, stun enemies), and in Big Brain Academy: Brain vs. Brain too (its menus and activities). A connected game controller hides the touch controls and keeps every button.

Shaking. Shake the iPhone to shake the controller, in games that read its motion: Super Mario Odyssey's motion moves (such as the cap throw on a shake) need it, and Odyssey only takes them in its default docked mode. A light bump does not count; a sharp flick of the phone does.

  • Game language is English by default. Pick another when packing with --language (-l), by code or by name: -l ja, -l zh-Hans, -l French (LANGUAGE in Spyder). It must be one the game has; the script prints the game's languages and stops on one it lacks. To change it without rebuilding, add a line such as DM_LANG=zh-Hans to Documents/env.txt.
  • Saves and logs are in the Files app, under the app's name: save/ and log.txt. When something goes wrong, send log.txt (the previous run is log.prev.txt).
  • Short stutters the first time a new scene appears are normal: the app compiles graphics for it once and remembers them for the next launch.
  • Reinstalling: some sideloading tools give a reinstalled app a new data folder. Copy save/ and pso_user.tsv over from the old one to keep your progress.
  • Settings without rebuilding: put lines like DM_OPMODE=0 (handheld mode: lower resolution, higher frame rate) in Documents/env.txt. DM_FPS_TARGET=30 keeps Breath of the Wild, Tears of the Kingdom and Octopath Traveler 0 at their original 30 fps, which saves battery. DM_SHOW_FPS=1 shows the frame rate at the top left (--show-fps when packing turns it on from the start).

Known issues

  • No amiibo and no online features.
  • Fire Emblem Engage: after switching away from the app and back, some sounds may stay silent until you restart it.
  • Fire Emblem: Three Houses: small square patches on the ground where decals land.
  • Super Mario Galaxy and Super Mario Galaxy 2: effects drawn as points or lines come out one pixel wide.

For developers

How it works, the script's options, running games on the Mac, adding a game, and per-game notes: docs/development.md. In-depth bring-up and debugging notes: docs/agents.

License

MIT (see LICENSE). Third-party code keeps its own license; see dm/third_party.

S
Description
Run supported Nintendo Switch games natively on Mac, iPhone & iPad. One-command setup, complete Mac apps, lightweight iOS builds, Xbox/PS4/PS5 controllers and editable touch controls. Built on seedds/nxnative. Bring your own games and keys.
Readme MIT
108 MiB
0 Stars 1 Watchers 0 Forks
Languages
Objective-C 31.3%
C 28.4%
Python 28.4%
Swift 5.7%
Assembly 2.6%
Other 3.5%