UEVR on Linux — Play Flat Unreal Engine Games in VR
UEVR (praydog's Universal Unreal Engine VR Mod) injects 6DoF VR into flat, non-VR Unreal Engine games. It's Windows software, but it runs under Proton on Linux and talks to Monado — and honestly it can be better than on Windows in parts, since you're going straight to OpenXR.
UEVR renders strictly through D3D11/D3D12 and loads via a Windows DllMain, with no Vulkan/OpenGL path. A native Linux port would be an ~80–90% rewrite for games that are Windows-only anyway. So the answer is Proton, not native — and it works well.
How it connects
- OpenXR mode (recommended): UEVR → OpenXR → Monado directly. Xrizer is not involved — this is the efficient path.
- OpenVR mode: goes through Xrizer. Only use it if a game misbehaves in OpenXR.
Prerequisites
- A working Monado setup (running when you launch the game).
- Proton (GE is fine) set as the game's compatibility tool.
protontricksinstalled (sudo dnf install protontricks, or the Flatpak).- chihuahua — a headless, GUI-less UEVR injector. It's a single self-contained .NET 8 exe (no .NET needed in the prefix) that launches the game and injects UEVR for you, auto-downloading UEVR itself. Grab
chihuahua.zipfrom its releases.
Setup
1. Give the game a Proton prefix. Add the game to Steam as a non-Steam shortcut, then force it to run with Proton (Properties → Compatibility → Force… → Proton GE) and launch it once through Steam. This creates the compatdata/<appid> prefix that the injector needs.
Without that first Proton launch there's no prefix, and the injector will silently do nothing. If a freshly-added game "launches but nothing happens," this is almost always why.
2. Inject with chihuahua. From a terminal, run:
protontricks-launch --no-runtime --no-bwrap --appid <APPID> \
/path/to/chihuahua.exe 'Z:\path\to\YourGame-Win64-Shipping.exe' \
--runtime OpenXR --delay 30 --uevr-build Nightly
Notes on that command:
--no-runtime --no-bwrapdisables the Steam Linux Runtime sandbox so the injector can see the game PID and your host Monado directly. Inside the sandbox, injection fails.- Point chihuahua at the actual
*-Win64-Shipping.exe(the real UE process), not the game's top-level launcher exe. - The target path is a Windows-style
Z:\path (the prefix sees your filesystem underZ:), with backslashes. --delay 30gives the game 30 seconds to reach its main menu before injecting. Bump it for slow-loading games.
That's it — no clicking around in an injector GUI.
Gotchas
- chihuahua needs a real terminal (a TTY). It sets the console output encoding at startup and crashes instantly (
System.IO.IOException: Invalid access) if its stdout isn't a terminal. Running it directly in a terminal is fine. If you script it, wrap the command inscript -qec '<command>' /tmp/uevr.log(fromutil-linux) to allocate a PTY. - Don't use
--launch-cmd steam://rungameid/<id>. Thesteam://URI doesn't bridge from the Wine prefix to host Steam, so the game never spawns. Launch the exe directly, as above. - Crash on inject? Apply a per-game profile from uevr-profiles.com.
The easy button: Monadeck
Monadeck has a UEVR mode that does all of the above for you: it downloads chihuahua on first run, and for any UE game flagged in your in-headset library it runs the injection command (with a PTY, correct paths, and your chosen delay) instead of a normal launch — then waits until injection completes before dismissing the dashboard. If you'd rather not manage the command by hand, that's the path.