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
| Key | Default | What it does |
|---|---|---|
debug | false | Prints 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
| Key | Default | What it does |
|---|---|---|
key | 'U' | Default hold key. Players can rebind it themselves in FiveM's keybind settings. |
refresh | 3000 | How 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
| Key | Default | What it does |
|---|---|---|
distance | 50.0 | Furthest distance (in units) an ID will render above a head. |
requireLos | true | Hide IDs when the player is behind a wall. Set false to see them through geometry. |
height | 0.5 | How far above the head bone the ID is drawn. |
scanRate | 500 | How 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
| Key | Default | What it does |
|---|---|---|
enable | true | Play 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
| Key | Default | What it does |
|---|---|---|
maxRecentShown | 12 | Disconnect rows shown on the held board. The full log is always available via /dclist. |
maxRecentStored | 100 | Hard cap on retained disconnects, so a mass drop can't grow the list without bound. |
playersPerColumn | 30 | Players 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.
| Key | Default | What it does |
|---|---|---|
showNamesToAll | false | Let regular players see other players' names. |
showCharIdToAll | false | Let 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
| Command | Default | Access | What it does |
|---|---|---|---|
admin | /sbadmin | Admin | Opens the in-game settings editor. |
recent | /dclist | Admin | Opens 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.
| Key | Default | What it does |
|---|---|---|
ShowIdOnHead | true | Draw player IDs above nearby heads while the board is open. |
UseEmotes | true | Play the configured emote while the board is open. |
RecentMinutes | 10 | How long a disconnect stays in the recent list. Clamped to 1–120. |
NotifyOnDrop | true | Notify online admins when somebody disconnects. |
RecentAdminOnly | true | Restrict 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
| Function | What 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
| Function | What 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.