Before You Begin#
Before installing Job Center, make sure your server meets the requirements. Only one resource is mandatory; everything else is optional and detected on its own.
Requirement | Status | Notes |
|---|---|---|
| Required | Loaded by the manifest. The resource does not start without it. |
Framework | Recommended | ESX, QBCore or Qbox — auto-detected. Without one it runs in a standalone test mode. |
Target | Optional |
|
| Optional | Draws that prompt when no target is in use. |
Inventory | Optional | Only for the boss tablet item. The |
Smartphone | Optional |
|
Everything framework- or target-specific sits behind a small bridge file, and the resource picks the right one by looking at what is already running:
Layer | Looks for |
|---|---|
Framework |
|
Target |
|
Prompt |
|
Every optional integration degrades silently: if a resource is missing, that part falls back and nothing errors. Integrations has the details and how to pin one by hand.
github.comReleases · overextended/ox_libA FiveM resource and script library for Lua and JS.Downloading Job Center#
After purchasing Job Center, the resource is automatically linked to your CFX Portal account.
Sign in to the CFX Portal using the same account used during checkout, open Granted Assets, and download Job Center.
After extracting the download, you should have the following folder:
qs-jobcenter/
├── shared/config.lua -- every setting and every job listing
├── locales/ -- 28 languages
├── client/custom/ -- framework and target bridges (editable)
├── server/custom/ -- framework bridges, Discord logs, phone bridge (editable)
├── client/ · server/ -- the core (protected)
├── html/ -- the interface
└── fxmanifest.luaThe folder must be named
qs-jobcenter. The interface calls the resource by that name, and a renamed copy is caught at start: the console printsYou have renamed the script!and the server stops responding until the original name is restored.
Installing the Resource#
Move the qs-jobcenter folder into your server's resources directory. It can live anywhere inside it, including a category folder:
resources/
└── [qs]/
└── qs-jobcenter/Once copied, open your server.cfg and make sure every dependency — and everything it should detect — starts before Job Center:
ensure ox_lib
# Framework — one of them
ensure es_extended
# ensure qb-core
# ensure qbx_core
# Inventory, target and prompt (optional)
ensure ox_inventory
ensure ox_target
# ensure qb-target
# ensure qs-textui
ensure qs-jobcenterThe loading order matters. Detection only sees resources that are already started, so a framework or target that starts after Job Center is not found: the framework falls back to standalone and the clerk to the E prompt.
The Database#
There is no SQL file to import, and Job Center does not use oxmysql. The listings live in shared/config.lua, and the job a player is hired into is saved by your framework, the same way as any other job change.
Application chats are kept in the server's memory, not in a table:
What | Kept until |
|---|---|
Every chat thread and its messages | The resource or the server restarts, or a boss closes that application. |
What each boss has already read | The resource or the server restarts. |
Replies waiting for an offline applicant | The applicant's next login, or a restart. |
Plan restarts around it: a server restart starts every application conversation fresh. A player who was already hired keeps the job — that lives in your framework.
The Boss Tablet Item#
The boss tablet opens the boss panel from the inventory — the same panel as /jobchats. It is optional: skip this section if the command is enough, and set Config.UseBossItem = false.
The item is registered as usable through your framework, under the name in Config.BossItem (boss_tablet by default). Add it to your inventory:
In ox_inventory/data/items.lua:
['boss_tablet'] = {
label = 'Boss Tablet',
weight = 500,
stack = false,
close = true,
consume = 0,
description = 'A special tablet for managing job applications and employee communications.',
client = {
image = 'boss_tablet.png',
},
},consume = 0 keeps the tablet in the inventory after it is used.
In qs-inventory/shared/items.lua:
['boss_tablet'] = {
['name'] = 'boss_tablet',
['label'] = 'Boss Tablet',
['weight'] = 500,
['type'] = 'item',
['image'] = 'boss_tablet.png',
['unique'] = false,
['useable'] = true,
['shouldClose'] = true,
['combinable'] = nil,
['rare'] = 'common',
['description'] = 'A special tablet for managing job applications and employee communications.'
},In qb-core/shared/items.lua:
boss_tablet = {
name = 'boss_tablet',
label = 'Boss Tablet',
weight = 500,
type = 'item',
image = 'boss_tablet.png',
unique = false,
useable = true,
shouldClose = true,
combinable = nil,
description = 'A special tablet for managing job applications and employee communications.'
},ESX keeps its items in the database. Run once:
INSERT INTO `items` (`name`, `label`, `weight`, `rare`, `can_remove`) VALUES
('boss_tablet', 'Boss Tablet', 500, 0, 1);This is the only SQL Job Center ever needs, and only for ESX's item list.
The picture, boss_tablet.png, comes with the download in the [img] folder. Copy it into your inventory's images folder:
Inventory | Images folder |
|---|---|
ox_inventory |
|
qs-inventory |
|
qb-inventory |
|
esx_inventoryhud |
|
Hand it out like any other item — your framework's /giveitem <id> boss_tablet 1, a shop, or a boss menu.
Holding the tablet is not enough. The panel only opens for a player whose current job and grade are listed as a boss of that job — see Who is a boss. Anyone else sees
You can't use this item.
Configuring the Resource#
Everything is configured in one unencrypted file, shared/config.lua:
Setting | Contents |
|---|---|
| The language — any of the 28 files in |
| Console messages for detection, translations and Discord logs. |
| Auto-detected. Pin them by hand when needed. |
| The clerk: model, position and the prompt text. |
| The map blip. |
| The two ways into the boss panel, each with its own switch. |
| The categories in the sidebar. |
| Every listing. |
| Discord logging. |
The values worth reviewing first:
Config.Language = 'en' -- ar · bg · ca · cs · da · de · el · en · es · fa · fr · hi · hu · it
-- ja · ko · nl · no · pl · pt · ro · ru · sl · sv · th · tr · zh-CN · zh-TW
Config.JobCenterPed = {
model = 'a_f_y_business_01',
coords = vector4(-268.95, -956.13, 31.22, 204.35), -- x, y, z, heading
label = 'Open Job Center', -- the target option and the prompt
}
Config.UseBossCommand = true
Config.BossCommand = 'jobchats'
Config.UseBossItem = true
Config.BossItem = 'boss_tablet'The shipped listings are examples. Each key in
Config.Jobsmust be the job's name in your framework, and itsbossGradesmust match that job's grades. Usage explains both — read it before going live.
Verifying the Installation#
For the first start, set Config.Debug = true and restart the server. The console says what was picked for each layer:
[Quasar Jobcenter]: Found matching dependency: es_extended with ID: esx
[Quasar Jobcenter]: Found matching dependency: ox_target with ID: ox_target
[Quasar Jobcenter]: [Quasar Jobcenter] Server loaded translations for language: enNo matching dependencies found means nothing was found for that layer — the framework runs standalone, or the clerk uses the prompt. If you do run that resource, move it above ensure qs-jobcenter. Set Config.Debug back to false when you are done.
Then join your server and work through the first loop:
Visit the clerk
The Job Center blip — a briefcase — marks the clerk downtown. Use the target option, or stand next to the clerk and press
E. The window opens on All Jobs.Take an instant job
Open a listing that hires on the spot for a job your framework has —
garbageorbuson a stock QBCore server — and press Apply for Job.You have been hired as …appears and your job changes.Send an application
Open a chat listing — Police Officer by default — press Apply for Job or the chat icon, and send a message.
Answer it as a boss
On a character with a boss grade of that job, type
/jobchats. The applicant is in the list with an unread count: open the thread and reply, and the applicant is notified.
Changes to
shared/config.luaapply afterrestart qs-jobcenter— and that restart also clears every open application chat.



