Port your own Nintendo Switch games to Android, natively: the game's own arm64 code runs on the device, with the Switch's system services stood in for by a host and NVN graphics replayed on Vulkan. Pick the game's folder, click Port, and get an APK plus the game's data, installed on your device if you like. Bring your own game files and keys; nothing from any game is in this repository.
This is the Android port of nxnative, which does the same on iPhone and iPad. How it is put together: docs/ARCHITECTURE.md.
Each game is a profile in nxnative/dm/games/<title ID>/ with an android.tsv. Which games play: docs/PORT_STATUS.md; which ones each release has been checked to port: docs/RELEASE_CHECK.md. The device's GPU must read BC-compressed textures (Adreno, Xclipse; not Mali or PowerVR).
- Download
nx2android-<version>-windows-x64.zipfrom Releases, unzip it and start nx2android.exe. - Setup tab: click Download missing tools (the Android NDK, the .NET SDK and platform-tools, about 1 GB, from Google and Microsoft), then set your prod.keys. Every line turns green.
- Port tab: choose the folder with the game's NSP, XCI, NSZ or XCZ files (base game, update, DLC) and click Port.
- Tick Install on the device when done with the device plugged in and USB debugging on, or copy the APK and the data folder yourself.
The step-by-step guide is packaging/INSTALL.md. You need your own game files and prod.keys, dumped from your own Switch; the tool never ships or downloads either. NSZ and XCZ files are decompressed during the port (into the build folder's tmp/, deleted once extracted).
Install Python 3.11 or later and python -m pip install -r requirements.txt, then python -m porter tools --download (or install them yourself):
- Android NDK r27c (only the NDK: no Android Studio, SDK or JDK)
- .NET SDK 10
- Android platform-tools (adb), to install from the tool
- your own
prod.keys, dumped from your Switch
The app:
python -m gui
Check the Setup tab, choose the game's folder (the base game NSP, XCI, NSZ or XCZ, its update and DLC) on the Port tab, and click Port.
Or the command line:
python -m porter doctor
python -m porter port "D:\Games\NEO" -k "D:\keys\prod.keys" --install
The APK (NeoTheWorldEndsWithYou.apk) and the data pack (NeoTheWorldEndsWithYou-data/) appear in the game folder (-o picks another). The first port takes a while (extraction, rewriting the game's code, translating its shaders); later ones reuse what has not changed. python -m porter -h lists the commands.
porter/: the port pipeline (python -m porter).gui/: the desktop app (python -m gui).nxnative/: nxnative, kept as a git subtree ofseedds/nxnative(squashed), with the Android runtime innxnative/dm/android/and the game profiles innxnative/dm/games/.packaging/: the player's bundle (python packaging/build_bundle.py).devtools/: scripts for bringing up a game on a connected device (devtools/device.jsonnames the device:{"serial": "...", "package": "..."}).probes/,RESEARCH.md: the feasibility study and the first on-device probes..githooks/: the commit-msg hook (see Commit messages).
python -m pip install -r requirements.txt pyinstaller
python packaging/build_bootloader.py
python packaging/build_bundle.py
build_bootloader.py compiles PyInstaller's launcher on this PC (it needs the Microsoft C++ Build Tools), because a few antivirus engines flag the prebuilt one every PyInstaller app shares. Run it again after installing or upgrading PyInstaller.
dist/nx2android/ and dist/nx2android-<version>.zip: the app, the committed nxnative/ and the install guide; no toolchains, keys or game files.
python -m unittest discover tests
Conventional Commits 1.0.0, with commitlint's config-conventional types and limits:
<type>[(<scope>)][!]: <description>
[body, after one blank line]
[footers: Co-Authored-By: …, BREAKING CHANGE: <what breaks>]
- type:
feat,fix,perf,refactor,docs,test,build,ci,chore,styleorrevert, lower case. - scope: optional and free, the part touched:
vk,android,porter,gui,profile,status,release… - description: no full stop at the end; it may start with a capital (game and API names). Header, body and footer lines at most 100 characters (a lone URL may run longer).
!before the:or aBREAKING CHANGE:footer marks a breaking change.
fix(vk): a transfer read where a run of rasterizer-discard draws ends (XC3 grass flicker)
feat(profile): Tales of Eternia Remastered playable on update 2.0.0 (v65536)
docs(status): bundle 8372959 ported Tales of Eternia Remastered from scratch
chore(release): version 0.1.1
.githooks/commit-msg refuses other messages (merges, reverts and fixup! commits from git pass). Turn it on once per clone:
git config core.hooksPath .githooks
The commits before 2026-10-28 predate the rule.
git subtree pull --prefix nxnative https://github.com/seedds/nxnative.git main --squash
nx2android decrypts your game files with your prod.keys while it ports them, as Switch emulators do. This repository and its releases contain no keys, no game files and nothing extracted from them, and the tool never downloads either. Dump both from your own Switch, and don't share them or the APKs and data packs built from them.
Nintendo's takedown notices so far have gone to whoever hosts a project (13 Switch emulator repositories on GitHub in February 2026), not to players. Whether decrypting your own games for your own use is allowed depends on where you live.
MIT, as nxnative (see nxnative/LICENSE). Third-party code keeps its own license.