Skip to content

About

A compatibility layer for porting Switch games to Android, one game at a time

Resources

Stars

354 stars

Watchers

7 watching

Forks

Repository files navigation

nx2android

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.

Games

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).

For players: port a game without programming

  1. Download nx2android-<version>-windows-x64.zip from Releases, unzip it and start nx2android.exe.
  2. 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.
  3. Port tab: choose the folder with the game's NSP, XCI, NSZ or XCZ files (base game, update, DLC) and click Port.
  4. 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).

Setup from the repository

Install Python 3.11 or later and python -m pip install -r requirements.txt, then python -m porter tools --download (or install them yourself):

Port a game

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.

Layout

  • porter/: the port pipeline (python -m porter).
  • gui/: the desktop app (python -m gui).
  • nxnative/: nxnative, kept as a git subtree of seedds/nxnative (squashed), with the Android runtime in nxnative/dm/android/ and the game profiles in nxnative/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.json names the device: {"serial": "...", "package": "..."}).
  • probes/, RESEARCH.md: the feasibility study and the first on-device probes.
  • .githooks/: the commit-msg hook (see Commit messages).

Building the bundle

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.

Tests

python -m unittest discover tests

Commit messages

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, style or revert, 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 a BREAKING 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.

Updating nxnative

git subtree pull --prefix nxnative https://github.com/seedds/nxnative.git main --squash

Keys and game files

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.

License

MIT, as nxnative (see nxnative/LICENSE). Third-party code keeps its own license.

About

A compatibility layer for porting Switch games to Android, one game at a time

Resources

Stars

354 stars

Watchers

7 watching

Forks

Releases

Packages

Contributors

Languages