A Solstice Project
A standalone Meta Quest application to browse, download, and install VR games natively, built with Kotlin and Jetpack Compose.
- Overview
- Key Features
- Download & Installation
- Server Configuration
- Architecture
- Build & Development Commands
- Contributing
VRHub is a personal VR game manager for Meta Quest headsets. Connect to your private server to browse your own game catalog and install titles directly — no manual sideloading required. Your library, organized and at your fingertips.
This app does not host or provide any games. You must only install games you have legitimately purchased. VRHub is designed solely for managing your personal collection on your own server. We do not condone piracy in any form.
- Standalone Sideloading: Install games (APK + OBB) directly on your Meta Quest.
- Custom Server Configuration: Connect to any compatible server via JSON URL or manual key-value pairs.
- Background Downloads: Optimized to continue downloading even when the device sleeps.
- Offline Mode: Browse cached catalog and queued installations when offline.
- Optimized Performance: Smooth navigation through large game catalogs.
Important
Requires Meta Quest with Developer Mode enabled. Enable it at meta.com/quest/developers.
The easiest way to install APKs on Quest.
- Download and install SideQuest on your PC/Mac
- Connect your Quest headset via USB or Wi-Fi
- Download the latest APK:
- Drag and drop the APK onto SideQuest — installation is automatic
Install directly from your Quest without a PC (Quest Browser required).
- On your Quest headset, open the Meta Quest Browser
- Download the APK:
- Open the downloaded file — the system APK installer will handle the rest
For advanced users comfortable with command-line tools.
- Download the APK:
- Connect Quest via USB and enable USB debugging
- Run:
adb install -r VRHub-vX.X.X.apk
After installing VRHub, you need to connect it to your personal game server. You will receive a file or text containing two pieces of information: an address and a password.
It looks something like this:
{
"baseUri": "https://your-server.com/games/",
"password": "your-password-here"
}
Select Manual Entry mode, then:
- In the Key field (left), type exactly:
baseUri - In the Value field (right), type the address you were given (e.g.,
https://your-server.com/games/) - Press ADD KEY
- Repeat: in Key type
password - In Value type the password you were given
- Press the TEST button (it becomes clickable once both keys are added) and wait for the confirmation
- Press SAVE
If someone gave you a link (like https://example.com/config.json), select JSON URL mode and paste that link. VRHub will download and use the configuration automatically.
Use the TEST button to validate your configuration before saving. VRHub will check the server connection and verify the configuration structure.
Important
VRHub is a personal catalog manager. The app does not provide or host any game content. You are solely responsible for the server you configure and must only use it to manage games you have legitimately purchased.
VRHub follows a clean, layered architecture:
- data/ — Room database, DAOs, entities, repositories, server config
- logic/ — Catalog parsing and utilities
- network/ — Retrofit services, GitHub release checks, update service
- ui/ — Jetpack Compose screens, ViewModels, theme
- worker/ — WorkManager for background downloads
Tech Stack: Kotlin, Jetpack Compose, Room, Retrofit, WorkManager
- Android Studio (Ladybug or newer).
- Android SDK 34 (API 34).
# Clean the project
./scripts/gradlew clean
# or
make clean
# Build debug APK
./scripts/gradlew assembleDebug
# or
make build
# Build release APK (requires keystore.properties)
./scripts/gradlew assembleProdRelease
# or
make releaseThis project uses GitHub Actions for PR validation. You can run the validation logic locally to catch issues before pushing:
- Linux/macOS:
./scripts/test-ci-config.sh - Windows:
powershell -File scripts/test-ci-config.ps1
For end-to-end tests including release candidate builds:
- Linux/macOS:
./scripts/test-rc-e2e.sh - Windows:
powershell -File scripts/test-ci-logic.ps1(lint logic validation)
This project follows Semantic Versioning (SemVer).
When building from the command line, you can specify the version using Gradle properties:
versionCode: A positive integer (e.g.,-PversionCode=15)versionName: A SemVer compatible string (e.g.,-PversionName=2.5.0or-PversionName=2.5.0-rc.1)
The versionName must match the format X.Y.Z with optional pre-release suffixes or build metadata:
- Basic:
2.5.0 - Pre-release:
2.5.0-rc,2.5.0-beta.1,2.5.0-alpha - Build metadata:
2.5.0+build.1 - Combined:
2.5.0-rc.1+build.1
The regex pattern used is: ^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.]+)?(\+[a-zA-Z0-9.]+)?$
VRHub has two build flavors:
- dev (
./scripts/gradlew assembleDevDebug) — development build with.debugsuffix for testing - prod (
./scripts/gradlew assembleProdRelease) — production build for release
To enable application update checks, a secret key is required for request signing.
- Environment Variable:
VRHUB_UPDATE_SECRET - Local Development: You can provide this in your
local.propertiesfile or as a Gradle property:VRHUB_UPDATE_SECRET=your_secret_here - Release Builds: For security, release builds will fail if this secret is not provided via the environment variable or
keystore.properties.
We welcome contributions! To maintain a clean project history, we strictly follow the Conventional Commits specification.
All commit messages and pull requests should use the following prefixes:
feat:for new features.fix:for bug fixes.docs:for documentation changes.style:for formatting or UI adjustments (no logic changes).refactor:for code changes that neither fix a bug nor add a feature.perf:for performance improvements.chore:for maintenance tasks.
If you have an idea for a new feature or have found a bug, please open an issue:
- Fork the repository.
- Create a new branch (
feat/your-featureorfix/your-fix). - Commit your changes following the naming convention.
- Submit a pull request with a clear description of your changes.