Skip to content

Configuration

config/main.lua — setup, features, message types, tags, commands, and 3D tuning.

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#

lua
debug = 4,
checkVersion = true,
OptionDefaultWhat it does
debug4Console verbosity (1–4). Use 1 on a live server unless troubleshooting.
checkVersiontrueWarns on startup if a newer release exists.

General#

OptionDefaultWhat it does
locale'en'UI and notify language — see Locales
timestampFormat'en-US'Message timestamp locale (en-GB, tr-TR, de-DE, …)
messageCooldown500Anti-spam delay in ms between messages (0 = off)
proximityDistance22.5Range in metres for proximity messages
useServerProximitytrueServer picks nearby targets (safer than client-only filtering)
proximityCatchUptrueRe-deliver active proximity messages to players who enter range later
maxMessageSize200Max messages kept on a client (0 disables pruning — not recommended)
maxMessageLength256Truncate longer messages (0 = no limit)

proximityCatchUp only applies when useServerProximity is true.


Feature toggles#

OptionDefaultWhat it does
enableOOCtrueEnable /ooc
oocProximitytrueOOC is local; set false for global OOC
enablePMtrueEnable /pm
enableSongtrueEnable /song YouTube player
songCooldown5000Ms between song changes (0 = off)
enableImagetrueEnable /img proximity images
imageCooldown5000Ms between image posts (0 = off)
typingIndicatortrue3D typing dots while chat is open
systemPrintsfalsePipe server prints into chat (avoid on production)
startWithSlashfalsePrefill / when chat opens
maskDetectiontrueMasked players show as Anonymous on me/do
enableHookstrueAllow other resources to block opening chat
typeWriter3Dtrue3D text appears letter by letter
notificationtrueAllow notification sound (players can still toggle it)
conversationModetrueOwn messages vs others layout (supported themes)
showServerIdtrueAppend [id] to the author name

Keybinds#

lua
keybinds = {
    open = 'T',
},
OptionDefaultWhat it does
keybinds.open'T'Default key for open_chat. Players can change it in FiveM settings.

Message types#

lua
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' },
},
FieldPurpose
colorHex color for the type badge / styling
labelOptional override; otherwise locale messageTypes.* is used
hideAuthorHide the author line (typical for system)
show3DShow 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#

lua
durations = {
    default = {
        ['3d'] = 7500,
        ['text'] = 7500,
    },
    -- ['me'] = { ['3d'] = 7500, ['text'] = 10000 },
},
KeyMeaning
3dHow long the world bubble stays (ms)
textHow 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#

lua
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' },
        },
    },
},
OptionWhat it does
tags.enabledMaster switch for author tags
job.enabled / ace.enabledToggle each source
job.autoDetectIf the job is not in data, invent a tag from the job name
job.data / ace.datalabel + 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#

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

  1. Copy locales/en.json to locales/xx.json (e.g. tr.json).
  2. Translate the strings.
  3. Set locale = 'xx' in config.

Translation files are JSON. Keys cover client defaults, message type labels, server errors, command suggestions, and UI copy.