> ## Documentation Index
> Fetch the complete documentation index at: https://docs.awokenlabs.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Configuration

> Everything the menu shows, how it looks, how it sounds, and what it does to the rest of your UI.

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

```lua config.lua theme={"dark"}
Config.openKeys = { 200, 199 }   -- 200 is ESC, 199 is P
```

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.

```lua config.lua theme={"dark"}
Config.PlayerInformation = {
    showServerId = true,

    portrait = {
        enabled = true,
        timeoutMs = 5000,
        fallback = 'initials',   -- 'initials' or 'silhouette'
        zoom = 1.08,
    },

    job = {
        enabled = true,
        showGrade = true,
        showDuty = false,
    },

    currencySymbol = '$',
    currencyPosition = 'before',
}
```

<Note>
  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.
</Note>

### Balances

Cash and bank are on by default. Dirty money is off, because the frameworks disagree about what it even is.

```lua config.lua theme={"dark"}
dirtyMoney = {
    enabled = true,
    label = 'DIRTY',
    type = 'item',           -- 'account' or 'item'
    account = 'black_money',
    item = 'markedbills',
    colour = '#D9738F',
},
```

<Warning>
  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.
</Warning>

## The bottom line

`Config.Footer` is the street, the clock, and how long they have played.

```lua config.lua theme={"dark"}
Config.Footer = {
    showLocation = true,
    showGameTime = true,
    showSessionTime = true,
    showTotalPlaytime = true,

    sessionFormat = 'clock',      -- 'clock', 'compact' or 'hours'
    totalFormat = 'compact',

    playtimeScope = 'character',  -- 'character' or 'account'
    playtimeSaveMinutes = 5,
}
```

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.

## 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:

```lua config.lua theme={"dark"}
Config.Menu = {
    custom = {
        { id = 'rules',   label = 'Rules',   action = { type = 'command', command = 'rules' } },
        { id = 'discord', label = 'Discord', action = { type = 'link', url = 'https://discord.gg/awokenlabs' } },
    },
}
```

<Warning>
  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.
</Warning>

`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.

<Note>
  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.
</Note>

The address has to start with `http://` or `https://`. Anything else is refused by the game before it reaches a browser.

<Warning>
  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.
</Warning>

## Theme

Every value here becomes a CSS variable when the menu opens, so a change needs a restart and nothing more.

```lua config.lua theme={"dark"}
Config.Theme = {
    accent = '',                  -- blank reads the awoken:primaryColor convar
    gradientColour = '#000000',
    gradientStrength = 1.0,
    gradientWidth = 34,           -- percent of screen width
    portraitSize = 68,
    uiScale = 1.0,
    animationSpeed = 1.0,
    reducedMotion = false,
}
```

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

```lua config.lua theme={"dark"}
Config.Sounds = {
    enabled = true,
    open    = { enabled = true, name = 'SELECT',         set = 'HUD_FRONTEND_DEFAULT_SOUNDSET' },
    move    = { enabled = true, name = 'NAV_LEFT_RIGHT', set = 'HUD_FRONTEND_DEFAULT_SOUNDSET' },
    confirm = { enabled = true, name = 'SELECT',         set = 'HUD_FRONTEND_DEFAULT_SOUNDSET' },
    back    = { enabled = true, name = 'BACK',           set = 'HUD_FRONTEND_DEFAULT_SOUNDSET' },
    denied  = { enabled = true, name = 'NO',             set = 'HUD_FRONTEND_DEFAULT_SOUNDSET' },
}
```

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.

<Note>
  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.
</Note>

## 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.

<Note>
  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](/resources/awoken-pausemenu/exports) for what to change it to, and for `client/hooks.lua`, which is where a HUD of your own goes.
</Note>

## Language

Nine languages ship in `locales/`. `Config.locale` picks one.

```lua config.lua theme={"dark"}
Config.locale = 'en'   -- en, de, es, fr, it, nl, pl, pt, tr
```

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.
