Use Steam VR-enabled applications with your phone as HMD (Head-mounted display). The only Open-Source solution to similar commercial packages like VRidge, iVRy, Trinus etc etc.
C++
871
281 commits
updated Feb 28, 2025

Pictures used for representational purposes
Use Steam VR-enabled applications with your phone as VR HMD (Head-mounted display). The only Open-Source solution to similar commercial packages like VRidge, Riftcat, Trinus etc etc. Common-network can be any type of network between desktop and android app, even USB Tethering and Mobile Hotspots are supported.
| Tabs | Links |
|---|---|
| Roadmap/Plan/Future Todo | Project Kanban |
| Latest Release | Github Release |
| Previous Builds | Github Actions |
| Issues | Github Issue Tracker |
| Discuss/Chat/Help/Real-Time Updates/Any - Discord | Discord Server Invite Link |
A PC with Windows 7 or above, A smartphone with Android 5.0 (Lollipop) or above (ALVR requires Android 8.0 or above) with OpenGL-ES 3.0 or above, Steam and some SteamVR applications installed.
PhoneVR(PVR) can be used with two servers ALVR and PVRServer. ALVR Server is recommended over PVRServer, both use different APIs.
| Differences | ALVR Server | PhoneVR Server |
|---|---|---|
| Server/Desktop Side | OpenVR API | OpenVR API |
| Mobile Side | Google Cardboard API | Google VR API (deprecated) |
| GUI | ✅ | ❌ |
| User friendly Installer | ✅ | ❌ |
| Serverside hardware(GPU) Encoding | ✅ | ❌ |
| Serverside software Encoding | ✅ | ✅ |
| Automatic Firewall setting | ✅ | ❌ |
| Linux Support (*Partial*) | ✅ | ❌ |
| Developers | Alvr-org | PhoneVR |
| Supports other HMDs ? Quest etc. | ✅ | ❌ |
| Open-Source | ✅ | ✅ |
| Network throttling | ✅ | ❌ |
| Average Latency | 150ms | 1500ms |
| VRApplication Graphics manipulation (Brightness, resolution, contrast etc.) | ✅ | (Partial) |
| Code backend | Rust + C++ | C++ |
Library -> Tools -> SteamVR).PhoneVR-Server-vX.X.X-xxxxx.zip of this repository.PVRServer in driver folder of zip file into your SteamVR/drivers folder. (Default Path: C:\Program Files (x86)\Steam\steamapps\common\SteamVR\drivers.Releases page.
PhoneVR-vX.X.X.noGvr.apk.Windows Driver Settings
Windows SteamVR Driver, auto loads with SteamVR, and gets FrameTextures from VRApplication(like SteamVR Home, VRChat, etc.) via SteamVR. These Textures are then Encoded and Streamed, at specified game_fps, to Mobile device using x264 Encoder. Some configurations of this encoder can be adjusted via, pvrsettings.json in default installation location C:\Program Files (x86)\Steam\steamapps\common\SteamVR\drivers\PVRServer\.
Default Settings :
{
"enable" : true,
"game_fps" : 65,
"video_stream_port" : 15243,
"pose_stream_port" : 51423,
"pairing_port" : 33333,
"encoder" : {
"preset" : "ultrafast",
"tune" : "zerolatency",
"qp" : 20,
"profile" : "baseline"
}
}
Most settings are self-explanatory. Any change in settings will require SteamVR to be restarted for application.
"encoder" : Encoder x264 Settings
"preset" : Can be set to "ultrafast", "superfast", "veryfast", "faster", "fast", "medium", "slow", "slower", "veryslow" or "placebo" Warning: the speed of these presets scales dramatically. Ultrafast is a full 100 times faster than placebo! These presets affect the encoding speed. Using a slower preset gives you better compression, or quality per filesize, whereas faster presets give you worse compression. In general, you should just use the preset you can afford to wait for.
"tune" : Can be set to "film", "animation", "grain", "stillimage", "psnr", "ssim", "fastdecode", "zerolatency" Tune affects the video quality(and size), film being the best quality and gradually decreasing to the right
"profile" : Can be set to "baseline", "main", "high", "high10", "high422", "high444" Applies the restrictions of the given profile. Currently available profiles are specified above, from most to least restrictive. Does NOT guarantee that the given profile will be used: if the restrictions of "High" are applied to settings that are already Baseline-compatible, the stream will remain baseline. In short, it does not increase settings, only decrease them.
"qp" : Quantization packet constant, Range 0-51, 0-Lossless
"rc_method" : Rate Control Method, 1/2/3 Constant QP (CQP) - 0; Constant Rate factor (CRF) - 1; Average Bitrate (ABR) - 2; Default is 1 i.e., CRF with rf 24 (and rf_max 26)
Other standard x264 settings,
Do only adjust when required, and keep a eye on pvrlog.txt file in default installation location C:\Program Files (x86)\Steam\steamapps\common\SteamVR\drivers\PVRServer\logs\ for "Skipped frame! Please re-tune the encoder parameters" messages. If you are getting these messages in excess, you may wish to downgrade settings since windows does not seems to have enough processing power and resources to render with existing settings.
This Project is presently under testing. But, pull requests are welcome.
Windows PhoneVR Driver: <root>/code/windows/PhoneVR.sln
Microsoft Visual Studio 2017driver_PhoveVR.dll and other files from <solution root>/build/[win32 or x64]/ to local driver folder.MSVS JIT debugger to vrserver.exe (which actually loads the driver_PhonveVR.dll)Android App: App folder: <root>/code/mobile/android/PhoneVR
Android Studio 4.0.1adb forward tcp:33333 tcp:33333, in terminal/cmd, this will enable PVRServer -> Android Emulator based PVRAndroidApp communication.ALVR Streamer (PC) Configuration is done from the above link. Then you should, in terminal/cmd, execute
adb forward tcp:9943 tcp:9943adb forward tcp:9944 tcp:9944External Vendor Libraries used (all Headers included in respective Projects):
Code styling
make format./gradlew spotlessApply or use spotless-gradle plugin for AndroidStudio/IDEsAndroid App doesn’t connect to Windows Steam VR even after opening Phone App first and then SteamVR on windows
Pairing Port (default :33333), might be used by other services on your devices(Windows/Android). Try changing the "Pairing Port" on Android PhoneVR App settings and pairing_port in C:\Program Files\PhoneVR\pvrsettings.json for Windows PVR driver and restart SteamVR. Both Windows Pairing port and Android Pairing port should be the same. Safe recommended port range : 30000 - 65535Android App automatically comes back to "Discovery"(Home/AppStart) page after some VR Application usage
Android System Battery saver or similar applications are killing the app when in background. Usually can be found is Android Setting -> Application Manager or Application Settings according to your Android device flavour/OEM.Lag while using VR App on mobile
Settings -> Debug is checked. You can find out what the bottleneck component in the whole chain from VRApplication on windows to GoogleVR SDK renderer on Android is and resolve it.Incase above mentioned things have not been helpful to you, then you might want to Install Debug variant of APK from [PhoneVR.zip]/android/arm7/debug which can help you/us to get more detailed logs.
Diagnostics Stats Nomenclature (ONLY PhoneVR Server) (in order from VRAppFrameCreation to MobileFrameDisplay):
These stats can be enabled by checking Settings->Stats option. All the values must be stable and more or less equal to game_fps± 10 value in pvrsettings.json.
--- @M - Mobile; @C - CPU/Desktop ---
@FPS(s) :
SR - StreamReceiver @M
D - Media Decoder @M
R - Frame Renderer @M
cR - Frame Renderer @C
SS - Stream Sender @C
SW - Stream Writer @C
E - Media Encoder @C
VRa - VR Application FPS @C
@Latency(s) :
tSS - Time Delay between RendererGotFrame and RendererRendered @C
tE - Time Delay between EncoderGotFrame and EncoderEncoded @C
tND - NetworkDelay - Time Delay between DataPacketSent from @C to DataPacketReceived @M
tSR - StreamReceiver - Time Delay between DataPacketSent from @C to DataSentToMediaDecoder @M

Prior to reporting your Issue/Bug, please check out the ongoing issues (here and here), If you have the same issue, you can join and watch that discussion(s).
You can use the Github Issues to submit PhoneVR related issues/bugs related to working of this Project or for any query.
For reporting ALVRServer related issues please use ALVR Github Issues.
For quick resolution you may want to add the following data along with your issue/bug report,
For Installation-time or SteamVR-and-PhoneVR-linking issues,
steamvr.vrsettings file in default location C:\Program Files (x86)\Steam\config\steamvr.vrsettingsvrserver.txt file in default location C:\Program Files (x86)\Steam\logs\vrserver.txtcmd in the follow default directory and copy paste output of the vrcmd command. C:\Program Files (x86)\Steam\steamapps\common\SteamVR\bin\win64\vrcmd.exeFor networking issues,
.pcap file. How-to-get-it-> Here.pcap file. How-to-get-it-> HereIf Unexpected android app crashes occur(unexpected means, you did NOT get this screen when PhoneVR crashed),
PhoneVR android app and let it crash.bugreport-xxx.zip from android device (How-to under "Capture a bug report from a device" paragraph here)bugreport-xxx.zip file in Discord or GitHub or mail to "phonevr.crash@gmail.com"Common files required for all kinds issues,
pvrLog.txt and/or pvrDebugLog.txt file(s) in default windows location C:\Program Files (x86)\Steam\steamapps\common\SteamVR\drivers\PVRServer\logspvrLog.txt and/or pvrDebugLog.txt file(s) in default android location .../Android/data/virtualis.phonevr/files/PVR/. Optionally you can also attach Log from your Settings page on the app.295 followers · starred Aug 2026
46 followers · starred Jan 2021
102 followers · starred Oct 2023
14 followers · starred Jul 2022
Use Steam VR-enabled applications with your phone as HMD (Head-mounted display). The only Open-Source solution to similar commercial packages like VRidge, iVRy, Trinus etc etc.
C++
871
281 commits
updated Feb 28, 2025

Pictures used for representational purposes
Use Steam VR-enabled applications with your phone as VR HMD (Head-mounted display). The only Open-Source solution to similar commercial packages like VRidge, Riftcat, Trinus etc etc. Common-network can be any type of network between desktop and android app, even USB Tethering and Mobile Hotspots are supported.
| Tabs | Links |
|---|---|
| Roadmap/Plan/Future Todo | Project Kanban |
| Latest Release | Github Release |
| Previous Builds | Github Actions |
| Issues | Github Issue Tracker |
| Discuss/Chat/Help/Real-Time Updates/Any - Discord | Discord Server Invite Link |
A PC with Windows 7 or above, A smartphone with Android 5.0 (Lollipop) or above (ALVR requires Android 8.0 or above) with OpenGL-ES 3.0 or above, Steam and some SteamVR applications installed.
PhoneVR(PVR) can be used with two servers ALVR and PVRServer. ALVR Server is recommended over PVRServer, both use different APIs.
| Differences | ALVR Server | PhoneVR Server |
|---|---|---|
| Server/Desktop Side | OpenVR API | OpenVR API |
| Mobile Side | Google Cardboard API | Google VR API (deprecated) |
| GUI | ✅ | ❌ |
| User friendly Installer | ✅ | ❌ |
| Serverside hardware(GPU) Encoding | ✅ | ❌ |
| Serverside software Encoding | ✅ | ✅ |
| Automatic Firewall setting | ✅ | ❌ |
| Linux Support (*Partial*) | ✅ | ❌ |
| Developers | Alvr-org | PhoneVR |
| Supports other HMDs ? Quest etc. | ✅ | ❌ |
| Open-Source | ✅ | ✅ |
| Network throttling | ✅ | ❌ |
| Average Latency | 150ms | 1500ms |
| VRApplication Graphics manipulation (Brightness, resolution, contrast etc.) | ✅ | (Partial) |
| Code backend | Rust + C++ | C++ |
Library -> Tools -> SteamVR).PhoneVR-Server-vX.X.X-xxxxx.zip of this repository.PVRServer in driver folder of zip file into your SteamVR/drivers folder. (Default Path: C:\Program Files (x86)\Steam\steamapps\common\SteamVR\drivers.Releases page.
PhoneVR-vX.X.X.noGvr.apk.Windows Driver Settings
Windows SteamVR Driver, auto loads with SteamVR, and gets FrameTextures from VRApplication(like SteamVR Home, VRChat, etc.) via SteamVR. These Textures are then Encoded and Streamed, at specified game_fps, to Mobile device using x264 Encoder. Some configurations of this encoder can be adjusted via, pvrsettings.json in default installation location C:\Program Files (x86)\Steam\steamapps\common\SteamVR\drivers\PVRServer\.
Default Settings :
{
"enable" : true,
"game_fps" : 65,
"video_stream_port" : 15243,
"pose_stream_port" : 51423,
"pairing_port" : 33333,
"encoder" : {
"preset" : "ultrafast",
"tune" : "zerolatency",
"qp" : 20,
"profile" : "baseline"
}
}
Most settings are self-explanatory. Any change in settings will require SteamVR to be restarted for application.
"encoder" : Encoder x264 Settings
"preset" : Can be set to "ultrafast", "superfast", "veryfast", "faster", "fast", "medium", "slow", "slower", "veryslow" or "placebo" Warning: the speed of these presets scales dramatically. Ultrafast is a full 100 times faster than placebo! These presets affect the encoding speed. Using a slower preset gives you better compression, or quality per filesize, whereas faster presets give you worse compression. In general, you should just use the preset you can afford to wait for.
"tune" : Can be set to "film", "animation", "grain", "stillimage", "psnr", "ssim", "fastdecode", "zerolatency" Tune affects the video quality(and size), film being the best quality and gradually decreasing to the right
"profile" : Can be set to "baseline", "main", "high", "high10", "high422", "high444" Applies the restrictions of the given profile. Currently available profiles are specified above, from most to least restrictive. Does NOT guarantee that the given profile will be used: if the restrictions of "High" are applied to settings that are already Baseline-compatible, the stream will remain baseline. In short, it does not increase settings, only decrease them.
"qp" : Quantization packet constant, Range 0-51, 0-Lossless
"rc_method" : Rate Control Method, 1/2/3 Constant QP (CQP) - 0; Constant Rate factor (CRF) - 1; Average Bitrate (ABR) - 2; Default is 1 i.e., CRF with rf 24 (and rf_max 26)
Other standard x264 settings,
Do only adjust when required, and keep a eye on pvrlog.txt file in default installation location C:\Program Files (x86)\Steam\steamapps\common\SteamVR\drivers\PVRServer\logs\ for "Skipped frame! Please re-tune the encoder parameters" messages. If you are getting these messages in excess, you may wish to downgrade settings since windows does not seems to have enough processing power and resources to render with existing settings.
This Project is presently under testing. But, pull requests are welcome.
Windows PhoneVR Driver: <root>/code/windows/PhoneVR.sln
Microsoft Visual Studio 2017driver_PhoveVR.dll and other files from <solution root>/build/[win32 or x64]/ to local driver folder.MSVS JIT debugger to vrserver.exe (which actually loads the driver_PhonveVR.dll)Android App: App folder: <root>/code/mobile/android/PhoneVR
Android Studio 4.0.1adb forward tcp:33333 tcp:33333, in terminal/cmd, this will enable PVRServer -> Android Emulator based PVRAndroidApp communication.ALVR Streamer (PC) Configuration is done from the above link. Then you should, in terminal/cmd, execute
adb forward tcp:9943 tcp:9943adb forward tcp:9944 tcp:9944External Vendor Libraries used (all Headers included in respective Projects):
Code styling
make format./gradlew spotlessApply or use spotless-gradle plugin for AndroidStudio/IDEsAndroid App doesn’t connect to Windows Steam VR even after opening Phone App first and then SteamVR on windows
Pairing Port (default :33333), might be used by other services on your devices(Windows/Android). Try changing the "Pairing Port" on Android PhoneVR App settings and pairing_port in C:\Program Files\PhoneVR\pvrsettings.json for Windows PVR driver and restart SteamVR. Both Windows Pairing port and Android Pairing port should be the same. Safe recommended port range : 30000 - 65535Android App automatically comes back to "Discovery"(Home/AppStart) page after some VR Application usage
Android System Battery saver or similar applications are killing the app when in background. Usually can be found is Android Setting -> Application Manager or Application Settings according to your Android device flavour/OEM.Lag while using VR App on mobile
Settings -> Debug is checked. You can find out what the bottleneck component in the whole chain from VRApplication on windows to GoogleVR SDK renderer on Android is and resolve it.Incase above mentioned things have not been helpful to you, then you might want to Install Debug variant of APK from [PhoneVR.zip]/android/arm7/debug which can help you/us to get more detailed logs.
Diagnostics Stats Nomenclature (ONLY PhoneVR Server) (in order from VRAppFrameCreation to MobileFrameDisplay):
These stats can be enabled by checking Settings->Stats option. All the values must be stable and more or less equal to game_fps± 10 value in pvrsettings.json.
--- @M - Mobile; @C - CPU/Desktop ---
@FPS(s) :
SR - StreamReceiver @M
D - Media Decoder @M
R - Frame Renderer @M
cR - Frame Renderer @C
SS - Stream Sender @C
SW - Stream Writer @C
E - Media Encoder @C
VRa - VR Application FPS @C
@Latency(s) :
tSS - Time Delay between RendererGotFrame and RendererRendered @C
tE - Time Delay between EncoderGotFrame and EncoderEncoded @C
tND - NetworkDelay - Time Delay between DataPacketSent from @C to DataPacketReceived @M
tSR - StreamReceiver - Time Delay between DataPacketSent from @C to DataSentToMediaDecoder @M

Prior to reporting your Issue/Bug, please check out the ongoing issues (here and here), If you have the same issue, you can join and watch that discussion(s).
You can use the Github Issues to submit PhoneVR related issues/bugs related to working of this Project or for any query.
For reporting ALVRServer related issues please use ALVR Github Issues.
For quick resolution you may want to add the following data along with your issue/bug report,
For Installation-time or SteamVR-and-PhoneVR-linking issues,
steamvr.vrsettings file in default location C:\Program Files (x86)\Steam\config\steamvr.vrsettingsvrserver.txt file in default location C:\Program Files (x86)\Steam\logs\vrserver.txtcmd in the follow default directory and copy paste output of the vrcmd command. C:\Program Files (x86)\Steam\steamapps\common\SteamVR\bin\win64\vrcmd.exeFor networking issues,
.pcap file. How-to-get-it-> Here.pcap file. How-to-get-it-> HereIf Unexpected android app crashes occur(unexpected means, you did NOT get this screen when PhoneVR crashed),
PhoneVR android app and let it crash.bugreport-xxx.zip from android device (How-to under "Capture a bug report from a device" paragraph here)bugreport-xxx.zip file in Discord or GitHub or mail to "phonevr.crash@gmail.com"Common files required for all kinds issues,
pvrLog.txt and/or pvrDebugLog.txt file(s) in default windows location C:\Program Files (x86)\Steam\steamapps\common\SteamVR\drivers\PVRServer\logspvrLog.txt and/or pvrDebugLog.txt file(s) in default android location .../Android/data/virtualis.phonevr/files/PVR/. Optionally you can also attach Log from your Settings page on the app.295 followers · starred Aug 2026
46 followers · starred Jan 2021
102 followers · starred Oct 2023
14 followers · starred Jul 2022