Radial Menu
A settings and customisation layer for the ox_lib radial menu. Players drag entries into the order they want, hide the ones they never use, add their own command shortcuts, and pick an accent colour — all saved per character.
Read the ox_lib patch step below before installing. jj-radial replaces ox_lib's radial frontend rather than sitting alongside it. Without the patch it loads without errors but does nothing visible.
What this is (and isn't)
jj-radial registers no radial entries of its own. Every item in the menu still comes from your other resources calling lib.addRadialItem() or lib.registerRadial(). What jj-radial replaces is the rendering and customisation layer on top.
That means:
- Your existing radial entries keep working untouched — no migration, no re-registering.
- Reordering and hiding apply to the root menu only. Submenu contents are passed through exactly as the owning resource defined them.
- The keybind is still ox_lib's (
F1by default), not jj-radial's.
Requirements
| Resource | Required | Notes |
|---|---|---|
ox_lib | Yes | Must be patched — see below |
oxmysql | Yes | Stores per-character settings |
| A framework | Yes | qb-core, qbx_core or es_extended — auto-detected |
Install
- Drop
jj-radialinto your resources folder. - Add it to
server.cfg, after ox_lib and oxmysql:
ensure ox_lib
ensure oxmysql
ensure jj-radial
- Apply the ox_lib patch (next section).
- Restart. The database table is created automatically — there is no SQL file to import.
No items, no images, no SQL import. The jj_radial_settings table creates itself on first boot.
The ox_lib patch (required)
Stock ox_lib draws its radial with its own bundled React UI. jj-radial can't intercept that, so one ox_lib file has to be pointed at jj-radial instead.
The file is:
ox_lib/resource/interface/client/radial.lua
It is plain Lua — not part of ox_lib's compiled web bundle, so nothing needs rebuilding. Replace it with the patched copy supplied with jj-radial, then restart ox_lib and jj-radial.
The patch changes three things:
- Rendering is delegated to
exports['jj-radial']:Render(data)instead ofSendNUIMessage. - Focus is handed to
exports['jj-radial']:SetFocus(state). - The keybind checks
GetRadialSettings().holdModeso the hold-vs-toggle setting works.
Every ox_lib update overwrites this file. Re-apply the patch after each ox_lib upgrade, or the radial silently reverts to the stock UI and all jj-radial customisation appears to stop working. Verified against ox_lib 3.32.3.
Because patched ox_lib calls exports['jj-radial'], do not stop jj-radial on a live server — the radial menu breaks server-wide for every resource that uses it, not just for jj-radial. Restart both together.
Verifying the patch worked
Open your radial in-game. You should see the jj-radial ring — icons on a circle with a centre close button, and a settings cog.
If you instead see ox_lib's stock radial, the patch didn't take. The clearest symptom is the Customize tab in /radialsettings permanently reading "Open your radial menu first to see available items." even after you've opened the radial — jj-radial never received the item list because ox_lib never called it.
Folder name
The folder must stay named jj-radial. The NUI calls back to https://jj-radial/... in several places and the ox_lib patch calls exports['jj-radial']. Renaming it breaks every button in the settings panel with no error message.
First run
- Open your radial —
F1unless you've rebound it. - Click the cog, or run
/radialsettings. - On the Customize tab, drag an entry to reorder it, or use the eye icon to hide one.
- On General, pick an accent colour and toggle labels or hold-mode.
There is no Save button — every change writes immediately and is restored on your next login.
Next: Configuration.