A native Splatoon 3 pc port using static recompilation and a modified ScarletNX!
  • C 84.1%
  • Python 4.4%
  • CMake 2.9%
  • C++ 2.8%
  • LLVM 1.9%
  • Other 3.7%
Find a file
Claude d795348824 Follow Eden on AMD: a counter for each loop at 8192, compute in warps of 32
Citrosis (Eden) plays the game on the same ROG Ally. Two things it does that
this runtime didn't:

- Loop safety (emit_spirv.cpp, Repeat): each loop of every stage, compute
  included, has its own counter of 0x2000 iterations a lane, on every GPU. The
  structured loops now keep a counter each (loop_left, by scope) instead of
  sharing one budget, and the dispatch loop, where every block is an
  iteration, gets 16 times the limit. amd_workarounds now sets 8192, Eden's
  count, where 256 risked cutting the game's own loops short.
- Compute pipelines ask for the guest's warp size (requiredSubgroupSize =
  GuestWarpSize, vk_compute_pipeline.cpp). Here it is asked for where the
  default subgroup is wider than 32 (AMD's 64) and the block fits
  maxComputeWorkgroupSubgroups * 32, with subgroupSizeControl enabled; Intel,
  NVIDIA and Apple keep theirs.

Checked: tests/shader_direct_test.py (spirv-val), shader_structure, syntax of
device.c and compute.c; not run on a GPU.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PyJQu9H36S8FNMBvusJqj2
2026-11-05 00:01:52 -04:00
.claude [tests] Make test-only stuff be in tests/ only 2026-10-24 12:03:51 +00:00
.github fixed bugs for higher apple silicon cpus, plus launcher stuff on windows and linux 2026-10-27 19:50:28 -04:00
cmake [inkypaint] Fork ScarletNX into a Splatoon 3 port 2026-10-24 21:09:44 -04:00
dist prepwork, graphics, kbm, whole lot of stuff 2026-10-30 11:02:20 -04:00
docs [docs] Document the mouse settings and credit the 60 FPS patch authors 2026-10-31 15:12:30 +01:00
po [tests] Build the filesystem service test again and bring three tests up to date 2026-10-31 15:09:06 +01:00
scripts Merge remote-tracking branch 'grid0/main' 2026-10-31 08:58:52 +01:00
src Follow Eden on AMD: a counter for each loop at 8192, compute in warps of 32 2026-11-05 00:01:52 -04:00
tests [loader] Keep a mod's subsdk modules and code units from moving the game's own 2026-10-31 16:28:27 +01:00
tools [inkypaint] Fork ScarletNX into a Splatoon 3 port 2026-10-24 21:09:44 -04:00
.clang-format [*] Clean-room rewrite all remainder files from SR 2026-10-18 13:06:20 +00:00
.gitignore [repo] Ignore the local TODO list 2026-10-31 10:00:32 +01:00
.mcp.json [docs] The options' new names in the docs and .mcp.json 2026-10-23 13:08:16 -03:00
CLAUDE.md [build] Package Windows and Linux, and release every platform from a tag 2026-10-27 21:59:13 +00:00
CMakeLists.txt prepwork, graphics, kbm, whole lot of stuff 2026-10-30 11:02:20 -04:00
CMakePresets.json [inkypaint] Runtime for the first release: Windows, online play, performance, input 2026-10-27 21:20:58 +00:00
CONTRIBUTING.md runner fixes sigh 2026-10-27 18:44:42 -04:00
inkypaint.sh [build] Package Windows and Linux, and release every platform from a tag 2026-10-27 21:59:13 +00:00
LICENSE License the fork under GPL-3.0-or-later 2026-10-11 14:43:24 -05:00
pyproject.toml Replace Python pipeline with a C90 driver 2026-10-12 16:39:01 +10:00
README.md smooth motion might be fixed?? 2026-10-30 21:16:55 -04:00
ROADMAP-INKYPAINT.md runner fixes sigh 2026-10-27 18:44:42 -04:00
ROADMAP.md runner fixes sigh 2026-10-27 18:44:42 -04:00

inkypaint

a splatoon 3 pc port!! a proper one (or as proper as it can be) with ScarletNX as a base, and online multiplayer via either LAN! (GRID0 ZeroTier) or a proper NSO replacement! (GRID0+)

Windows, Linux, and Apple silicon Macs! the launcher handles extracting your game, recompiling it, settings, mods, and signing into GRID0+.

this is specifically for Splatoon 3 11.3.0. other games and other updates aren't supported.

dlc is optional! once the game is prepared, go to Game Files → DLC (optional) and install your own Expansion Pass packages, one at a time. no extra recompile needed. dlc gameplay hasn't been tested yet. you'll need your own game dump and your own console's keys, none of that comes with inkypaint.

Download

check releases for the downloads!

System Package
Windows 10/11 x86_64 the installer (-setup.exe), or the portable .zip
macOS 26 on Apple silicon inkypaint.app, zipped
Linux x86_64 (glibc 2.35 or newer) a portable .tar.gz: unpack it and run ./inkypaint

open the launcher and head to Game Files. you'll need:

  • the base game NSP (0100C2500FC20000)
  • the 11.3.0 update NSP (0100C2500FC20800, v2752512)
  • your prod.keys

then prepare the game! extraction and recompilation need about 13 GB of disk space. the first recompile can take half an hour to an hour depending on your machine, which is way too long, and something i want to improve. after that you can just press Play, you don't need to recompile every time you open it.

if you're going to use GRID0+, sign in when the launcher asks about online play so its patches can be included in that first recompile.

Multiplayer!

there are two ways to play with friends:

  • LAN / GRID0 ZeroTier: use the game's LAN play, with everyone on the same LAN or ZeroTier network. enable networking and pick your ZeroTier adapter in Settings > LAN play if you're using it.
  • GRID0+: the NSO replacement! sign in on the launcher's Online page and enable online play. this uses GRID0+'s servers, not Nintendo's, and needs GRID0+'s game patches compiled in.

LAN and GRID0+ are separate options, you don't need a GRID0+ account just to use LAN. networking details here.

Where it's at

it's playable, but there's still work to do! performance varies by machine and scene, and intense matches can struggle on lower end devices (i need to apply more optimization runs for other devices)

higher framerates are still experimental. (as in you can enable it, but theres a flickering bug that happens which im not sure how to fix yet, regardless the game should work fine provided ur device can hold the framerates.)

see the roadmap for what i'm working on.

Building

want to build it yourself? these are the package scripts. .github/workflows/release.yml uses them too.

Package Command Builds on
macOS app ./inkypaint.sh setup, then ./inkypaint.sh launcher (into build/launcher) macOS 26 with Xcode 26 and Homebrew
Windows ./inkypaint.sh windows, or scripts/package-windows.sh macOS or Linux: LLVM 22+ with lld, CMake, Ninja, NASM (makensis for the installer)
Linux scripts/package-linux.sh (scripts/linux-build-deps.sh installs what it needs on Ubuntu 22.04) Linux x86_64

Windows and Linux use the Qt launcher, macOS uses the SwiftUI launcher. more build details are in docs/BUILD.md.

Playing from the checkout on a Mac

if you're working from the checkout on a Mac, inkypaint.sh handles the steps below. put your own dumps and keys in these folders:

inkypaint/
  the rom/            Splatoon 3 [0100C2500FC20000][v65536][BASE].nsp
                      Splatoon 3 11.3.0 [0100C2500FC20800][v2752512][UPD].nsp
  decryption keys/    prod.keys, title.keys

then, in Terminal:

./inkypaint.sh doctor     # what your Mac has; tells you what is missing
./inkypaint.sh setup      # Homebrew packages (cmake, ninja, pkg-config, llvm) and Ryujinx's MoltenVK
./inkypaint.sh build      # the runtime and the driver, into build/macos
./inkypaint.sh prepare    # extract the game with the update (about 10 GB) and recompile it
./inkypaint.sh run 120    # play for 120 seconds (no number: until you close the window)

each step writes to logs/<step>-<time>.log, so if something goes wrong there's a log to check! you'll need Apple's command line tools (xcode-select --install) and Homebrew. recompiling uses a lot of memory, so an 8 GB Mac runs two compiles at a time. use INKY_JOBS=1 ./inkypaint.sh prepare if it's swapping too much. an interrupted prepare picks up where it stopped.

the game world fills your window, including taller MacBook screens and ultrawide monitors! the UI stays centered in 16:9 so it doesn't get stretched. F11 or Alt+Enter toggles fullscreen. the resolution scale still controls rendering quality, changing the aspect ratio doesn't automatically increase the pixel count. Use --adapt_aspect=0 to restore the original 16:9 presentation, or --aspect_ratio=2.333333 to force 21:9. --window_width=1280 --window_height=800 sets the initial window size; resizing it updates the aspect while playing.

How it works

ScarletNX does the heavy lifting here! it translates the game's ARM64 code into LLVM IR ahead of time, then compiles that into a native module for your machine. its runtime handles the Switch OS services and translates the GPU's commands and shaders to Vulkan (through MoltenVK on macOS).

inkypaint builds on that for Splatoon 3 specifically, with the rendering fixes, launcher, display support, and GRID0+ integration. the other console and Linux ABI drivers from upstream aren't part of this fork. there's more on the internals in docs/ARCHITECTURE.md.

License

GPL-3.0-or-later, same as ScarletNX! see LICENSE and credits.

Splatoon belongs to Nintendo. inkypaint isn't affiliated with or endorsed by Nintendo.