Skip to main content

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.

Why not native?

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.
  • protontricks installed (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.zip from 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.

warning

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-bwrap disables 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 under Z:), with backslashes.
  • --delay 30 gives 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 in script -qec '<command>' /tmp/uevr.log (from util-linux) to allocate a PTY.
  • Don't use --launch-cmd steam://rungameid/<id>. The steam:// 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.