A fully-featured VR code editor for Meta Quest devices, bringing modal editing and multi-panel architecture to immersive development environments.
Features β’ Demo β’ Installation β’ Development β’ Contributing
Quest Code Editor is an ambitious VR development environment designed for Meta Quest Pro, Meta Quest 3, and Meta Quest 2 devices. It implements a professional code editing experience in immersive space with Vim-style modal editing, real-time syntax highlighting, file operations, and integrated terminal with command execution.
Current Status: ~85% complete with core features stable and thoroughly tested on Meta Quest Pro and Meta Quest 3.
- Modal Editing System - NORMAL/INSERT/VISUAL modes with full hjkl navigation
- Multi-Language Syntax Highlighting - C++, Java, Python, Dart, and more
- Multi-Panel Architecture - Organized layout with resizable floating panels
- File Operations - Create, read, edit, delete files with persistence
- Text Rendering - High-quality typography with Skia integration and matrix transformations
- OpenXR Integration - Cross-platform XR support for Meta Quest devices
- Spatial Panels - World-locked and hand-relative positioning
- Modal Input System - Gesture and controller input handling
- Network Detection - Real-time internet connectivity via JNI/ConnectivityManager
- Terminal Integration - Execute commands directly in VR environment
- C++ Core - Performance-optimized rendering and event handling
- Android NDK - Native platform integration
- JNI Bridges - Seamless Java/C++ interoperability
- CMake Build System - Cross-platform compilation
See the editor in action with DevLog videos documenting development progress:
- Text rendering and coordinate systems
- Modal editing implementation
- Panel positioning and spatial anchors
- Terminal integration and command execution
Watch on YouTube | Read Technical Articles on Medium
- Meta Quest Pro β Fully tested and verified
- Meta Quest 3 β Fully tested and verified
- Meta Quest 2 (compatible)
- Chip: Apple M1 Pro
- Memory: 16 GB RAM
- OS: macOS 26.3.1 (25D2128)
- Storage: ~20 GB free (SDK, NDK, build artifacts)
- Android SDK: API level 34 (target), API level 24+ (minimum)
- Android NDK: r25 or later
- CMake: 3.22 or later
- Gradle: 7.0 or later
- OpenXR SDK: ovr_openxr_mobile_sdk_78.0
git clone https://github.com/yourusername/quest-code-editor.git
cd quest-code-editorThe project uses the OpenXR Mobile SDK v78.0. Ensure the SDK is in the correct location:
# Directory structure should be:
meta_sdk/ovr_openxr_mobile_sdk_78.0/
βββ OpenXR/
βββ Samples/
βββ CODE_OF_CONDUCT.md
βββ README.mdCreate local.properties with your machine's paths:
# Android SDK path
sdk.dir=/path/to/android-sdk
# Android NDK path (r25+)
ndk.dir=/path/to/android-ndk
# Optional: CMake path
cmake.dir=/usr/local/bin/cmake# Clean build (recommended for first build)
./gradlew clean
# Build debug APK (fastest)
./gradlew assembleDebug
# Or build and install directly to connected device
./gradlew installDebug
# Build release APK (optimized)
./gradlew assembleReleaseBuild times on Apple M1 Pro:
- Clean build: ~4-6 minutes (first time)
- Incremental build: ~1-2 minutes
- Full release build: ~8-10 minutes
Option A: Using Gradle (Recommended)
# Connect Meta Quest via USB, enable Developer Mode
./gradlew installDebugOption B: Using Android Studio
- Open the project in Android Studio
- Connect Meta Quest device via USB
- On Meta Quest: Settings β System β Developer β Enable USB Debugging
- Accept USB debugging prompt on headset
- Click Run (βΆ) or Run β Run 'app'
Option C: Manual adb Installation
# Build APK
./gradlew assembleDebug
# List connected devices
adb devices
# Install
adb install app/build/outputs/apk/debug/app-debug.apk
# Force reinstall
adb install -r app/build/outputs/apk/debug/app-debug.apk
# Launch app
adb shell am start -n com.manu.questcodeeditor/.MainActivity
# View logs
adb logcat | grep quest_code_editorMeta Quest 3:
- Put on the headset
- Settings β System β Developer β Enable USB Debugging
- Accept prompt when device connects to computer
Meta Quest Pro:
- Put on the headset
- Settings β System β Developer β Enable USB Debugging
- Accept security prompt
Verify Connection:
adb devices
# Should show: XXXXXXXXXXXXX device# SDK/API Configuration
android.minSdkVersion=24
android.targetSdkVersion=34
android.buildToolsVersion=34.0.0
# Support libraries
android.useAndroidX=true
android.enableJetifier=true
# OpenXR SDK location
openxr.sdk.path=../meta_sdk/ovr_openxr_mobile_sdk_78.0# Android SDK path (adjust based on installation location)
sdk.dir=/Users/YOUR_USERNAME/Library/Android/sdk
# Android NDK path (r25+)
ndk.dir=/Users/YOUR_USERNAME/Library/Android/sdk/ndk/25.0.8677664
# Optional: CMake path (if not in system PATH)
cmake.dir=/usr/local/Cellar/cmake/3.27.x/binFor Apple Silicon Macs (M1/Pro/Max):
# Add to ~/.zshrc (or ~/.bash_profile for Intel Macs)
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$PATH
export PATH=$ANDROID_HOME/platform-tools:$PATH
export PATH=$ANDROID_HOME/ndk/25.0.8677664/bin:$PATH
# Reload shell
source ~/.zshrc
# Verify installations
cmake --version # Should be 3.22+
gradle --version # Should be 7.0+
adb --version # Should workThis project was successfully developed and tested on:
| Component | Specification |
|---|---|
| Chip | Apple M1 Pro |
| Memory | 16 GB RAM |
| OS | macOS 26.3.1 (25D2128) |
| Architecture | ARM64 (Apple Silicon) |
| SDK | Android SDK API 34 |
| NDK | Android NDK r25+ |
| Build System | Gradle 7.0+ / CMake 3.22+ |
All C++ code is compiled with clang++ via CMake, with cross-compilation to ARM64/ARMv8 for Android NDK.
The application has been thoroughly tested and verified on:
| Device | Result | Notes |
|---|---|---|
| Meta Quest Pro | β Fully Working | Primary development device |
| Meta Quest 3 | β Fully Working | All features tested |
| Meta Quest 2 | β Compatible | Expected to work (runtime tested) |
All testing performed with proper USB debugging enabled and OpenXR validation layers.
quest_code_editor/
βββ android-app/ # Android application layer
β βββ app/ # Main app module
β βββ .gradle/ # Gradle build files
β βββ build/ # Build outputs
βββ src/main/cpp/ # C++ source code
β βββ editor/ # Text editing engine
β βββ openxr/ # OpenXR integration
β βββ rendering/ # Graphics and text rendering
β βββ ui/ # UI panel management
β βββ network/ # Network operations
β βββ parser/ # Syntax highlighting parser
β βββ io/ # File operations
βββ CMakeLists.txt # CMake build configuration
βββ README.md # This file
- Skia Graphics Engine - Vector graphics and text rendering
- Matrix Transformations - Proper coordinate system handling
- OpenXR Compositor - Frame composition and timing
- Modal Dispatcher - Routes input based on editor mode
- JNI Connectivity Bridge - Android connectivity status
- Gesture Recognition - VR controller input handling
- Persistent Storage - Device file access via Android APIs
- File Browser - Hierarchical navigation
- Command Terminal - Execute shell commands with output capture
# From project root
mkdir build && cd build
cmake ..
make# Unit tests for editor components
ctestFor local development and testing on your build machine (macOS, Linux, or Windows with appropriate toolchain):
# Clean build
./gradlew clean
# Build debug version
./gradlew assembleDebug
# Build release version (optimized)
./gradlew assembleRelease
# Run tests (if available)
./gradlew test
# Check for build issues without full build
./gradlew check# Build with Android NDK (for Quest deployment)
./gradlew build
# Build specific architecture
./gradlew build -Pbuild_arch=arm64-v8a
# Verbose output for debugging
./gradlew build --info# Connect Quest via USB and enable developer mode
adb devices # Verify device is connected
# Install debug build
./gradlew installDebug
# View live logs
adb logcat | grep quest_code_editor
# Uninstall from device
./gradlew uninstallDebug# Start CPU profiling (5 seconds)
adb shell am profile start --sampling 1000
# ... run your app ...
# Stop and dump profile
adb shell am profile stop --dump-on-exit
# View results
adb logcat | grep "Profiling"When developing on Apple M1/Pro/Max Macs, ensure:
# Verify architecture
uname -m # Should output: arm64
# CMake for native compilation
cmake --version # 3.22+
# Clang compiler
clang++ --version # Should use Apple Clang
# For Android NDK cross-compilation
export ANDROID_NDK_HOME=/path/to/android-ndk-r25
export ANDROID_HOME=/path/to/android-sdk| Component | Technology | Version |
|---|---|---|
| VR Platform | OpenXR | 0.1 |
| Graphics | Skia | Latest |
| Build System | CMake | 3.22+ |
| Native Development | Android NDK | r25+ |
| Android Framework | Android API | 24+ |
| Font Rendering | FreeType | 2.x |
| Compiler | Clang (Apple/LLVM) | Latest |
- Launch the App - Open Quest Code Editor on your Meta Quest device
- Navigation - Use controller to select and position panels
- Enter Insert Mode - Press trigger to start typing
- Modal Commands - Exit insert mode to execute Vim-style commands
ESC- Return to NORMAL modei- Enter INSERT modeh/j/k/l- Navigate in NORMAL mode:q!- Quit without saving:w- Save current file
- World Lock - Pin panels to world space
- Hand Relative - Attach panels to hand
- Pan/Zoom - Adjust panel size and position with gestures
- Open Terminal - Available in file explorer
- Command Execution - Type shell commands and execute
- Output Display - Real-time command output rendering
We welcome contributions! Please see CONTRIBUTING.md for guidelines.
- Fork the repository
- Create a feature branch:
git checkout -b feature/your-feature - Make your changes with clear commits
- Push to your fork:
git push origin feature/your-feature - Open a Pull Request with description of changes
Found a bug? Please open an issue with:
- Detailed description of the problem
- Steps to reproduce
- Device model and software version
- Relevant logs or screenshots
- π¨ UI/UX improvements and additional themes
- π Internationalization and localization
- π Documentation and tutorials
- π§ͺ Test coverage expansion
- π Bug fixes and optimization
- β Modal editing system
- β Syntax highlighting
- β File operations
- β Terminal integration
- β Network detection
- Advanced debugging integration
- Code completion engine
- Collaborative editing
- Custom themes
- Performance profiling tools
- Python REPL integration
- AI-assisted code suggestions
- Visual debugging
- Extended language support
I document the development journey on Medium and LinkedIn:
- Text Rendering Challenges - "FreeType vs Skia: Rendering Text in VR"
- Coordinate Systems - "OpenXR Spatial Positioning: A Deep Dive"
- Modal Editing - "Implementing Vim-Style Editing in VR"
- Architecture - "Building a VR IDE: Multi-Panel Design Patterns"
Read more on Medium | Follow on LinkedIn
Optimized for Quest 2/3 hardware:
| Metric | Target | Status |
|---|---|---|
| Frame Rate | 72 FPS | β Achieved |
| Memory Usage | <500MB | β Optimized |
| Text Render Time | <2ms | β Optimized |
| Startup Time | <3s | β Optimized |
- Verify OpenXR SDK is correctly installed
- Check Android API level compatibility (24+)
- Enable USB debugging and check device logs:
adb logcat
- Ensure proper matrix transformations in rendering pipeline
- Check coordinate system alignment with OpenXR frames
- Verify Skia font loading and cache
- Verify JNI bridge compilation
- Check controller pairing in Quest settings
- Review input dispatcher event routing
- Ensure app has
INTERNETpermission in manifest - Check ConnectivityManager JNI implementation
- Verify network is available on device
- Close unused panels to reduce render load
- Use world-locked panels for static content
- Limit syntax highlighting scope for large files
- Monitor memory usage in VR settings
This project is licensed under the Apache License 2.0 - see LICENSE file for details.
- Meta/Khronos - OpenXR specification and tools
- Google - Android NDK and development platform
- Skia Project - Graphics engine
- Flutter Community - Cross-platform development patterns
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Threads: xr.crafter
- LinkedIn: gearscrafter
Built with β€οΈ for the VR development community
β If you find this project useful, please consider giving it a star!