Editable settings live in config/main.lua. Open the file and change only what you need — this page is the short reference.
Escrow-open / editable areas also include ltbridge/, modules/tag/server.lua, and shared/__types.lua.
Setup#
debug = 4,
checkVersion = true,
| Option | Default | What it does |
|---|---|---|
debug | 4 | Console verbosity (1–4). Use 1 on a live server unless troubleshooting. |
checkVersion | true | Warns on startup if a newer release exists. |
General#
| Option | Default | What it does |
|---|---|---|
locale | 'en' | UI and notify language — see Locales |
timestampFormat | 'en-US' | Message timestamp locale (en-GB, tr-TR, de-DE, …) |
messageCooldown | 500 | Anti-spam delay in ms between messages (0 = off) |
proximityDistance | 22.5 | Range in metres for proximity messages |
useServerProximity | true | Server picks nearby targets (safer than client-only filtering) |
proximityCatchUp | true | Re-deliver active proximity messages to players who enter range later |
maxMessageSize | 200 | Max messages kept on a client (0 disables pruning — not recommended) |
maxMessageLength | 256 | Truncate longer messages (0 = no limit) |
proximityCatchUp only applies when useServerProximity is true.
Feature toggles#
| Option | Default | What it does |
|---|---|---|
enableOOC | true | Enable /ooc |
oocProximity | true | OOC is local; set false for global OOC |
enablePM | true | Enable /pm |
enableSong | true | Enable /song YouTube player |
songCooldown | 5000 | Ms between song changes (0 = off) |
enableImage | true | Enable /img proximity images |
imageCooldown | 5000 | Ms between image posts (0 = off) |
typingIndicator | true | 3D typing dots while chat is open |
systemPrints | false | Pipe server prints into chat (avoid on production) |
startWithSlash | false | Prefill / when chat opens |
maskDetection | true | Masked players show as Anonymous on me/do |
enableHooks | true | Allow other resources to block opening chat |
typeWriter3D | true | 3D text appears letter by letter |
notification | true | Allow notification sound (players can still toggle it) |
conversationMode | true | Own messages vs others layout (supported themes) |
showServerId | true | Append [id] to the author name |
Keybinds#
keybinds = {
open = 'T',
},
| Option | Default | What it does |
|---|---|---|
keybinds.open | 'T' | Default key for open_chat. Players can change it in FiveM settings. |
Message types#
defaultMessageType = 'system',
messageTypes = {
['system'] = { color = '#dc2626', hideAuthor = true },
['ooc'] = { color = '#666666', show3D = true },
['me'] = { color = '#C5374F', show3D = true },
['do'] = { color = '#d97706', show3D = true },
['pm'] = { color = '#44ABC5' },
['admin'] = { color = '#dc2626' },
['game'] = { color = '#5C9094', show3D = true },
['image'] = { color = '#7c3aed', show3D = false },
-- custom = { color = '#dc2626', label = 'Custom Override' },
},
| Field | Purpose |
|---|---|
color | Hex color for the type badge / styling |
label | Optional override; otherwise locale messageTypes.* is used |
hideAuthor | Hide the author line (typical for system) |
show3D | Show a world bubble when the message is proximity-based |
Do not remove the built-in types. Change colors freely; add custom keys for scripts that send those types via exports.
Labels for defaults come from locales/*.json → messageTypes.
Durations#
durations = {
default = {
['3d'] = 7500,
['text'] = 7500,
},
-- ['me'] = { ['3d'] = 7500, ['text'] = 10000 },
},
| Key | Meaning |
|---|---|
3d | How long the world bubble stays (ms) |
text | How long the chat line stays focused / visible (ms) |
Add a named entry under durations (same key as a message type) to override the defaults for that type only.
Tags#
tags = {
enabled = true,
job = {
enabled = true,
autoDetect = false,
data = {
['police'] = { label = 'LSPD', color = '#3b82f6' },
['ambulance'] = { label = 'EMS', color = '#c41d1d' },
['mechanic'] = { label = 'Mechanic', color = '#f59e0b' },
},
},
ace = {
enabled = true,
data = {
['chat.admin'] = { label = 'Admin', color = '#ef4444' },
},
},
},
| Option | What it does |
|---|---|
tags.enabled | Master switch for author tags |
job.enabled / ace.enabled | Toggle each source |
job.autoDetect | If the job is not in data, invent a tag from the job name |
job.data / ace.data | label + color per job name or ACE principal |
Players need the matching ACE (e.g. add_principal identifier.license:… chat.admin) for ACE tags to apply.
Commands#
commands = {
['ooc'] = 'ooc',
['me'] = 'me',
['do'] = 'do',
['pm'] = 'pm',
['clear'] = 'clear',
['song'] = 'song',
['img'] = 'img',
['announcement'] = 'announcement',
},
Change the right-hand string to rename the in-game command. Announcement ACE is always command.<that name> (for example renaming to announce → command.announce).
3D tuning#
threeD controls bubble height, screen offsets, and render intervals (dynamicOpacity, dynamicScale, worldZ, screenY, distInterval, losInterval, renderInterval, renderIntervalIdle).
Leave the defaults unless you know you need different performance or positioning. Comments in config/main.lua describe each field.
Locales#
Set locale to a file key under locales/. The package ships en (locales/en.json).
To add another language:
- Copy
locales/en.jsontolocales/xx.json(e.g.tr.json). - Translate the strings.
- Set
locale = 'xx'in config.
Translation files are JSON. Keys cover client defaults, message type labels, server errors, command suggestions, and UI copy.