Troubleshooting
The issues that actually come up, and what causes them. If none of these match, turn on Config.Setup.debug and check both consoles — then jump into Discord.
"no supported framework found" on boot
The script checks for es_extended, qbx_core, qb-core and ox_core, in that order, and errors if it finds none.
- Confirm your framework is actually started before
jj-scoreboardinserver.cfg. - If you run a fork with a different resource name, add it to the
InitializeFramework()chain inbridge/server.lua— the file is unencrypted and every chain ends in an-- Add custom framework herebranch.
The keybind does nothing
- Check FiveM → Settings → Key Bindings → FiveM and look for "Hold to show player list". If it's unbound, bind it there.
Config.Keybind.keyonly sets the default for players who have never bound it. Changing it will not move an existing player's binding — that's how FiveM's keybind system works.- If
CanOpenBoard()inclient/functions.luahas been edited to returnfalse, the board will never open.
IDs aren't showing above heads
Work through these in order:
- The board must be open — head IDs only render while you're holding the key.
ShowIdOnHeadmust be on. Check/sbadmin, not justConfig.Defaults— a saved in-game setting overrides the config file.- The other player must be within
Config.HeadIds.distance(default 50 units). - With
requireLos = true(the default), IDs are hidden through walls, vehicles and other geometry. Set itfalseto test. - If
CanShowHeadIds()inclient/functions.luareturnsfalse, they're suppressed regardless of everything above.
Players only see IDs, no names
That's the default, and it's deliberate. Config.Privacy.showNamesToAll and showCharIdToAll are both false, so regular players get an ID-only list while admins see everything.
Set either to true in config/config.lua if you want everyone to see them.
"You are not authorized" on /sbadmin or /dclist
You aren't being recognised as an admin. Access is granted by any one of:
- Framework permissions —
admin/godon QBCore and QBox,admin/superadminon ESX, theadmingroup on ox_core. - The
commandACE permission. - An identifier in
Config.Setup.admins.
The most reliable fix is the third. Add your identifier to config/config.lua and restart:
admins = {
['ABC12345'] = true,
},Use the right identifier for your framework: citizen ID on QBCore and QBox, the full char1:... identifier on ESX, charId on ox_core. A citizen ID pasted into an ESX server will never match.
The disconnect list is always empty
- Entries expire after
RecentMinutes(default 10). If nobody has left in that window, the list is genuinely empty. RecentAdminOnlyistrueby default, so non-admins don't see the section on the board at all. It's not broken — it's hidden./dclistalways shows the full retained log for admins, regardless of the board setting.
Disconnects are labelled wrong
Reasons are classified by matching the raw drop text: anything containing crash, timed out or timeout becomes crashed; anything containing kick or ban becomes kicked; everything else is logged out.
If your admin menu phrases things differently ("removed from the server", say), edit ClassifyDisconnect() in server/functions.lua and add your own matches. It's unencrypted and it's the only place that decides the label.
Admin disconnect alerts aren't appearing
NotifyOnDropmust be on — check/sbadmin.- Alerts only go to admins, and never to the player who just left.
- Confirm
Config.Setup.notifymatches a notification resource you actually run. If it's set tookokbut you don't have okokNotify, nothing will display.
The clipboard emote doesn't play
- An emote resource must be running — rpemotes, rpemotes-reborn, dpemotes or scully_emotemenu. Without one this is skipped silently by design.
UseEmotesmust be on in/sbadmin, andConfig.Emote.enablemust betrue.- If your emote resource uses different command names, change
Config.Emote.startandstop.
Head IDs are costing frames
Raise Config.HeadIds.scanRate first — rebuilding the nearby-player list is the expensive part, not drawing the text. Going from 500 to 1000 halves that cost and is barely noticeable in play.
After that, lower Config.HeadIds.distance. Note the cost only exists while somebody is holding the board open — there is no idle cost.
Changing the UI theme
html/style.css is unencrypted. The palette is driven by the variables at the top of the file:
:root {
--teal: #13eaba;
--grey: #828686;
--bg: rgba(12, 14, 14, 0.92);
}One exception: editing grid-template-rows on .players has no effect — it's overwritten at runtime from Config.Board.playersPerColumn. Change the config value instead.
Still stuck? Turn on Config.Setup.debug, reproduce the issue, and bring both console outputs to Discord — it's far faster than describing the symptom.