Configuration

Everything lives in config/config.lua, which ships unencrypted and commented throughout. Settings marked editable in-game can also be changed live via /sbadmin without touching the file or restarting.

💡

Anything saved through the in-game editor is stored server-side and overrides the matching value in Config.Defaults from then on. Treat the config file as your starting point and the editor as your day-to-day tuning.

Config.Setup

KeyDefaultWhat it does
debugfalsePrints diagnostic lines to the console. Leave off in production.
notify'ox_lib'Notification system. Options: lation_ui, ox_lib, esx, qb, okok, sd-notify, wasabi_notify, custom.
admins{}Extra admin identifiers, on top of your framework's own permissions and the command ACE.

Config.Keybind

KeyDefaultWhat it does
key'U'Default hold key. Players can rebind it themselves in FiveM's keybind settings.
refresh3000How often (ms) an open board asks the server for fresh data.
⚠️

Changing key only affects players who have never bound the keybind. Anyone who already played keeps their existing binding — that's FiveM's behaviour, not the script's.

Config.HeadIds

KeyDefaultWhat it does
distance50.0Furthest distance (in units) an ID will render above a head.
requireLostrueHide IDs when the player is behind a wall. Set false to see them through geometry.
height0.5How far above the head bone the ID is drawn.
scanRate500How often (ms) the nearby-player list is rebuilt. IDs still draw every frame — this only controls the scan.
💡

If head IDs cost you frames on a full server, raise scanRate before you lower distance — the scan is the expensive part, not the drawing.

Config.Emote

KeyDefaultWhat it does
enabletruePlay an emote while the board is held open.
start'e clipboard'Command run when the board opens.
stop'e c'Command run when the board closes.

If no emote resource is running, this is skipped silently — nothing errors and nothing is logged.

Config.Board

KeyDefaultWhat it does
maxRecentShown12Disconnect rows shown on the held board. The full log is always available via /dclist.
maxRecentStored100Hard cap on retained disconnects, so a mass drop can't grow the list without bound.
playersPerColumn30Players listed per column before a new column starts. Applied to the UI at runtime.

Config.Privacy

Admins always see names and character IDs. These two control what everybody else sees.

KeyDefaultWhat it does
showNamesToAllfalseLet regular players see other players' names.
showCharIdToAllfalseLet regular players see other players' character IDs.
💡

Both false gives you the classic ID-only board. Leaving them off is also the privacy-safe default — players can't harvest a list of every character ID on your server.

Config.Commands

CommandDefaultAccessWhat it does
admin/sbadminAdminOpens the in-game settings editor.
recent/dclistAdminOpens the full disconnect log, with character IDs and raw drop reasons.

Both names are configurable — change the value and the command changes with it.

Config.Defaults

Starting values for everything the in-game editor controls. All five are editable in-game via /sbadmin.

KeyDefaultWhat it does
ShowIdOnHeadtrueDraw player IDs above nearby heads while the board is open.
UseEmotestruePlay the configured emote while the board is open.
RecentMinutes10How long a disconnect stays in the recent list. Clamped to 1–120.
NotifyOnDroptrueNotify online admins when somebody disconnects.
RecentAdminOnlytrueRestrict the recent-disconnect list on the board to admins.

Discord logging

logs.lua ships unencrypted and is off by default. To switch it on:

Logs.Service = 'discord'

Logs.Events = {
    crashed  = true,
    kicked   = true,
    logout   = false,
    settings = true
}

Logs.Discord = {
    name   = 'Scoreboard Logs',
    link   = 'https://discord.com/api/webhooks/...',
    image  = '',
    footer = ''
}

Each event is independently toggleable. With Logs.Service = 'none' or an empty link, nothing is ever sent anywhere.

Customising behaviour

Two files are left unencrypted specifically for you to edit.

client/functions.lua

FunctionWhat it's for
CanOpenBoard()Return false to block opening the board.
CanShowHeadIds()Return false to hide head IDs. Runs alongside the in-game setting — both must allow it.
OnBoardOpened() / OnBoardClosed()Fire your own logic when the board opens or closes.
ShowNotification(message, type, title)Every notification the script shows, from either side.

server/functions.lua

FunctionWhat it's for
CanRequestBoard(source)Return false to refuse board data for that player.
ClassifyDisconnect(reason)Turns a raw drop reason into crashed, kicked or logout. Edit the matches if your server phrases kicks differently.
OnPlayerDisconnected(entry)Fires on every drop with the full entry — hook your own logging here.
💡

html/style.css is unencrypted too. The whole theme comes from the --teal, --grey and --bg variables at the top of the file.

Localisation

Every user-facing string — notifications, command help and the entire UI — is localised. Seven languages ship out of the box: en, es, fr, de, pt-br, pl, it.

ox_lib picks the right file from your convar_locale setting. To add another, copy locales/en.json to your language code and translate the values — nothing else needs changing.

Next: Troubleshooting.