- C 84.1%
- Python 4.4%
- CMake 2.9%
- C++ 2.8%
- LLVM 1.9%
- Other 3.7%
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 |
||
|---|---|---|
| .claude | ||
| .github | ||
| cmake | ||
| dist | ||
| docs | ||
| po | ||
| scripts | ||
| src | ||
| tests | ||
| tools | ||
| .clang-format | ||
| .gitignore | ||
| .mcp.json | ||
| CLAUDE.md | ||
| CMakeLists.txt | ||
| CMakePresets.json | ||
| CONTRIBUTING.md | ||
| inkypaint.sh | ||
| LICENSE | ||
| pyproject.toml | ||
| README.md | ||
| ROADMAP-INKYPAINT.md | ||
| ROADMAP.md | ||
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.