Thank you for your interest in contributing! This guide will help you get started.
- Code of Conduct
- How Can I Contribute?
- Development Setup
- Coding Standards
- Submitting Changes
- Mod Contributions
This project follows the Contributor Covenant Code of Conduct. By participating, you are expected to uphold this code.
- Use the Bug Report issue template
- Include your Quest model, game version, and modloader version
- Attach relevant logs (
UEModLoader.log) and crash dumps (tombstones) - Describe steps to reproduce
- Use the Feature Request template
- Explain the use case and why it benefits the community
- Modloader core (C++) — new Lua bindings, hook improvements, performance
- Lua mods — new mods or improvements to existing ones
- Tools — deploy script improvements, new utilities
- Documentation — wiki pages, API docs, examples
- Wiki improvements and new pages
- Code comments and docstrings
- Example mods with detailed explanations
| Tool | Version | Purpose |
|---|---|---|
| Android NDK | r23c (23.1.7779620) | ARM64 cross-compilation |
| CMake | 3.22+ | Build system |
| Ninja | latest | Build executor |
| Python | 3.8+ | Deploy tools |
| ADB | latest | Device communication |
| Meta Quest | 2/3/Pro | Target device (rooted) |
# Clone the repo
git clone --recursive https://github.com/xAstroBoy/quest-ue4-modloader.git
cd quest-ue4-modloader
# Set your NDK path
export NDK=/path/to/android/ndk/23.1.7779620 # Linux/macOS
set NDK=C:\Android\ndk\23.1.7779620 # Windows
# Build
cd modloader
./build.sh # Linux/macOS
.\build.bat # Windows# Push to device
python tools/deploy.py all
python tools/deploy.py launch
# Check logs
python tools/deploy.py log
# Interactive testing
python tools/deploy.py console
> exec_lua return "hello"- Standard: C++17
- Style: K&R braces, 4-space indent
- Naming:
snake_casefor functions/variables,PascalCasefor classes - Headers: Include guards (
#pragma once) - Memory: No raw
new/delete— use RAII,std::unique_ptr, or stack allocation - Error handling: No exceptions (
-fno-exceptions). Use return codes and null checks. - Logging: Use
LOG_INFO/LOG_WARN/LOG_ERRORmacros - All UObject access via reflection API (never raw pointer offsets for game objects)
- Style: 4-space indent,
snake_casefor locals,PascalCasefor API functions - Safety: Always wrap UObject calls in
pcall() - Hooks: Use separate
pcallblocks for independent operations - Properties: Use
obj:Get()/obj:Set()— never raw memory for UObject fields - TArray: Remember 1-based indexing
- Documentation: Header comment with version, description, changelog
- Standard: Python 3.8+
- Style: PEP 8, 4-space indent
- Dependencies: Minimal (stdlib only for deploy tools)
- Fork the repository
- Create a branch from
main:git checkout -b feature/my-feature # or git checkout -b fix/my-bugfix - Make your changes following the coding standards
- Test on a real Quest device if possible
- Commit with clear, descriptive messages:
feat: add FVector math operators to LuaUStruct fix: crash in ProcessEvent hook when UObject is GC'd docs: add TArray usage examples to wiki mod: add InfiniteStamina mod example - Push and open a Pull Request against
main - Fill out the PR template completely
<type>: <short description>
[optional body with more detail]
[optional footer with breaking changes or issue refs]
Types: feat, fix, docs, mod, tools, refactor, test, ci, chore
- Create your mod in
mods/<ModName>/main.lua - Include a descriptive header comment with:
- Version number
- What the mod does
- How it works (hooks used, etc.)
- Use
ModConfigfor any persistent settings - Register with
SharedAPI.DebugMenuif the mod has toggleable features - Test thoroughly on device
- Submit a PR with:
- The mod files
- A brief description in the PR
- Any PAK files needed (keep them small)
- All UObject access uses reflection (
Get/Set/Call) - Critical calls wrapped in
pcall - Separate
pcallblocks for independent operations -
ModConfigused for persistent settings - Debug menu integration (if applicable)
- Clean logging with mod name tag
- No hardcoded memory offsets for game objects
- Tested on device
Thank you for contributing! 🎮