Browse by type
WiVRn is an application that wirelessly streams a virtual reality game to a standalone VR headset from a Linux computer.
WiVRn support a wide range of VR devices:
| Headset | Supported | Notes |
|---|---|---|
| Quest 1 | ✓ | |
| Quest 2 | ✓ | |
| Quest 3 | ✓ | |
| Quest 3s | ✓ | |
| Quest Pro | ✓ | |
| Pico Neo 3 | ✓ | |
| Pico 4 | ✓ | |
| HTC Vive Focus 3 | ✓ | Laggy |
| HTC Vive XR Elite | ✓ | Laggy |
| Samsung Galaxy XR | ✓ | |
| Other Android VR | ? | Cannot know |
| Play for Dream | ✖ | https://github.com/WiVRn/WiVRn/issues/465 |
| Non-Android VR | ✖ | Not Android |
| Non-VR Android | ✖ | VR required |
A Linux client does exist, only for debugging. It has no audio or hardware decoding.
We recommend using native packages if available for your distribution: - Arch User Repository - Fedora - Gentoo Guru - NixOS
For OpenVR and Steam compatibility, you also need a compatibility library such as xrizer or OpenComposite.
A flatpak is available on Flathub for all distributions:
Note that due to flatpak sandboxing some features may not be available such as Lighthouse tracked devices.
Follow the wizard in the PC dashboard to install the client on your VR headset.
It should either lead you to the Meta Store (for Meta Quest headsets) or to download the correct APK (for other headsets).
[!WARNING] The VR client and PC server need to be on the same version of WiVRn
[!TIP] If the headset fails to connect to the computer, see troubleshooting.
Avahi must be running:
systemctl enable --now avahi-daemon
ufw allow 5353/udp and ufw allow 9757.wivrn-dashboard from the command line. It will show the setup wizard the first time you launch it.You can now stream an OpenXR application from your computer to your headset. For Steam games, you may also need to set the launch options to be able to use WiVRn. The server/dashboard will tell you how to do this if required. - Right-click on the game you want to play in VR in Steam and click "Properties". - In the "General" tab, enter the launch options that the WiVRn server/dashboard gave you inside the "Launch Options" setting.
You can set an application to be started automatically when your headset is connected, in the dashboard settings or manually.
When the headset is connected and no XR application is running, it will show an application launcher. Applications in that list are sourced from:
- Steam games that are flagged as VR. Steam may need to be restarted for the list to be updated when new games are installed.
- .desktop files that contain X-WiVRn-VR in the Categories section. Files are searched in standard locations which usually include ~/.local/share/applications and /usr/share/applications/.
The flatpak includes OpenComposite and xrizer, used to translate the OpenVR API to OpenXR. see SteamVR for details.
If using Wine/Proton, it will probe for OpenVR at startup, This means even for OpenXR applications, OpenComposite or xrizer is required.
When a headset connects, wivrn-server sets the OpenVR runtime to xrizer unless manually configured differently.
If you're using the Steam Flatpak, you'll need to grant read only access to the following paths:
flatpak override \
--filesystem=xdg-run/wivrn:ro \
--filesystem=xdg-data/flatpak/app/io.github.wivrn.wivrn:ro \
--filesystem=/var/lib/flatpak/app/io.github.wivrn.wivrn:ro \
--filesystem=xdg-config/openxr:ro \
--filesystem=xdg-config/openvr:ro \
com.valvesoftware.Steam
When using a user installation of flatpak Steam, use override --user instead of override.
When the headset is connected, WiVRn will create a virtual output device simply named "WiVRn. You must manually set this audio output to enabled/default. Please note that in pavucontrol it will appear as a virtual device.
To enable microphone, you first have to enable it on the settings tab on the VR headset (and give permission when prompted). It should appear as a virtual input device named "WiVRn(microphone)", and needs to be assigned as the input device (same way as output device).
See building for building the dashboard, server (PC), and client (headset)
Configuration can be done from the dashboard.
See configuration for editing the configuration manually.
My computer is not seen by the headset
If the server list is empty in the headset app:
- Make sure your computer is connected on the same network as your headset
- Check that avahi is running with systemctl status avahi-daemon, if it is not, enable it with systemctl enable --now avahi-daemon
- If you have a firewall, check that port 5353 (UDP) is open
My headset does not connect to my computer
How do I use a wired connection?
adb on some devices may require developer mode to be enabled):bash
adb reverse tcp:9757 tcp:9757
adb shell am start -a android.intent.action.VIEW -d "wivrn+tcp://localhost" org.meumeu.wivrnorg.meumeu.wivrn (Meta Store install) with:org.meumeu.wivrn.github for releases on Githuborg.meumeu.wivrn.github.nighly for Github nightlies (wirvn-apk repository)org.meumeu.wivrn.github.testing for Github CI buildsorg.meumeu.wivrn.local for developer buildsHow do I see server logs when using the dashboard?
${XDG_STATE_HOME}/wivrn/wivrn-dashboard (with fallback to ${HOME}/.local/state for ${XDG_STATE_HOME}, or${HOME}/.var/app/io.github.wivrn.wivrn/.local/state/wivrn/wivrn-dashboard.My NVIDIA GPU P-State is limited to P2 instead of reaching the highest P0 while using the NVIDIA NVENC encoder
I have high motion latency, black borders following my view, hear corrupted audio or see a corrupted, pixelated image
Note: WiVRn isn't properly optimized for NVIDIA GPUs due to the lack of developers with NVIDIA hardware. Motion latency may be significantly worse at rendering resolutions higher than default.
We are available on either Discord or Matrix space:
Please use the wivrn chat room for questions or issues specific to WiVRn.
See translating for procedure.
WiVRn uses the following software: - ambientCG - Avahi - Boost.Locale - Boost.PFR - CLI11 - Dear ImGui - fastgltf - ffmpeg optional, for hardware encoding on AMD/Intel - FreeType - glm - HarfBuzz - librsvg - Monado - nvenc optional, for hardware encoding on NVIDIA - qCoro - Qt 6 optional, for the dashboard - spdlog - VulkanMemoryAllocator - WebXR input profiles - x264 optional, for software encoding
$ claude mcp add WiVRn \
-- python -m otcore.mcp_server <graph>