Opening and Closing#
Players open the scoreboard with Z. The key is registered through ox_lib as a FiveM key mapping, so each player can change it under Settings → Key Bindings → FiveM, where it is listed as Press key to toggle the ScoreBoard.
Option | Default | What it does |
|---|---|---|
|
| The default key, and the key that closes it again. |
|
| Seconds between two opens, so a spammed key cannot flood the server with requests. |
|
|
|
To close it, press Escape, the same key again, or the ESC button in the header. While the search box has the focus neither key closes it, so a name with a z in it can be typed freely — click outside the box, or use the button.
Every time it opens, it asks the server for a fresh snapshot, plays a short intro sound, and starts in the compact layout.
Compact and Full Screen#
The scoreboard has two layouts. The compact one is the header and the player list — enough to find someone's ID and get back to playing. Open Full Screen in the header turns it into a three-column dashboard; Minimize Menu brings it back.
Column | Panels | Shown in |
|---|---|---|
Left | Available Heists, then Job Progress | Full screen |
Centre | The header and the player list | Always |
Right | Server Overview, then Active Jobs | Full screen |
The header carries the logo, the server's name with a LIVE badge, the number of players online against the slot count, and the two buttons.
The Player List#
One row per online player: server ID, name, job with its icon, duty status and ping. Your own row is tagged YOU. The search box filters by name, job or ID at once, and clicking a column heading sorts by it — click again to reverse.
Ping#
Ping is shown as signal bars and a colour, so a lagging player stands out without reading numbers:
Ping | Bars | Colour |
|---|---|---|
Under 60 ms | 4 | Green |
60–119 ms | 3 | Yellow |
120–199 ms | 2 | Orange |
200 ms and over | 1 | Red |
Names#
Option | Default | What it does |
|---|---|---|
|
| Shows each player's FiveM name. |
|
| Replaces every name with |
|
| The label shown while names are hidden. |
Jobs#
A job reaches the list in two steps. First it must be in Config.DisplayablePlayerJobs — anyone whose job is not on that list shows Config.DefaultJobName (Unknown) instead. Then Config.PlayerJobs gives it a label and an icon:
Config.DisplayablePlayerJobs = { "miner", "police", "ambulance", "mechanic", "truck_driver" }
Config.PlayerJobs = {
police = {
label = "Police Officer", -- shown in the list
gradeExport = "Recruit", -- text added after the label, or nil
icon = "fa-solid fa-shield" -- Font Awesome icon
},
}Both use the job's name as the framework stores it (police, truck_driver). A displayed job with no Config.PlayerJobs entry still shows, with its name capitalised and a question-mark icon. gradeExport is plain text appended to the label — every player with that job shows the same words — so leave it nil unless you want a fixed title.
Config.DisplayablePlayerJobsalso decides what is counted. The police count behind the heist cards, the duty badges and the Active Jobs numbers only see jobs on this list — add every job you want to appear anywhere.
Duty status#
Players whose job is listed in Config.DisplayedJobs carry an On Duty or Off badge. Where it comes from is set per job by playerDutyExport:
playerDutyExport | Badge |
|---|---|
| Asks your job script, player by player — see Keybinds and Exports. |
|
|
| Always Off. |
Server Overview#
In full screen, the right column opens with three animated counters:
Counter | Shows |
|---|---|
Online | Players connected against the slot count, with a fill bar. |
Capacity | Your slot count: |
Peak | The number in |
Active Jobs#
Under the overview, one card per profession shows how many players are working it, with a bar measured against the busiest job. The cards come from Config.DisplayedJobs, in order:
truck_driver = {
order = 8, -- position in the list
label = "Truck Drivers", -- name on the card
icon = "fa-solid fa-truck", -- Font Awesome icon
onDutyExport = { resource = "qs-truckjob", fn = "getOnDutyCount" },
playerDutyExport = { resource = "qs-truckjob", fn = "isPlayerOnDuty" },
},onDutyExport | The number on the card |
|---|---|
| Whatever that export returns — the players actually on shift. |
| Every online player with that job, on shift or not. |
The key (truck_driver) is the job's name in your framework. The shipped list covers police, paramedics, mechanics, taxi drivers, electricians, fishers, firefighters and truck drivers. Exports are called safely: if the resource is stopped or the export does not exist, the card shows 0 and nothing breaks.
Police and Heists#
The left column lists your robberies as image cards, each Available or Locked depending on how many officers are online. The panel's title shows the current police count, and every card shows it against the number that card needs, with a bar.
Counting police#
Option | Default | What it does |
|---|---|---|
|
| Jobs counted as police. Add your sheriff or state police jobs here. |
|
| Leave it |
Police are counted when they are online with a police job; the count does not check whether they are on shift. Each police job must also be in Config.DisplayablePlayerJobs.
Heist cards#
Each entry of Config.IllegalActions is one card:
fleeca = {
order = 4, -- position in the list
minimumPolice = 1, -- officers needed to unlock it
label = "FLEECA", -- name on the card
image = "fleeca.png", -- background picture
description = "..." -- kept for reference; not shown on the card
},Five pictures ship with the interface — store.png, liquor.png, jewelry.png, fleeca.png and pacific.png — and the shipped cards need:
Card | Officers needed |
|---|---|
Store Robbery | 1 |
Liquor Shop | 1 |
Jewelry | 1 |
Fleeca | 1 |
Pacific | 10 |
The cards are information only. They tell players what is worth trying right now; your heist scripts still enforce their own police requirement.
Job Progress#
With Config.ShowJobLevels = true, the player sees their own level in each Quasar job they have played, highest level first. Every card shows the level, the experience earned against the experience that level needs, a percentage, and a bar whose colour steps up through five tiers:
Levels | Tier |
|---|---|
1–2 | Recruit |
3–4 | Officer |
5–7 | Sergeant |
8–12 | Captain |
13+ | Elite |
The panel sits under the heists in full screen, and only appears when the player has at least one job on record.
When it refreshes#
Levels are read from the database for everyone online two seconds after the resource starts, then every Config.UpdateJobExperienceTime minutes (5). The scoreboard shows the last reading, so a level gained a minute ago — or a player who joined since — appears on the next one.
Matching the experience curve#
The experience a level needs is worked out the same way the job scripts do it:
needed = math.floor(baseExperience * growthFactor ^ (level - 1))Config.JobsProgress holds each job's two numbers, and they must match the Config.LevelExperience in that job's own config. If they drift apart the level stays right, but the bar and the percentage do not.
Config.JobsProgress = {
["MINER"] = { baseExperience = 3500, growthFactor = 1.1 }, -- qs-minerjob
["TAXI DRIVER"] = { baseExperience = 1000, growthFactor = 1.1 }, -- qs-taxijob
-- ...
}A job missing from the list falls back to 1000 and 1.1. The twelve supported jobs and the tables they are read from are listed in Installation.
Colours and Texts#
Colours#
Config.DefaultConfigs tints the interface. It is sent to each player a couple of seconds after they load in:
Key | Default | Colours |
|---|---|---|
|
| The accent colour. |
|
| Titles and subtitles. |
|
| Icon backgrounds. |
The background1, background2, bodyBackground and logo keys remain in the file from earlier versions; the current interface does not read them.
Texts and translation#
The interface texts live in Config.Translations, so translating the scoreboard means editing one table. Job labels, Active Jobs cards and heist names come from their own tables above.
Keys | Where they appear |
|---|---|
| The header: your server's name and its LIVE badge. |
| The player list's column headings. |
| The search box and the duty badges. |
| The header buttons. |
| The heists panel's title. |
| The server overview and the Active Jobs cards. |
| Job names in the Job Progress panel. |
A few short labels are fixed in English: YOU, Available, Locked, Active Jobs, Job Progress, No players found and the word online in the header counter.



