Troubleshooting Guide
Common issues and solutions for Oxide Menu.
Table of Contents
- Installation Issues
- Menu Display Issues
- Styling Issues
- Event Issues
- Input/Interactive Issues
- Performance Issues
- Legacy Compatibility Issues
- FAQ
Installation Issues
Menu resource not found
Symptom: Error in console: No such export openMenu in resource oxide-menu
Solutions:
- Ensure the resource is started in
server.cfg:ensure oxide-menu - Check the resource folder name is exactly
oxide-menu - Ensure it starts after qb-core:
ensure qb-core ensure oxide-menu - Run
refreshthenensure oxide-menuin console
NUI not loading
Symptom: Menu opens but shows blank/broken UI
Solutions:
-
Clear FiveM cache:
%localappdata%/FiveM/FiveM.app/data/cache/Delete contents of this folder
-
Verify all files exist:
oxide-menu/ ├── html/ │ ├── index.html │ └── css/ │ ├── variables.css │ ├── animations.css │ └── main.css -
Check F8 console for NUI errors
QBCore not found
Symptom: Error: attempt to index a nil value (global 'QBCore')
Solutions:
- Ensure qb-core starts first in server.cfg
- Verify qb-core is working properly
- Check fxmanifest.lua has correct dependency
Menu Display Issues
Menu not appearing
Symptom: Export called but nothing shows
Solutions:
-
Check if data is valid:
local menuData = { ... } print('Menu data:', json.encode(menuData)) exports['oxide-menu']:open(menuData) -
Check for empty items:
-- This won't show: exports['oxide-menu']:open({ items = {} }) -- Need at least one item: exports['oxide-menu']:open({ items = {{ label = 'Test' }} }) -
Check for script errors in F8 console
-
Verify NUI focus:
-- Menu sets focus automatically, but check if another resource stole it SetNuiFocus(false, false) -- Reset first exports['oxide-menu']:open(...)
Menu stuck open
Symptom: Can't close menu, mouse trapped
Solutions:
-
Force close via console:
exports['oxide-menu']:close() -
Reset NUI focus:
SetNuiFocus(false, false) -
Check for script errors that might prevent close callback
Menu position wrong
Symptom: Menu appears in wrong location
Solutions:
-
Check config:
Config.Position = 'right' -- left, center, right -
Check per-menu override:
exports['oxide-menu']:open({ position = 'left', -- Overrides config items = { ... } })
Styling Issues
Wrong theme showing
Symptom: Theme doesn't match config
Solutions:
-
Check config.lua:
Config.Theme = 'oxide' -- oxide, dark, light -
Clear cache and restart
-
Verify theme exists in
html/css/variables.css
Colors not updating
Symptom: CSS changes not visible
Solutions:
-
Clear FiveM cache (NUI assets are cached aggressively)
-
Check correct file: Changes should be in
html/css/variables.css -
Check CSS syntax: Invalid CSS silently fails
-
Force refresh: Disconnect and reconnect to server
Icons not showing
Symptom: Missing icons, broken images
Solutions:
-
Font Awesome icons:
- Use correct format:
fas fa-icon(not justfa-icon) - Ensure Font Awesome CDN is accessible
- Use correct format:
-
QBCore item icons:
- Verify item exists in
QBCore.Shared.Items - Check qb-inventory has the image file
- Verify item exists in
-
Custom icons:
- Use
nui://protocol:nui://resource/path/image.png - External URLs are blocked for security
- Use
-
Check icon validation:
-- This is blocked: { icon = 'https://external.com/icon.png' } -- Use this instead: { icon = 'nui://my-resource/icons/custom.png' }
Event Issues
Event not triggering
Symptom: Click item, nothing happens
Solutions:
-
Check event name matches:
-- Menu item { label = 'Test', event = 'myResource:testEvent' } -- Handler (must match exactly) AddEventHandler('myResource:testEvent', function(args) print('Received!') end) -
Check if security is blocking:
-- If ValidateEvents is true, event must be whitelisted Config.Security = { ValidateEvents = true, AllowedClientEvents = { 'myResource:testEvent' }, } -
Enable debug mode to see blocked events:
Config.Debug = true -- Check console for: [oxide-menu] Blocked client: ... -
Verify event type:
-- Client event (RegisterNetEvent NOT needed) { event = 'client:event' } -- Server event (needs RegisterNetEvent on server) { serverEvent = 'server:event' }
Server event not received
Symptom: Server handler never fires
Solutions:
-
Register the event:
-- Server-side RegisterNetEvent('myResource:serverEvent', function(args) local src = source print('Received from', src) end) -
Use serverEvent, not event:
-- Correct: { serverEvent = 'myResource:serverEvent' } -- Wrong (this is client-only): { event = 'myResource:serverEvent' } -
Check security whitelist:
Config.Security = { ValidateEvents = true, AllowedServerEvents = { 'myResource:serverEvent' }, }
Args not passed correctly
Symptom: Args are nil or wrong
Solutions:
-
Check args format:
-- Menu { serverEvent = 'test', args = { item = 'water', count = 5 } } -- Handler receives the table directly RegisterNetEvent('test', function(args) print(args.item) -- 'water' print(args.count) -- 5 end) -
Args must be JSON-serializable:
-- This won't work (function can't serialize): { event = 'test', args = { callback = function() end } }
Input/Interactive Issues
Checkbox not updating
Symptom: Click checkbox, state doesn't change
Solutions:
-
Listen for the event:
AddEventHandler('oxide-menu:client:checkboxChange', function(index, checked, item) print(item.label, 'is now', checked) end) -
Check item type:
{ type = 'checkbox', label = 'Option', checked = false }
Slider not working
Symptom: Can't drag slider or no updates
Solutions:
-
Listen for the event:
AddEventHandler('oxide-menu:client:sliderChange', function(index, value, item) print(item.label, '=', value) end) -
Check item format:
{ type = 'slider', label = 'Volume', min = 0, max = 100, value = 50 }
Input not submitting
Symptom: Press Enter, nothing happens
Solutions:
-
Listen for the event:
AddEventHandler('oxide-menu:client:inputSubmit', function(index, value, item) print('Submitted:', value) end) -
Ensure Enter key pressed (not just clicking away)
Keyboard navigation not working
Symptom: Arrow keys don't work
Solutions:
-
Not focused on input: Arrow keys work for menu navigation, not when typing in input field. Press Escape to unfocus input.
-
Menu must be open: Navigation only works with active menu
-
Check for NUI focus issues: Another resource may have stolen focus
Performance Issues
Menu slow to open
Symptom: Noticeable delay when opening
Solutions:
-
Reduce item count: Very large menus (100+) may be slow
-
Disable sounds:
Config.Sound = { enabled = false } -
Disable animations in CSS: Edit
html/css/animations.cssto reduce or remove animation duration -
Check for script errors causing delays
Laggy scrolling
Symptom: Scrolling through items stutters
Solutions:
-
Reduce item count in single menu
-
Use submenus to split large menus
-
Check other resource performance impact
Legacy Compatibility Issues
Scripts using qb-menu exports
Symptom: Script using exports['qb-menu'] doesn't work
Solution:
Update the export name in your scripts:
-- Change from:
exports['qb-menu']:openMenu(...)
-- To:
exports['oxide-menu']:openMenu(...)
The menu data format stays the same - only the export name needs to change.
Legacy menu looks different
Symptom: Old menus have new styling
Expected behavior: Oxide Menu applies its styling to all menus. This is not a bug.
Solutions:
- This is intentional - modern styling for all menus
- Customize theme in
variables.cssif needed - Functionality is preserved, only appearance changes
Action functions not executing
Symptom: Menu with function actions doesn't work
Solutions:
-
Check function is defined correctly:
{ header = 'Action', action = function() -- Function, not string print('Hello') end } -
Check params format:
{ header = 'Action', params = { isAction = true, event = function(args) print(args.test) end, args = { test = 'value' } } }
FAQ
Can I use oxide-menu alongside qb-menu?
Not recommended. They serve the same purpose. Choose one and migrate fully.
Do I need to update my existing scripts?
Yes, you need to change the export name from 'qb-menu' to 'oxide-menu'. The menu data format (headers, items, params) stays the same.
How do I add custom fonts?
- Add font import to
html/index.html - Update
--font-familyinhtml/css/variables.css
Why is my search not showing?
Search only appears when:
Config.Search.enabled = true(global setting)- Menu has >=
Config.Search.minItemsitems (default 6) - Menu doesn't have
searchable = false
How do I disable all animations?
Config.Animation = {
enabled = false,
duration = 0,
type = 'slide'
}
How do I make menus wider?
Config.Width = 400 -- Default is 320
Can I have multiple menus open?
No. Opening a new menu closes the previous one. Use submenus for nested navigation.
Why are external icons blocked?
Security feature. External URLs could track users or load malicious content. Use nui:// protocol for custom images.
Getting Help
If your issue isn't covered here:
- Check F8 console for errors
- Enable debug mode (
Config.Debug = true) - Review the documentation linked in README
- Check for resource conflicts with other NUI-based resources