tags: [vr-ar]
Preparing builds for distribution in SteamVR
Publishing VR game in Steam technically harder than regular desktop. Issue not in Steamworks SDK itself — it's well documented. Complexity in that SteamVR app services multiple layers simultaneously: Steam Runtime, OpenVR/OpenXR overlay, compositor, all must launch correctly, register manifest and not conflict with other headset-specific layers like Oculus Runtime on PC.
What specifically prevents normal launch from Steam
First breaking point — vrmanifest. JSON file SteamVR uses to register app in OpenVR. If not written correctly or in wrong place relative to executable, SteamVR won't understand app is VR. Game launches in desktop mode, no stereo rendering, user gets black screen in headset.
manifest.vrmanifest structure:
{
"source": "builtin",
"applications": [{
"app_key": "steam.app.YOUR_APP_ID",
"launch_type": "binary",
"binary_path_windows": "YourGame.exe",
"is_dashboard_overlay": false,
"strings": {
"en_us": {
"name": "Your VR Game",
"description": "..."
}
}
}]
}
Field app_key must exactly match App ID in Steamworks. One character error — manifest ignored without errors in log.
Second problem class — Steam Depots and Build configuration. VR game should have minimum two depots: base content and separate high-quality textures depot, so users with less powerful machines load lighter version. Launch Options in Steamworks should explicitly specify -openvr or -openxr flag depending on backend in Unity/Unreal.
In Unity with OpenXR Plugin important to check XR Plug-in Management configured with correct provider order: OpenXR must come first, else launching via Steam without active VR Runtime game crashes on init with XRLoader failed to initialize.
Package preparation: from build to Steamworks
Release build for Steam differs from dev by several parameters. In Unity: IL2CPP backend (not Mono), Strip Engine Code enabled, Managed Stripping Level — Minimal or Low for VR (aggressive stripping regularly breaks reflection-based code in XR SDK). Compression Method — LZ4HC for faster unpacking on first launch.
After build — verify via Steam Content Builder (steamcmd). Local test via steam://run/APPID before uploading to Steam guarantees manifest picked up. If SteamVR doesn't launch automatically when running via Steam — check C:\Program Files (x86)\Steam\logs\vrserver.txt and openvr.log in game folder.
For OpenXR projects additionally check openxr_loader.dll present in executable folder and XR_RUNTIME_JSON environment variable correctness — Steam may override it at launch.
Testing before publication
Mandatory scenarios before submission:
Cold start: launch via Steam without pre-opened SteamVR — VR Runtime should start automatically. Hot switch: launch with already-open SteamVR, then headset change (if testing multi-HMD support — Index + Quest via Link). Non-VR launch: game shouldn't crash if VR Runtime unavailable — either graceful fallback or clear message.
Test on Valve Index if game positioned as PC VR — mandatory: different specifics with finger tracking via SteamVR Skeletal Input and Lighthouse tracking.
| Task scope | Estimated timeline |
|---|---|
| Manifest setup + Steamworks config | 1–2 working days |
| Full package preparation with depot setup | 3–5 working days |
| Iterative fixes after Steam QA | 1–2 days per cycle |
Cost determined after project analysis and current build state.





