Moving to Lumo UI
For a full step-by-step install per framework (QBCore, Qbox, ESX, standalone), see Installation. This page is the reference for the shims and the notify/HUD/radial details.
Lumo UI takes over jobs that several resources used to do. The [compat] folder keeps your other scripts working without edits: each shim has the same name as the resource it replaces and forwards its exports and events to lumo-ui.
| Shim | Replaces | Keeps working |
|---|---|---|
qb-target | qb-target, qtarget | exports['qb-target']:*, exports.qtarget:*, qb-target:client:* |
qb-menu | qb-menu | exports['qb-menu']:openMenu/closeMenu/showHeader, qb-menu:client:openMenu/closeMenu |
qb-input | qb-input | exports['qb-input']:ShowInput |
qb-radialmenu | qb-radialmenu | exports['qb-radialmenu']:AddOption/RemoveOption, open/close events |
progressbar | progressbar | exports['progressbar']:Progress*, progressbar:client:*, QBCore.Functions.Progressbar |
esx_notify | esx_notify | ESX.ShowNotification, ESX:Notify (ESX only) |
esx_progressbar | esx_progressbar | ESX.Progressbar, exports.esx_progressbar:Progressbar/CancelProgressbar (ESX only) |
esx_textui | esx_textui | ESX.TextUI, ESX.HideUI, ESX:TextUI / ESX:HideUI (ESX only) |
lumo-hud-ui | earlier Lumo HUD | exports['lumo-hud-ui']:* used by older Lumo products |
Steps
- Back up
resources/andserver.cfg. - Stop the old resources. Remove or comment out their
ensurelines and move their folders out ofresources/(a shim and the original cannot both exist: FiveM refuses two resources with one name). Usually:qb-hud,qb-target(orqtarget),qb-menu,qb-input,qb-radialmenu,progressbar, and on ESXesx_notify. - Ensure lumo-ui, then the shims you need (see the README).
- Restart the whole server once. After that,
/uirestart(admins) restarts lumo-ui and the shims in the right order.
Only ensure the shims for resources you actually removed. A server without qb-input has no use for the qb-input shim.
Notifications per framework
QBCore — make
QBCore.Functions.Notifyhand over to lumo-ui. Inqb-core/client/functions.lua, at the top ofQBCore.Functions.Notify:luaif GetResourceState('lumo-ui') == 'started' then return exports['lumo-ui']:Notify(text, texttype, length, icon) endQBCore:Notify(server → client) goes through the same function.Qbox — qbx_core sends notifications through ox_lib. To have lumo-ui draw them, edit
Notifyinqbx_core/client/functions.luaandqbx_core/server/functions.lua(exact lines in INSTALLATION.md → Qbox); otherwise ox_lib keeps drawing them and nothing breaks.ESX — ensure the
esx_notifyshim (and remove the original). ESX Legacy callsexports.esx_notify:Notifyfor everyESX.ShowNotification. Theesx_progressbarandesx_textuishims do the same forESX.ProgressbarandESX.TextUI.Standalone — call
exports['lumo-ui']:Notify(...)or triggerlumo-ui:client:notify.
HUD
- Status bars. QBCore/Qbox: read from player metadata and the
hud:client:UpdateNeeds/UpdateStressevents, as qb-hud did. ESX: fromesx_status(hunger, thirst; stress if you add it). Anything else:exports['lumo-ui']:SetStatus('hunger', 80). - Stress is stored in
metadata.stress(QBCore/Qbox),setMeta('stress')(ESX) or a player state bag (standalone).hud:server:GainStressandRelieveStresswork as before. Jobs inHud.Stress.WhitelistedJobsgain none. - Fuel with
Hud.Fuel = 'auto': theGetFuelexport of LegacyFuel, cdn-fuel, ps-fuel, lc_fuel or qb-fuel, then the vehicle'sfuelstate bag (ox_fuel), then the game's own fuel level. - Seatbelt, cruise, harness, nitrous: the
seatbelt:client:*andhud:client:*events from qb-hud and qb-smallresources are handled. - Minimap shapes. Circle and square masks are drawn from the game's own textures. If you stream your own
squaremap/circlemaptextures, list them inHud.RadarMaskTextures.
Radial menu
Items from your old qb-radialmenu/config.lua go into LumoUiConfig.Radial.Items (same fields) or JobItems (by job name). Scripts that call exports['qb-radialmenu']:AddOption(...) keep working through the shim; their items are removed when the calling resource stops.
The built-in vehicle menu (seats, engine, doors, extras) shows while you are seated. If your server opens doors from the target eye instead, set VehicleMenu = { Seats = true, Engine = false, Doors = false, Extras = true }.
Target
PolyZone is not needed for lumo-ui's zones. Keep PolyZone if other scripts use it directly. While the eye is open, zone centres are marked (Target.ZoneMarkers). Admins can run /targetdebug to add test options to every ped, vehicle and object.
What resets
Player /ui choices (preset, layout, minimap mode) are saved per resource, so moving from the old Lumo HUD or qb-hud starts players on LumoUiConfig.PlayerDefaults once.
Going back
Stop lumo-ui and the shims, put the original resources back, restore your server.cfg. Nothing in the database is changed by lumo-ui except the stress value it shares with qb-hud.