Steam Deck & Linux Guide

Run NX2navi natively on SteamOS and desktop x86-64 Linux via NX2navi-Linux-0.10.1-x86_64.AppImage with automatic Steam Deck profiles, RADV Vulkan 1.3 tuning, and native button glyphs.

Valve Steam Deck handheld connected via USB-C to an external Linux monitor and compact mechanical keyboard on a wooden desk
Advertisement

AppImage setup (SteamOS & Linux)

Every release since v0.7.0 ships a self-contained Linux AppImage (Stable: NX2navi-Linux-0.10.1-x86_64.AppImage, 101.56 MB; Preview: NX2navi-Linux-0.10.2-x86_64.AppImage, 101.71 MB). On Steam Deck, perform the one-time build in Desktop Mode with external power connected:

# 1. Verify checksum against SHA256SUMS-linux.txt
sha256sum -c SHA256SUMS-linux.txt

# 2. Mark executable and launch the guided GUI
chmod +x NX2navi-Linux-0.10.1-x86_64.AppImage
./NX2navi-Linux-0.10.1-x86_64.AppImage

Point the Launcher to your legally obtained Switch 2 1.1.1 .nup file on an internal NVMe or high-speed ext4 microSD with at least 36 GB free. When compilation finishes, right-click the generated ocarina binary (or the AppImage) and choose Add to Steam to launch directly from Gaming Mode.

Kernel, Vulkan 1.3 & udmabuf

NX2navi maps guest memory regions and translates Switch 2 GPU workloads straight to Vulkan 1.3. Verify these host capabilities on Arch, Fedora, Ubuntu 24.04+, Nobara, Bazzite, or SteamOS:

Advertisement
Linux kernel 6.7+
Uses fast PAGEMAP_SCAN write-tracking ioctls for low-overhead guest memory protection.
Vulkan 1.3 extensions
Requires VK_EXT_external_memory_host and VK_EXT_mesh_shader (Mesa 24.2+ RADV on AMD/Steam Deck, or proprietary NVIDIA 555+ driver). GPUs without mesh shaders automatically use mesh_fallback = auto.
/dev/udmabuf host heap
Allocating pinned host-visible guest memory works fastest when /dev/udmabuf is accessible to your user and udmabuf.size_limit_mb=1024 is set. Without it, NX2navi falls back cleanly to standard host memory import.
16 GB RAM build flag
If building from CLI on a 16 GB RAM Linux laptop or Steam Deck via tools/make_game.py, pass --jobs 4 so parallel Clang processes never trigger the Linux OOM killer.
# Optional: raise udmabuf limit on desktop Linux distros
sudo modprobe udmabuf
echo 1024 | sudo tee /sys/module/udmabuf/parameters/size_limit_mb

Native Linux vs Proton upscaling

Upstream docs/README-BuildKit.md (lines 131-135) documents an essential architectural fact that trips up many Linux configs:

FeatureNative Linux AppImage / ./ocarinaWindows ocarina.exe under Proton
Spatial / temporal upscalingupscaler = fsr (Vulkan FSR 1 EASU/RCAS) + standin_filter = easutaa = fsr3 or fsr4 = 1 via amd_fidelityfx_vk.dll
AMD FSR 3.1 Frame GenerationInactive natively (amd_fidelityfx_vk.dll is a Windows DLL)Active via framegen = fsr3 (e.g. 45 fps → 90 fps on OLED)
NVIDIA DLSS & Frame GenActive via Linux NGX (libnvidia-ngx-dlssg.so, fg_mult = 2..6)Active via Windows NGX (framegen_multiplier = 2..4)
Steam Deck auto profiledevice_profile = auto selects deck (1280x800, 40/45 fps, cores = 4)Manual nx2navi.ini tuning required

Steam Deck OLED 90Hz nx2navi.ini

For crisp frame pacing on Steam Deck OLED in Gaming Mode, lock the SteamOS Quick Access refresh slider to 90Hz and set fps_limit = 45 (exact 2:1 cadence) with native Steam Deck glyphs:

device_profile = auto
operation_mode = handheld
window_size = 1280x800
game_aspect = window
game_res = window
aspect = fit
fps_limit = 45
realtime = 1
highfps_fix = 1
vk_present = fifo
upscaler = fsr
standin_filter = easu
sharpness = 80
astc_bc = 1
prompts = steamdeck
motion = 1

Controllers for SDL3 & Gyro

NX2navi reads SDL3 gamepads directly with 6-axis motion aiming (motion = 1), HD rumble (rumble_hd = 1), and prebuilt Nintendo, Xbox, PlayStation, and Steam Deck button prompt packs:

ControllerNX2navi Input & Prompt FeaturesConnectionAmazon
8BitDo Ultimate 2 Bluetooth ControllerSwitch / XInput mode, 6-axis gyro aim & Hall-effect sticks (prompts = nintendo)Bluetooth / 2.4G / USB-CView controller
Sony DualSense Wireless Controller6-axis gyro bow & hookshot aim, adaptive triggers & prompts = playstationUSB-C / BluetoothView controller
GameSir Cyclone 2 Wireless ControllerTMR sticks, low-latency PC wireless & gyro motion in Switch mode2.4G Dongle / Bluetooth / USB-CView controller
Xbox Wireless ControllerPlug-and-play Windows & Linux SDL3 mapping with prompts = xboxBluetooth / USB-CView controller

As an Amazon Associate, this site earns from qualifying purchases.

Advertisement

Common questions

Verified answers for Windows, Linux, Steam Deck, and local .nup builds.

Should I set Steam Deck UMA Frame Buffer to 4 GB in BIOS?

Leave SteamOS UMA Frame Buffer on its default 1 GB (auto-scaling) setting. Raising static UMA reservation reduces the host system RAM pool needed when streaming Hyrule Field.

How do I open the NX2navi menu in Steam Deck Gaming Mode without a keyboard?

Press Minus + Plus (View + Menu buttons together) to toggle the F1 in-game configuration menu, or L3 + R3 to toggle the F10 performance overlay.

Why does monitor selection ignore monitor = 2 on Wayland?

Wayland compositors (KDE Plasma Wayland, GNOME Wayland, Gamescope) assign fullscreen windows through compositor output rules rather than client-chosen XRandR coordinates. Move the window via your compositor shortcut or run under XWayland.