Fork of masagrator/SaltyNX — per-monitor preferred refresh and persistent display preferences
  • C 61.1%
  • C++ 33.3%
  • Makefile 2.2%
  • Assembly 1.3%
  • GLSL 0.9%
  • Other 1.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-10-27 19:19:42 -04:00
docs Document successful monitor-preference hardware testing 2026-10-27 19:19:42 -04:00
exefs_patches/SaltyNX_Fixes Update IDs.txt 2025-11-28 06:00:49 +01:00
libnx32_min Code restructurization, add triple buffer workaround + show logo on game's boot (#141) 2026-10-03 15:09:21 +02:00
saltysd_bootstrap Code restructurization, add triple buffer workaround + show logo on game's boot (#141) 2026-10-03 15:09:21 +02:00
saltysd_core Reduce stack usage 2026-10-23 23:10:28 +02:00
saltysd_proc Restore saved refresh rates for each monitor and resolution 2026-10-27 16:13:05 -04:00
tests Restore saved refresh rates for each monitor and resolution 2026-10-27 16:13:05 -04:00
.gitignore Restore saved refresh rates for each monitor and resolution 2026-10-27 16:13:05 -04:00
exceptions.txt Update compatibility (#117) 2025-12-25 17:29:37 +01:00
Makefile Code restructurization, add triple buffer workaround + show logo on game's boot (#141) 2026-10-03 15:09:21 +02:00
README.md Document successful monitor-preference hardware testing 2026-10-27 19:19:42 -04:00
version.mk Restore saved refresh rates for each monitor and resolution 2026-10-27 16:13:05 -04:00

SaltyNX

Monitor-preference fork

This branch is based on the latest masagrator/SaltyNX upstream commit (cf2adb7b8facdc34e3cbf9ec6ff7686f67575048, 2026-10-23): release 2.1.3 plus the subsequent NVN stack-usage fix. Upstream history and attribution are retained. Version 2.1.3-monitor.1 restores the refresh rate saved by the matching FPSLocker fork for the connected monitor and resolution. Game FPS targets remain independent; automatic Display Sync takes precedence. sys-dock's link-training behavior is unchanged.

Hardware tested (2026-10-27): the operator tested the installed SaltyNX 2.1.3-monitor.1 / FPSLocker 3.5.0-monitor.1 pair and reported that it works great on the Erista Switch 1 / Smash 13.0.5 setup using a 120-Hz display and 60-FPS game target. Each EDID-identified monitor keeps its own saved preferences.

See display preferences for configuration, installation, build instructions, the dated test result and further coverage scenarios.

The upstream documentation below is retained for reference. For this fork's update, preserve your existing SaltySD settings, exclusions and plugins; do not delete them.

Sysmodule for injecting custom codes into retail Nintendo Switch games, by default it injects "Core" which includes many useful features known as NX-FPS (tracking game performance statistics, unlocking FPS) and ReverseNX-RT (switching between docked and handheld graphics profiles). Sysmodule also manages custom refresh rates in both handheld and docked modes.

This sysmodule targets more common approach, so basic compatibility with all games is a priority. If you want to inject your own code for specific game I recommend much more powerful code injection framework - exlaunch.

Original sysmodule was created by: https://github.com/shinyquagsire23

This fork includes many new features (aforementioned NX-FPS and ReverseNX-RT), compatibility fixes, and beside plugins support also supports patches for easy way to edit common functions.

GitHub all releases

Caution

It is required to have FW installed at least 10.0.0 version

No technical support for anything else than stock Atmosphere.

Using it in online games such as Splatoon 3 can lead to ban as it injects custom code, be aware of that.

Important

Known issues:

  • Cheats using HEAP+offset address instead of MAIN+offset address chain may not work properly.

Tools utilizing SaltyNX:

For additional functions you need SaltyNX-Tool

Patches pattern:

  • filename is a function symbol with filetype .asm64 for 64-bit games, .asm32 for 32-bit games,
  • inside file write with hex editor instructions that you want to put into this function,
  • put this file either to SaltySD/patches to make it work for every game, or to SaltySD/patches/*titleid* to make it work for specific game.

Examples of such patches can be find HERE.

How to install release:

Download newest version from RELEASES, look for .zip file with name starting "SaltyNX", unpack it.

Put atmosphere and SaltySD folders unpacked from zip archive to root of your sdcard.

Remember to restart Switch.

Important

In case of any issues after updating already existing SaltyNX setup, remove whole SaltySD folder and put fresh one from release.


Exceptions

List of titles not compatible only with external plugins, they support all other SaltyNX features
Title Why?
Azure Striker Gunvolt: Striker Pack 32-bit games don't support plugins
Baldur's Gate and Baldur's Gate II: Enhanced Editions 32-bit games don't support plugins
CelDamage HD 32-bit games don't support plugins
DEADLY PREMONITION Origins 32-bit games don't support plugins
Death Road to Canada 32-bit games don't support plugins
Dies irae Amantes amentes For Nintendo Switch 32-bit games don't support plugins
Goat Simulator 32-bit games don't support plugins
Gothic 32-bit games don't support plugins
Grandia Collection Only launcher is 64-bit, actual games are 32-bit, so plugins are not supported
LIMBO 32-bit games don't support plugins
Luigi's Mansions 2 HD 32-bit games don't support plugins
Mario Kart 8 Deluxe (1.0.0-3.0.3) 32-bit games don't support plugins
Megadimension Neptunia VII 32-bit games don't support plugins
Moero Chronicle Hyper 32-bit games don't support plugins
Moero Crystal H 32-bit games don't support plugins
Monster Hunter Generations Ultimate 32-bit games don't support plugins
Monster Hunter XX Nintendo Switch Ver. 32-bit games don't support plugins
New Super Mario Bros. U Deluxe 32-bit games don't support plugins
Ni no Kuni: Wrath of the White Witch 32-bit games don't support plugins
Pikmin 3 Deluxe 32-bit games don't support plugins
Planescape: Torment and Icewind Dale 32-bit games don't support plugins
Radiant Silvergun 32-bit games don't support plugins
Sherlock Holmes and The Hound of The Baskervilles 32-bit games don't support plugins
Tokyo Mirage Session #FE Encore 32-bit games don't support plugins
Valkyria Chronicles 32-bit games don't support plugins
World of Goo 32-bit games don't support plugins
YouTube Unknown
超次次元ゲイム ネプテューヌRe;Birth1 32-bit games don't support plugins
超次次元ゲイム ネプテューヌRe;Birth2 SISTERS GENERATION 32-bit games don't support plugins
神次次元ゲイム ネプテューヌRe;Birth3 V CENTURY 32-bit games don't support plugins
List of games not compatible with SaltyNX at all
Title Why?
Witcher 3 GOTY (version 3.2) heap related
Titles in exceptions.txt are treated as part of Blacklist, you can find it in root of repo. SaltyNX reads it from SaltySD folder. Normal titleid blocks only loading plugins, `X` at the beginning of titleid means that SaltyNX won't inject Core at all. `R` at the beginning of titleid means that SaltyNX won't inject Core at all if romfs mod for this game is installed. 32-bit games are ignored by default for plugins.

Thanks to

  • Cooler3D for sharing code with me how he was changing handheld display refresh rate in his tools that were first publicly available tools allowing this on HOS. I have used that as basis to make my own function.

Other

Claude was used to:

  • cleanup libnx32_min from unused files and add files to make it independent from newlib shipped with DevkitARM which was breaking PIE compilation
  • Fix bootstrap32 code to generate properly position independent ELF
  • core32 and bootstrap32 now relocate themselves instead of sysmodule doing that for them (fixing an issue with pointers needed relocating in read only sections)
  • Add support for showing logo via shader
  • Implement my design for triple buffer workaround targeting memory hardcoded double buffer games