QBCoreQBoxESX

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 (F1 by default), not jj-radial's.

Requirements

ResourceRequiredNotes
ox_libYesMust be patched — see below
oxmysqlYesStores per-character settings
A frameworkYesqb-core, qbx_core or es_extended — auto-detected

Install

  1. Drop jj-radial into your resources folder.
  2. Add it to server.cfg, after ox_lib and oxmysql:
ensure ox_lib
ensure oxmysql
ensure jj-radial
  1. Apply the ox_lib patch (next section).
  2. 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 of SendNUIMessage.
  • Focus is handed to exports['jj-radial']:SetFocus(state).
  • The keybind checks GetRadialSettings().holdMode so 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

  1. Open your radial — F1 unless you've rebound it.
  2. Click the cog, or run /radialsettings.
  3. On the Customize tab, drag an entry to reorder it, or use the eye icon to hide one.
  4. 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.