Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ permissions:
contents: read

jobs:
windows-app:
uses: ./.github/workflows/windows-package.yml

python-release:
runs-on: ubuntu-latest
steps:
Expand Down Expand Up @@ -197,10 +200,14 @@ jobs:
riftlift-compat.zip.sha256

release-bundle:
needs: [python-release, compatibility, xrizer, dxvk]
needs: [python-release, compatibility, xrizer, dxvk, windows-app]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/download-artifact@v5
with:
name: riftlift-windows-installer
path: release
- uses: actions/download-artifact@v5
with:
name: riftlift-python-release
Expand All @@ -224,7 +231,7 @@ jobs:
version=$(PYTHONPATH=src python -c 'from riftlift import __version__; print(__version__)')
tag=$(python -c 'import re,sys; value=sys.argv[1]; match=re.fullmatch(r"(\d+(?:\.\d+){2,3})(?:a(\d+))?", value); assert match; print(f"v{match.group(1)}" + (f"-alpha.{match.group(2)}" if match.group(2) else ""))' "$version")
scripts/generate-release-installer.sh "$tag" release release/riftlift-installer.sh
(cd release && sha256sum riftlift-* > SHA256SUMS)
(cd release && sha256sum riftlift-* RiftLift-Setup-*.exe > SHA256SUMS)
(cd release && sha256sum -c SHA256SUMS)
bash -n release/riftlift-installer.sh
grep -F "release_tag='$tag'" release/riftlift-installer.sh
Expand Down
17 changes: 17 additions & 0 deletions .github/workflows/windows-host.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
name: Windows
on:
push:
pull_request:
jobs:
windows-host:
runs-on: windows-latest
steps:
- uses: actions/checkout@v5
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- run: python -m pip install -e . pytest
- run: python -m riftlift.cli --help
- run: python -m pytest tests/test_windows_package.py tests/test_windows_native.py tests/test_gui.py tests/test_playtime.py tests/test_util.py tests/test_library.py tests/test_platform_exports.py -q
env:
QT_QPA_PLATFORM: offscreen
72 changes: 72 additions & 0 deletions .github/workflows/windows-package.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
name: Windows installer

on:
workflow_dispatch:
workflow_call:
pull_request:
paths:
- '.github/workflows/windows-package.yml'
- 'scripts/*windows*'
- 'src/riftlift/**'
- 'runtime/**'
- 'compat/**'
- 'pyproject.toml'

permissions:
contents: read

jobs:
package:
runs-on: windows-2022
steps:
- uses: actions/checkout@v5
- uses: actions/setup-python@v6
with:
python-version: '3.12'
- run: python -m pip install . pyinstaller==6.22.0 pefile ninja cmake pytest
- uses: ilammy/msvc-dev-cmd@v1
with:
arch: x64
- name: Fetch pinned native dependencies
shell: bash
run: |
scripts/prepare-runtime-ci-deps.sh
git clone https://github.com/microsoft/Detours.git build/Detours
git -C build/Detours checkout e4bfd6b03e50de46b47abfbd1e46b384f0c5f833
git clone https://github.com/KhronosGroup/OpenXR-SDK.git build/OpenXR-SDK
git -C build/OpenXR-SDK checkout 8899a91c17ce9618f565f42408b47db1d6e9ccc7
- name: Prepare signed SDK files
shell: pwsh
run: |
Invoke-WebRequest 'https://securecdn.oculus.com/binaries/download/?id=4377593722298679' -OutFile build/sdk.zip
if ((Get-FileHash build/sdk.zip).Hash -ne '3c8aeb66c822af731a8d1f1cb1cf97ab706100bf0bd003ef126f4bb9812906b3') { throw 'SDK checksum mismatch' }
Expand-Archive build/sdk.zip runtime/Externals -Force
Invoke-WebRequest 'https://securecdn-atl3-3.oculus.com/binaries/download/?id=3766757683456363' -OutFile build/platform.zip
if ((Get-FileHash build/platform.zip).Hash -ne 'adbdc5f0285a2ac2ead6fdd34522de98de1bf6782017d9857ea4044b2d2fd009') { throw 'Platform checksum mismatch' }
Expand-Archive build/platform.zip build/meta-runtime -Force
- name: Build complete Windows native runtime
shell: pwsh
run: |
cmake -S runtime -B build/native -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DBUILD_TESTING=OFF "-DDETOURS_SOURCE_DIR=$PWD/build/Detours" "-DOPENXR_SDK_SOURCE_DIR=$PWD/build/OpenXR-SDK" "-DMETA_PLATFORM_IMPL=$PWD/build/meta-runtime/LibOVRPlatformImpl64_1.dll"
if ($LASTEXITCODE -ne 0) { throw 'Native configuration failed' }
cmake --build build/native -j 4
if ($LASTEXITCODE -ne 0) { throw 'Native build failed' }
- name: Build self-contained app and per-user installer
run: ./scripts/build-windows.ps1 -RuntimeDirectory build/native/bin
- name: Check installation, upgrade, launch and uninstall
run: ./scripts/test-windows-install.ps1
- name: Windows regression tests
run: python -m pytest tests/test_windows_package.py tests/test_windows_native.py tests/test_gui.py tests/test_playtime.py tests/test_util.py tests/test_library.py tests/test_platform_exports.py -q
env:
QT_QPA_PLATFORM: offscreen
- uses: actions/upload-artifact@v4
with:
name: riftlift-windows-installer
path: |
dist/windows/RiftLift-Setup-*.exe
dist/windows/RiftLift-Setup-*.exe.sha256
- uses: actions/upload-artifact@v4
if: always()
with:
name: riftlift-windows-install-checks
path: build/install-check/
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,7 @@ out/
# Runtime artifacts written by launched games in the repository working tree.
logs/
logConfig.xml

# Native Windows install and local verification output.
portable/
*.local.log
23 changes: 18 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# RiftLift

**Play your Meta Rift (Oculus Rift) PC VR games on Linux.**
**Play your Meta Rift (Oculus Rift) PC VR games on Linux and Windows.**

RiftLift is a Linux compatibility app for Meta Rift PC VR games. Its desktop
RiftLift is a compatibility app for Meta Rift PC VR games. Its desktop
GUI handles Meta sign-in, owned-game downloads, Steam shortcuts, local playtime,
and launching through your existing VR headset setup. It supports Rift Store
releases and compatible Steam games that include an Oculus mode. RiftLift can
Expand All @@ -13,13 +13,13 @@ use SteamVR directly or a Monado-based OpenXR setup.
> [!WARNING]
> **RiftLift is alpha software.** Game compatibility is still expanding.

See the [compatibility wiki](docs/COMPATIBILITY.md) for games tested with real VR output.
See the [compatibility wiki](docs/COMPATIBILITY.md) for Windows and Linux results.

## Quick start

Before you start, you need:

- a 64-bit Linux PC;
- a 64-bit Linux or Windows PC;
- Steam;
- a VR headset that already works through SteamVR or Monado/OpenXR; and
- a Meta account that owns a **Rift / PC VR** game.
Expand All @@ -29,7 +29,14 @@ drivers or Monado.

### 1. Install RiftLift

Download `riftlift-installer.sh` from the latest GitHub release, then run:
**Windows:** Windows builds produce `RiftLift-Setup-<version>-x64.exe`.
Open the installer, choose **Install**, then launch **RiftLift** from the Start
menu. Python, Git, administrator access, and a separate runtime download are
not required. A desktop shortcut is optional. RiftLift selects your VR runtime
automatically. Re-running the installer updates the app; Windows **Installed
apps** can uninstall it while preserving your games and settings.

**Linux:** Download `riftlift-installer.sh` from the latest GitHub release, then run:

```bash
bash riftlift-installer.sh
Expand All @@ -43,6 +50,12 @@ Source installs use the checkout and selected payloads directly; release
artifact hashes are enforced by the generated all-in-one installer, not baked
into the application source.

For Windows source development, run `./install-windows.ps1` with Python 3.12 and
Git installed, then open `RiftLift.cmd`. To package a native build, install
PyInstaller 6.22.0 and Inno Setup 6, then run
`./scripts/build-windows.ps1 -RuntimeDirectory <complete-native-runtime-directory>`.
The Windows installer workflow builds and checks the standalone distribution.

### 2. Check your setup and sign in

Open **RiftLift** and click **System** to verify the setup.
Expand Down
4 changes: 4 additions & 0 deletions RiftLift-Simulator.cmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@echo off
setlocal
call "%~dp0RiftLift.cmd" simulate --runtime "%~dp0portable\tools\SteamVR"
exit /b %errorlevel%
13 changes: 13 additions & 0 deletions RiftLift.cmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
@echo off
setlocal
set "RIFTLIFT_HOME=%~dp0portable"
if not exist "%~dp0.venv\Scripts\python.exe" (
echo Run install-windows.ps1 first.
exit /b 1
)
if "%~1"=="" (
start "" "%~dp0.venv\Scripts\pythonw.exe" -m riftlift.windows_app
) else (
"%~dp0.venv\Scripts\python.exe" -m riftlift.cli %*
)
exit /b %errorlevel%
34 changes: 19 additions & 15 deletions docs/COMPATIBILITY.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,26 @@
# RiftLift compatibility wiki

These games have been tested successfully with RiftLift. Results can vary with Wine, driver, GPU, and game updates.
Compatibility results are listed separately for Windows and Linux. Results can vary with runtime, Wine, driver, GPU, and game updates.

## Tested games

| Game | Build tested | Status | Oculus exclusive? | Setup notes |
| --- | --- | --- | --- | --- |
| [Aircar](https://store.steampowered.com/app/1073390/Aircar/) | Steam Oculus mode | ✅ Working | No | — |
| Echo VR | Community PCVR installation | ✅ Working | Yes, originally | Requires the community installer and patch; follow the [Echo VR setup guide](https://gist.github.com/Villagers654/d5bf4d11f56fc60d1eab91e7bf3f41c5). |
| [Five Nights at Freddy's: Help Wanted](https://store.steampowered.com/app/732690/FIVE_NIGHTS_AT_FREDDYS_HELP_WANTED/) | Steam Oculus mode | ✅ Working | No | — |
| [Keep Talking and Nobody Explodes](https://store.steampowered.com/app/341800/Keep_Talking_and_Nobody_Explodes/) | Steam Oculus mode | ✅ Working | No | — |
| [Lone Echo](https://www.youtube.com/watch?v=2pmV2mwAV9k) | Meta Rift Store | ✅ Working | Yes | — |
| [Lone Echo 2](https://www.meta.com/experiences/pcvr/lone-echo-ii/1711938725528735/) | Meta Rift Store | ✅ Working | Yes | — |
| [Oculus First Contact](https://www.meta.com/experiences/pcvr/oculus-first-contact/1217155751659625/) | Meta Rift Store | ✅ Working | Yes | — |
| [StereoPaint](https://store.steampowered.com/app/1920760/StereoPaint/) | Steam | ✅ Working | Yes | — |
| [Stormland](https://www.meta.com/experiences/pcvr/stormland/1360938750683878/) | Meta Rift Store | ✅ Working | Yes | — |
| [SUPERHOT VR](https://store.steampowered.com/app/617830/SUPERHOT_VR/) | Steam Oculus mode | ✅ Working | No | — |
| [Vader Immortal: Episode I](https://www.playstation.com/en-us/games/vader-immortal-a-star-wars-vr-series/) | Meta Rift Store | ✅ Working | Yes | — |
✅ = renders a menu or scene without major rendering errors; ❌ = does not work; ⚠️ = known problems; Untested = not tested. A check does not require a full gameplay pass.

| Game | Build tested | Windows | Linux | Oculus exclusive? | Setup notes |
| --- | --- | --- | --- | --- | --- |
| [Aircar](https://store.steampowered.com/app/1073390/Aircar/) | Steam Oculus mode | Untested | ✅ | No | — |
| Echo VR | Windows: original 34.4.636386.0; Linux: community PCVR installation | ✅ | ✅ | Yes, originally | Windows renders the original client's shutdown notice with hands. Online play requires the community installer and patch; follow the [Echo VR setup guide](https://gist.github.com/Villagers654/d5bf4d11f56fc60d1eab91e7bf3f41c5). Community client untested on Windows. |
| [Five Nights at Freddy's: Help Wanted](https://store.steampowered.com/app/732690/FIVE_NIGHTS_AT_FREDDYS_HELP_WANTED/) | Steam Oculus mode | Untested | ✅ | No | — |
| [Keep Talking and Nobody Explodes](https://store.steampowered.com/app/341800/Keep_Talking_and_Nobody_Explodes/) | Steam Oculus mode | Untested | ✅ | No | — |
| [Lone Echo](https://www.youtube.com/watch?v=2pmV2mwAV9k) | Meta Rift Store; Windows: 3.17.4 | ✅ | ✅ | Yes | Windows: stereo main menu and hands. |
| [Lone Echo 2](https://www.meta.com/experiences/pcvr/lone-echo-ii/1711938725528735/) | Meta Rift Store | Untested | ✅ | Yes | — |
| [Oculus First Contact](https://www.meta.com/experiences/pcvr/oculus-first-contact/1217155751659625/) | Meta Rift Store; Windows: 1.1.9 | ✅ | ✅ | Yes | Windows: stereo room and hands at standing height. |
| [StereoPaint](https://store.steampowered.com/app/1920760/StereoPaint/) | Steam | Untested | ✅ | Yes | — |
| [Stormland](https://www.meta.com/experiences/pcvr/stormland/1360938750683878/) | Meta Rift Store; Windows: Stormland_008 | ✅ | ✅ | Yes | Windows: stereo island scene. |
| [SUPERHOT VR](https://store.steampowered.com/app/617830/SUPERHOT_VR/) | Steam Oculus mode | Untested | ✅ | No | — |
| [Vader Immortal: Episode I](https://www.playstation.com/en-us/games/vader-immortal-a-star-wars-vr-series/) | Meta Rift Store; Windows: 1.1.0 | ✅ | ✅ | Yes | Windows: VR settings menu and hands; simulated button input advances setup. |

Windows results use the local `windows-native` development build with a simulated headset. Images were inspected from game render textures while the desktop was locked; headset presentation and full interactive gameplay remain unverified. These results do not establish compatibility for the pinned release.

## What “Oculus exclusive” means here

Expand All @@ -36,4 +40,4 @@ riftlift doctor

The command includes concise setup details and recent launch evidence, then creates a shareable diagnostic paste. Attach that result when opening a [compatibility report](https://github.com/Villagers654/RiftLift/issues).

Last updated: August 2026.
Last updated: September 2, 2026.
24 changes: 24 additions & 0 deletions install-windows.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
param([string]$PythonVersion = '3.12')
$ErrorActionPreference = 'Stop'
Push-Location $PSScriptRoot
try {
if (-not (Test-Path '.venv/Scripts/python.exe')) {
& py "-$PythonVersion" -m venv .venv
if ($LASTEXITCODE -ne 0) { throw 'Python environment creation failed' }
}
& ./.venv/Scripts/python.exe -m pip install -e .
if ($LASTEXITCODE -ne 0) { throw 'RiftLift dependency installation failed' }
$env:RIFTLIFT_HOME = Join-Path $PSScriptRoot 'portable'
& ./.venv/Scripts/python.exe -m riftlift.cli setup
if ($LASTEXITCODE -ne 0) { throw 'Native runtime installation failed' }
& ./.venv/Scripts/python.exe -m riftlift.cli doctor --no-paste
if ($LASTEXITCODE -eq 2) {
Write-Host 'Runtime installed. Configure the headset/OpenXR runtime before game testing.'
} elseif ($LASTEXITCODE -ne 0) {
throw 'Windows diagnostics failed'
}

} finally {
Pop-Location
}
exit 0
7 changes: 5 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,17 @@ build-backend = "setuptools.build_meta"
[project]
name = "riftlift"
dynamic = ["version"]
description = "Plug-and-play Meta Rift games for working Linux OpenXR runtimes"
description = "Meta Rift games for OpenXR runtimes on Linux and Windows"
readme = "README.md"
requires-python = ">=3.10.12"
license = "GPL-3.0-or-later"
authors = [{name = "Villagers654"}]
keywords = ["linux", "meta", "monado", "oculus", "openxr", "rift", "vr"]
keywords = ["linux", "windows", "meta", "monado", "oculus", "openxr", "rift", "vr"]
classifiers = [
"Development Status :: 4 - Beta",
"Environment :: Console",
"Operating System :: POSIX :: Linux",
"Operating System :: Microsoft :: Windows",
"Programming Language :: Python :: 3",
"Topic :: Games/Entertainment",
]
Expand All @@ -33,6 +34,8 @@ xrizer = "https://github.com/Villagers654/xrizer"

[project.scripts]
riftlift = "riftlift.cli:main"

[project.gui-scripts]
riftlift-gui = "riftlift.gui:main"

[tool.setuptools.packages.find]
Expand Down
Loading
Loading