config.lua. Anything missing from it reads as the shipped default rather than as off, so a config carried over from an older version keeps working after an update.
Only what a server genuinely chooses is in there. Hiding the HUD, blocking ox_inventory, the world blur and the exit row have no setting because there was never a sensible reason to turn one off.
Opening the menu
config.lua
199 if you would rather bind P to something of your own, and it stops doing either.
What the player sees
Config.PlayerInformation drives the block in the top left. Every field is its own switch, and anything switched off, or that your framework cannot answer, takes its separator with it. Turn it all off and you are left with PAUSED and the character name.
config.lua
The portrait is rendered from the player’s own ped, so it follows their clothes and model without anything being stored.
zoom is the only value worth nudging: 1 is the texture exactly as the game drew it, higher pushes in on the face.Balances
Cash and bank are on by default. Dirty money is off, because the frameworks disagree about what it even is.config.lua
The bottom line
Config.Footer is the street, the clock, and how long they have played.
config.lua
playtimeScope of character counts per citizen id, which on a roleplay server is the number people actually mean. account counts everything one player does across all their characters.
Menu options
Resume, Map, Settings and Exit are built in. A default install also ships a Rules and a Discord row, which are ordinary custom options and the two worth editing first:config.lua
type is command, client, server, export or link. Custom options are added after Settings, so Exit stays last whatever you add.
A link opens the address in the player’s own browser and puts it on their clipboard at the same time. It is the one type that leaves the menu open: it shows a short confirmation under the options instead, since closing would take that away before anybody read it. closeAfter does not apply to a link.
The game shows the player its own “do you want to open this link?” prompt first, unless the domain is one of the handful it trusts by default:
cfx.re, fivem.net, redm.net and the Rockstar and Take-Two ones. A Discord invite is not among them, so expect that prompt. It is FiveM’s anti-phishing guard, there is no way to skip it, and there should not be. The clipboard copy is why somebody who dismisses it still ends up with the address.http:// or https://. Anything else is refused by the game before it reaches a browser.
Theme
Every value here becomes a CSS variable when the menu opens, so a change needs a restart and nothing more.config.lua
Sound
config.lua
Input
Keyboard and mouse, with nothing to configure. Arrow keys or W and S move, Enter selects, Escape goes back, and the mouse does what you would expect.Controller is not supported, and that is a deliberate trade. Only Lua can read a pad, and only while the game is still receiving input, which means every other resource is receiving it too. Supporting a pad would mean an inventory or emote menu on a hotkey could open over the pause menu. Taking the keyboard off the game entirely is worth more than pad navigation, so that is what it does.
The rest of your UI
None of this is configurable, because none of it has a downside worth a switch. The menu hides the game HUD, minimap, weapon, help text and notifications while it is open, and blurs the world behind it with the game’s own screen blur, the same one the stock pause menu uses. All of that is done per frame, so nothing persistent is written and there is nothing to restore: a HUD something else had already hidden stays hidden. ox_inventory is handled too. The menu setsLocalPlayer.state.invBusy, which is what ox_inventory’s own keybind checks before it opens, and clears it again only if this menu was what set it.
A HUD drawn in its own NUI is a different browser page in a different resource, so no native reaches it. Those have to be asked in their own words, and the menu does that for every HUD with a published API. Today that is jg-hud.
qb-hud, ps-hud and their forks expose no API at all and hide themselves on
IsPauseMenuActive(), which never becomes true once this resource is running. Nothing this menu can do reaches them, so they need one line changed on their side. See Exports and events for what to change it to, and for client/hooks.lua, which is where a HUD of your own goes.Language
Nine languages ship inlocales/. Config.locale picks one.
config.lua
en.lua. Every key in it has to exist, because the interface is handed a single table and a missing key draws nothing rather than falling back to English.