A vkQuake fork that replaces Quake's menu and HUD systems with a modern HTML/CSS UI layer powered by RmlUI. UI documents are hot-reloadable, scriptable with Lua, and fully overridable by mods. Ships with LibreQuake (BSD-licensed) as the base game content.
Declarative UI — Menus and HUD written in RML (HTML dialect) and RCSS (CSS dialect), not C code
- 50+ real-time data bindings connect engine state (health, weapons, armor, powerups) directly to UI elements
- Two-way cvar sync for settings menus — sliders, toggles, and dropdowns stay in sync with the console
- Hot reload with
ui_reloadandui_reload_css— iterate on UI without restarting the engine - Built-in RmlUI debugger for inspecting the DOM and styles in real time
Lua Scripting — Add interactive behavior to any UI document without touching C++
- Engine bridge API exposes game state, cvars, console commands, and per-frame callbacks
- Full DOM manipulation — create elements, query selectors, set inline styles, toggle classes
- Lua-backed data models that sync with RML data bindings
- Scripts hot-reload alongside documents
Custom Reticle Elements — Procedural crosshairs built from <reticle-dot>, <reticle-line>, <reticle-ring>, and <reticle-arc> primitives
- 7 animatable RCSS properties (radius, gap, length, width, stroke, start/end angle)
- Weapon-reactive animations driven by RCSS transitions or Lua controllers
Post-Process Pipeline — UI composited as a separate render layer with configurable effects
- Barrel warp, chromatic aberration, helmet display echo
- HUD inertia — spring-damped bounce and sway responding to player movement
- Normal or additive blending modes
Mod-Friendly — Mods override menus, HUD, styles, fonts, and scripts via standard Quake directory precedence
- Fonts auto-discovered from
<mod>/ui/fonts/at startup and on mod switch - Menu title auto-derived from mod directory name
- Example mod included (
ui_lab) with a terminal visor HUD
Vulkan Enhancements — Beyond upstream vkQuake
- Batched texture uploads, GPU timestamp instrumentation
VK_KHR_synchronization2andVK_KHR_dynamic_renderingsupport
Arch Linux:
sudo pacman -S cmake meson ninja sdl2 vulkan-devel glslang freetype2 luaUbuntu / Debian:
sudo apt install build-essential cmake meson ninja-build \
libvulkan-dev vulkan-sdk libsdl2-dev libfreetype-dev liblua5.3-dev \
libvorbis-dev libopus-dev libopusfile-dev libflac-dev libmad0-devmacOS:
brew install cmake meson ninja sdl2 molten-vk vulkan-headers glslang freetype luagit clone --recurse-submodules https://github.com/bradenleague/vkQuake-RmlUi.git
cd vkQuake-RmlUi
make setup # check deps, init submodules, download LibreQuake PAK files
make run # build and launchTo run with a mod:
make run MOD_NAME=ui_lab| Command | Description |
|---|---|
make |
Build everything (release) |
make run |
Build and launch (MOD_NAME= to select mod) |
make smoke |
Build and run for ~20 frames (CI smoke test) |
make engine |
Rebuild engine only |
make setup |
First-time setup (deps, submodules, PAK files) |
make meson-setup |
Wipe and reconfigure meson |
make clean |
Remove build artifacts |
make distclean |
Remove build + downloaded assets |
Mods are directories at the project root, following the standard Quake convention. To create one:
- Create a directory (e.g.
mymod/) - Add UI overrides under
mymod/ui/— RML documents, RCSS stylesheets, Lua scripts, and fonts - Run with
make run MOD_NAME=mymodor./build/vkquake -game mymod
The engine searches <mod>/ui/ first, falling back to the base ui/ directory. Fonts in <mod>/ui/fonts/ are loaded automatically.
For a working example, see the ui_lab/ mod and its README.
UI files are runtime assets — edit and reload without rebuilding:
| Console Command | Purpose |
|---|---|
ui_reload |
Hot reload all RML + RCSS from disk |
ui_reload_css |
RCSS-only reload (preserves DOM state) |
ui_debugger |
Toggle the RmlUI visual debugger |
| Guide | Contents |
|---|---|
| RMLUI_INTEGRATION | Input handling, menu stack, data binding, event dispatch |
| DATA_CONTRACT | Engine-to-UI data flow, all 50+ binding definitions |
| LUA_SCRIPTING | Lua API reference, engine bridge, example scripts |
| MOD_UI_GUIDE | How to bundle custom UI with a mod |
| CVAR_BINDINGS | Two-way cvar sync reference |
| POST_PROCESS | Post-process pipeline, HUD inertia physics |
- Engine + integration code: GPL v2 (see LICENSE)
- RmlUI: MIT License
- LibreQuake: BSD License
See THIRD_PARTY_NOTICES.md for details.