Skip to main content
Everything lives in 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
Both keys open and close the menu, and both back out of the map and settings screens. Drop 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
ESX keeps a black_money account, so type = 'account' is right there. QBCore and QBox have no such account and use marked bills instead, so on those you must set type = 'item' or the line reads zero forever.

The bottom line

Config.Footer is the street, the clock, and how long they have played.
config.lua
Total playtime is the only thing in the resource that touches the database. It creates its own table on first start, counts in memory, and writes on that interval plus once when a player leaves. Nothing is written per tick. 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. 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
Both ship with a placeholder. Rules runs /rules, so on a server with no such command it does nothing at all and says nothing about it. Point them at your own command and your own invite, or delete the rows.
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.
The address has to start with http:// or https://. Anything else is refused by the game before it reaches a browser.
A server entry fires a net event. That is your event and your choice, but the handler still has to validate what it receives. This resource cannot know what yours does.

Theme

Every value here becomes a CSS variable when the menu opens, so a change needs a restart and nothing more.
config.lua
The fade colour is deliberately separate from the accent. The accent marks the selected row, and a screen tinted with it would drown that out.

Sound

config.lua
These are the game’s own frontend sounds, so no audio file ships and none is needed. There is no volume setting because the native takes no volume. Choosing a quieter sound is how you make it quieter.

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 sets LocalPlayer.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 in locales/. Config.locale picks one.
config.lua
Adding one is a copy of 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.