- C++ 63.6%
- cpp 30.3%
- Kotlin 2.8%
- CMake 1.3%
- Shell 1.1%
- Other 0.8%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .github/workflows | ||
| .reuse | ||
| AppImageBuilder | ||
| CMakeModules | ||
| dist | ||
| docs | ||
| externals | ||
| hooks | ||
| LICENSES | ||
| patches | ||
| src | ||
| tools | ||
| .codespellrc | ||
| .git-blame-ignore-revs | ||
| .gitattributes | ||
| .gitignore | ||
| .gitmodules | ||
| build-citron-linux.sh | ||
| build-citron.sh | ||
| build-clangtron-windows.bat | ||
| build-clangtron-windows.sh | ||
| CHANGELOG | ||
| CMakeLists.txt | ||
| Doxyfile | ||
| get-dependencies.sh | ||
| LATEST_VERSION | ||
| LATEST_VERSION_MACOS | ||
| LICENSE | ||
| package-citron.sh | ||
| PKGBUILD | ||
| README.md | ||
| vcpkg.json | ||
Citron Neo — Nextendo Network / NZ:P Edition
A fork of the Citron Neo with two purposes:
- Nextendo Network online play — connect a Nextendo Network account and play supported titles online from Citron, without hosts-file edits, external DNS, or manual SSL bypass.
- Nazi Zombies: Portable (Emulator Edition) — the emulator-side fixes this fork was originally created for, and still carries.
Warning
This is a work in progress. Expect bugs.
Online support is new, incomplete, and only lightly tested — largely by one person, on one machine, against multiple games. Things will break. If you hit a problem, please open an issue and include:
- your
citron_log.txt(Linux:~/.local/share/citron/log/citron_log.txt)- the exact error code the game showed, if any (e.g.
2306-0802)- the game, its version, and what you were doing when it failed
A log makes the difference between a fixable report and a guess. For network problems, set the log filter to
*:Info Service:Debug Service.SSL:Debug WebService:Debugbefore reproducing.
Status
Verified working: All officially supported titles.
| Account sign-in | Browser-based, OAuth loopback + PKCE — the emulator never sees your password |
| Hostname redirection | Nintendo online hostnames resolve to the configured Nextendo servers |
| TLS | Handshake with recovered SNI, ALPN pinned to HTTP/1.1 |
| Auth + secure server | Kerberos ticket, matchmaking, session entry |
| NAT check | Both vantage points, sub-second |
| Peer-to-peer | Hole-punching, races completed |
| Play-time sync | Pushed to your Nextendo profile on game exit |
| Presence | Published on sign-in and game start/stop |
| Profile name | Local Switch profile renamed to your account nickname |
Setup
- Build as you would upstream Citron (see
docs/), or use a release build. - Open the NexTendo menu and click Enable Network Redirection. It's off by default; the server addresses are already filled in, so there's nothing to type.
- Still in the NexTendo menu, click Sign In and complete sign-in in your browser.
- Launch a supported game and enter its online mode.
NEXTENDO_SERVER_IP, NEXTENDO_NAT_IP and NEXTENDO_API are honoured as environment overrides
if you need to point at something other than the default servers; the API override only accepts
loopback or HTTPS on the Nextendo domain, because those requests carry your account token.
Friends, requests, and recently played live under NexTendo → Open Account Page — add by friend code, accept or decline requests, see who's online.
Caution
Your Network ID (PID) is effectively a credential on this network: the service accepts a bare PID as an identity. This fork deliberately never displays or logs it. Don't paste it anywhere, and don't ship
nextendo_account.txt— it holds your session token — inside a build or archive.
Credits and how this was built
This is Citron, itself derived from yuzu. All emulation — CPU, GPU, audio, input, filesystem — is theirs. This fork's changes are confined to the networking and account layers plus the surrounding UI.
The Nextendo Network client behaviour was worked out by studying the reference implementation, Ryujinx-Nextendo, together with the published server sources — which document the protocol, the endpoints, and the reasons behind a number of non-obvious decisions far better than black-box guessing ever would. Credit where it is due: several fixes here exist because their comments explained why something was necessary.
No code from that project is copied into this one. It could not be: it is licensed under PolyForm Shield 1.0.0, which is incompatible with Citron's GPL. Everything here is an independent C++ implementation written against Citron's own IPC, socket, TLS and configuration layers, which differ substantially from Ryujinx's. Where the two diverge, it is deliberate:
Also referenced: Kinnay's NintendoClients for NEX and error-code documentation, and switchbrew for service definitions.
Security
- Sign-in never touches your password. It's browser-based OAuth loopback + PKCE — the emulator only ever sees a short-lived session token, never your credentials.
- Your Network ID (PID) is never displayed or logged. It functions as a bearer credential on
this network, so this fork deliberately keeps it out of the UI and out of
citron_log.txt. - Peer IP addresses are redacted in logs. Connection logs (socket bind/connect/send/receive, and room join/leave/kick/ban events) mask the address before it's written, so a log file pasted into a bug report or Discord doesn't hand out another player's IP.
- Redirection is off by default. It only activates once you explicitly enable it from the NexTendo menu — an unconfigured toggle behaves like stock Citron.
- The API override is restricted to loopback or HTTPS on the Nextendo domain, since that request carries your account token.
- Your session token lives in
nextendo_account.txt— don't share it or ship it inside a build or archive.
Legal
Licensed GPL-3.0-or-later, as required by Citron. See LICENSE.
This project ships no Nintendo code, keys, firmware or games, and is not affiliated with, endorsed by, or associated with Nintendo. You must supply your own legally dumped games and system files, exactly as with upstream Citron. "Nintendo Switch" and all game titles are trademarks of their respective owners.
Nextendo Network is a community-run service, independent of this fork and of Nintendo.