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-scoreboard in server.cfg.
  • If you run a fork with a different resource name, add it to the InitializeFramework() chain in bridge/server.lua — the file is unencrypted and every chain ends in an -- Add custom framework here branch.

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.key only 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() in client/functions.lua has been edited to return false, the board will never open.

IDs aren't showing above heads

Work through these in order:

  1. The board must be open — head IDs only render while you're holding the key.
  2. ShowIdOnHead must be on. Check /sbadmin, not just Config.Defaults — a saved in-game setting overrides the config file.
  3. The other player must be within Config.HeadIds.distance (default 50 units).
  4. With requireLos = true (the default), IDs are hidden through walls, vehicles and other geometry. Set it false to test.
  5. If CanShowHeadIds() in client/functions.lua returns false, 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/god on QBCore and QBox, admin/superadmin on ESX, the admin group on ox_core.
  • The command ACE 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.
  • RecentAdminOnly is true by default, so non-admins don't see the section on the board at all. It's not broken — it's hidden.
  • /dclist always 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

  • NotifyOnDrop must be on — check /sbadmin.
  • Alerts only go to admins, and never to the player who just left.
  • Confirm Config.Setup.notify matches a notification resource you actually run. If it's set to okok but 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.
  • UseEmotes must be on in /sbadmin, and Config.Emote.enable must be true.
  • If your emote resource uses different command names, change Config.Emote.start and stop.

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.