QBCore vs ESX vs Qbox: Choosing a FiveM Framework
QBCore vs ESX vs Qbox, compared on maturity, ecosystem, docs and migration path - and why server-side validation matters more than the framework you pick.
Roby Einstein
FairShieldAC Security Team

All three are actively developed open-source frameworks, and the honest answer to QBCore vs ESX vs Qbox is that the choice moves your script ecosystem and migration cost far more than it moves your security. QBCore runs on qb-core, ESX Legacy on es_extended, Qbox on qbx_core after starting as a QBCore fork. Pick on ecosystem, docs and team familiarity, then spend the time you saved on server-side validation in your own resources - all three will happily run an exploit you wrote yourself.
Every claim below is checked against each project's own documentation and public repositories on 2026-08-18. Where a primary source states nothing, the table says not verified.
What QBCore, ESX and Qbox actually are
QBCore comes from the qbcore-framework organisation, which describes itself as "an organization that provides open source code for the FiveM community". Core resource: qb-core, with documentation covering installs, permissions, the core object, player data and function references.
ESX today means ESX Legacy. The official repository is esx-framework/esx_core, the "Official Repo For core resources for esx-legacy". Core resource: es_extended, which the docs call "the main script for the ESX Framework", handling commands, callbacks, money and jobs.
Qbox is the newest. Its docs call it "a FiveM roleplay framework created on September 27, 2022" and state: "Starting as a QBCore fork, its goal was improving upon QBCore while maintaining backwards compatibility." Core resource: qbx_core, dependencies oxmysql, ox_lib and ox_inventory.
A detail few comparisons mention: the qb-core README credits ESX and its original author alongside Joshua Eger under GPL v3 or later, and the LICENSE shipped with qbx_core still carries the es_extended header. One family tree, three branches.
QBCore vs ESX vs Qbox compared
Only cells confirmable from official documentation or a project repository are filled in. A not verified cell marks a gap in what the sources publish.
| Property | QBCore | ESX | Qbox |
|---|---|---|---|
| Core resource | qb-core | es_extended | qbx_core |
| GitHub organisation | qbcore-framework | esx-framework | Qbox-project |
| Licence as published in repo | GPL-3.0 | not verified | GPL-3.0, LICENSE carries the es_extended header |
| Stated origin | README header credits ESX and Joshua Eger | Core resources for esx-legacy | Started as a QBCore fork, created September 27, 2022 |
| Public documentation site | docs.qbcore.org | docs.esx-framework.org | docs.qbox.re |
| Documented dependencies | not verified | not verified | oxmysql, ox_lib, ox_inventory |
| Inventory | Ships its own inventory resource | Ships its own inventory; CustomInventory setting documented | ox_inventory is a listed dependency |
| QB script compatibility | Native | Not applicable | Yes in most cases, via bridge; enableBridge default true |
| Documented migration guide | not verified | not verified | Yes, docs.qbox.re/converting |
| Database requirement documented | not verified | not verified | MariaDB, minimum 10.9.0; XAMPP not supported |
| txAdmin recipe published | Yes, txAdminRecipe repo pinned on the org | not verified | Yes, txAdminRecipe repo pinned and listed in install docs |
| Public repo activity, checked 2026-08-18 | Commits within the previous two months | Commits within the previous two months | Commits within the previous two months |
| Relative performance | not verified | not verified | not verified |
| Market share or user counts | not verified | not verified | not verified |
That activity row contradicts two claims repeated often in framework threads: that ESX is abandoned, and that QBCore has stopped. All three organisations showed public commits inside the previous two months on the day I checked.
Qbox vs QBCore: what the fork relationship actually means
The Qbox FAQ answers compatibility with "Yes (in most cases)", through a bridge exposed as the enableBridge convar, default true. It also names where compatibility ends: resources using undocumented or improper methods will not work unmodified.
Compatibility layer with documented breaking changes is accurate; drop-in replacement oversells it. The bridge makes evaluation cheap - boot a test server and see what breaks. Convars worth knowing first, from the Qbox convars page:
| Convar | Documented description | Default | Set with |
|---|---|---|---|
| enableBridge | Enables or disables the qb-core bridge for compatibility with QBCore resources | true | setr |
| bucketLockdownMode | Sets entity lockdown mode for bucket 0 | inactive | set |
| allowMethodOverrides | Enables or disables the ability of resources to override existing methods in player object | true | set |
| disableOverrideWarning | Enables or disables warning from resources overriding existing methods in player object | false | set |
| setjob_replaces | Controls if the /setjob command replaces or adds a job to a player | true | set |
| max_jobs_per_player | Sets the maximum number of jobs a player can have with the built-in multijob | 1 | set |
allowMethodOverrides is the row to notice: it decides whether third-party resources may replace methods on the player object, and disableOverrideWarning decides whether you hear about it - a cheap way to see what a paid script does at runtime.
Migrating from QBCore to Qbox: what actually breaks
The Qbox converting guide is the most concrete migration document of the three, and it names its own friction points.
- Grades change type. Job and gang grades are numbers in Qbox, strings in QBCore, converted in qbx_core/shared/jobs.lua and qbx_core/shared/gangs.lua.
- The core object is gone. Data now comes from "a combination of export functions and imported modules", so QBCore.Functions calls need rewriting.
- The database changes. Back up, convert for ox_inventory, run the SQL adding a last_logged_out column and changing the citizenid collation.
- Configs change. server.cfg, ox.cfg, permissions.cfg and voice.cfg all need updating.
- No single cutover needed. The docs state both can be used at the same time, so convert partially or over time.
- MariaDB, not XAMPP. The installation page documents a MariaDB minimum of 10.9.0 and states XAMPP is not supported.
The security angle: your framework sets defaults, your resources set exposure
No framework wins this part: all three expose money, inventory, job and permission mutations through networked events a cheat client can trigger. Cfx.re's Secure Your Events documentation puts it plainly: "Cheats can allow the client to trigger events in any context."
What protects you is server-authoritative value derivation: the server decides how much money moves, what a job pays, and whether the player was near the coordinates that make the payout legitimate. The docs agree: "Make sure to retrieve all values using server-side methods", and warn client checks "can be easily be overridden". Validate:
- Player money
- Player state bags
- Player inventory items
- Player position
- Player experience and level
- Player permissions and roles
Most duplication bugs trace back to a registration mistake. Use AddEventHandler when an event fires inside one context, because "This ensures that the events are not networked and cannot be called by the opposing side". RegisterNetEvent crosses the boundary.
A Lua executor is why this outweighs framework choice: it lets a cheat client call your networked events with any arguments - mechanics in how a FiveM Lua executor works. A handler trusting a client-supplied amount is exploitable on all three.
On the claim that one framework is safer because of its inventory: the ox_inventory docs list compatible frameworks including ESX and Qbox, and describe server-side validation of item, shop and stash interactions. Where detection runs is a separate question, covered in how detection splits between client and server.
Server convars that sit underneath all three frameworks
Framework choice does not touch these. They are FXServer convars from the Cfx.re server commands page, with the default the docs print. Where no default is documented, the table says so.
| Convar | What the documentation says it does | Documented default |
|---|---|---|
| sv_entityLockdown [mode] | Controls how strict the server is about client-created entities. Modes: full, strict, relaxed, inactive | inactive |
| sv_scriptHookAllowed [true|false] | Set to true to allow clients with Script Hook V to connect | false |
| sv_pureLevel [level] | Prevents users from using modified client files. Level 1 blocks all modified client files except audio and known graphics mods; level 2 blocks all modified client files | not documented |
| sv_filterRequestControl [mode] | Blocks REQUEST_CONTROL_EVENT routing based on a configurable policy, modes -1 to 4 | 0 |
| sv_filterRequestControlSettleTimer | Sets after how long an entity should be blocked from a REQUEST_CONTROL_EVENT | 30000 milliseconds |
| sv_enableNetworkedSounds | Can be used to prevent users from routing NETWORK_PLAY_SOUND_EVENT through the server | true (allow routing) |
| sv_enableNetworkedScriptEntityStates | Can be used to prevent users from routing SCRIPT_ENTITY_STATE_CHANGE_EVENT through the server | true (allow routing) |
| sv_enableNetworkedPhoneExplosions | Boolean console variable that is disabled by default | false (disabled) |
| sv_authMinTrust | Integer from 1-5, from least to most trustworthy identity provider | 1 |
| sv_authMaxVariance | Integer from 1-5, from least to most likely for an identifier to change | 5 |
| rcon_password | Sets the RCon password; if unset then RCon will be disabled | unset, RCon disabled |
The docs make no recommendation on which sv_entityLockdown mode is correct, so test stricter modes on a development server first. The security page's further connection-check convars are left out here: it warns they "shouldn't be touched unless you know what you are doing".
Audit the privileged mutation surface, whichever framework you pick
Every framework ships commands that create money, set jobs and grant permissions. Treat this as an audit checklist: confirm each gate exists, who inherits it, and that the call is logged. Sources: the QBCore, ESX and Qbox command pages.
| Framework | Command | Documented permission |
|---|---|---|
| QBCore | /givemoney [id] [type] [amount] | admin |
| QBCore | /setmoney [id] [type] [amount] | admin |
| QBCore | /setjob [id] [job] [grade] | admin |
| QBCore | /setgang [id] [gang] [grade] | admin |
| QBCore | /addpermission [id] [permission] | god |
| QBCore | /clearinv [opt: id] | admin |
| ESX | /setaccountmoney [PlayerId] [Account] [Amount] | not documented |
| ESX | /giveaccountmoney [PlayerId] [Account] [Amount] | not documented |
| ESX | /giveitem [PlayerId] [Item] [Amount] | not documented |
| ESX | /setjob [playerId] [job] [grade] | not documented |
| ESX | /setgroup [PlayerId] [Group] | not documented |
| Qbox | /givemoney | group.admin |
| Qbox | /setmoney | group.admin |
| Qbox | /setjob | group.admin |
| Qbox | /addjob | group.admin |
| Qbox | /addpermission | group.admin, described in the docs as God Only |
The ESX page prints no permission column, so the table says not documented rather than guessing. Its documented account names are bank, black_money and money - not cash. All three sit on FiveM's ACE system underneath:
| Command | Documented purpose |
|---|---|
| add_ace [principal] [object] [allow|deny] | Adds an access control entry to the server's access control list |
| remove_ace [principal] [object] [allow|deny] | Removes a specified ACE from the server's access control list |
| add_principal [child_principal] [parent_principal] | Sets a principal to inherit from another principal |
| remove_principal [child_principal] [parent_principal] | Removes a specified principal inheritance entry |
| test_ace [principal] [object] | Tests if a principal is allowed or denied access to a given object |
The containment rules matter more than the commands, and the Cfx.re guide documents them.
- ACEs default to unset, which behaves as deny. Grant explicitly, then test what you granted.
- First come first serve: once set, a permission cannot be overwritten by a later line.
- builtin.everyone is a group every single player is in. Nothing consequential belongs there.
- rcon_password unset means RCon is disabled - the smaller attack surface if unused.
- test_ace [principal] [object] confirms the gate you think exists actually exists. Run it after every permissions change.
- QBCore defines god, admin and mod tiers in qb-core/config.lua under QBCore.Config.Server.Permissions; Qbox marks some qbx_core permission exports deprecated in favour of ox_lib ACE permissions.
The performance claims in other comparisons are not measurements
One page claims a framework uses a quarter less CPU than another; another claims the opposite about the same pair. Neither publishes a load profile or a methodology. Main-thread cost is dominated by the resources you install on top of the core.
How to actually choose a FiveM framework
- On QBCore with a big paid-script catalogue. Sunk cost dominates. Test Qbox with the bridge on and convert in stages.
- On ESX and being told it is dead. Check the repository yourself before spending a month migrating.
- Starting fresh with a developer who knows one framework. Pick that one. Familiarity beats every row above.
- Starting fresh with no attachments. Qbox documents dependencies, database requirements and developer rules most explicitly.
- Buying heavily from script vendors. Check what they support first; lock-in is a purchasing decision as much as a technical one.
- Whichever you pick. Budget time for a validation pass over your own resources and the ones you bought.
Frequently asked questions
Is Qbox a fork of QBCore?
Yes, and both framings are official. The Qbox docs say "Starting as a QBCore fork, its goal was improving upon QBCore while maintaining backwards compatibility", dating it to September 27, 2022, while the qbx_core README calls it a successor to qb-core.
Can I run QBCore scripts on Qbox?
The Qbox FAQ answers "Yes (in most cases)", through the bridge controlled by enableBridge, default true. Exceptions: resources using undocumented or improper methods will not work unmodified. The converting guide adds grade type changes, the removed core object and a required SQL migration.
Is ESX dead or still maintained?
Not according to its own repository. As of 2026-08-18, esx-framework/esx_core is public, docs.esx-framework.org is live, and the organisation showed commits within the previous two months when I checked. Treat popularity claims about any of the three as first-party marketing.
Which FiveM framework is the most secure?
None of them. All three expose money, inventory and job mutations through networked events any client can trigger. Your exposure depends on whether your resources recompute consequential values server-side or accept the client's number. Switching framework does not fix duplication: that comes from a handler trusting a client-supplied amount.
Where to go from here
Pick the framework your team can maintain, then walk every RegisterNetEvent handler in your resources and the paid ones you run, confirming the server derives the amount, item, price and position.
Validation stops the exploit you anticipated. Detection catches the one you did not. FairShieldAC adds a layer on top of that work: server-side behavioural heuristics, encrypted and shuffled event triggers against server-event spoofing, and a global ban network screening players at connect. Our published claim is 98%+ of known cheats and exploits, qualified deliberately. Start with how FiveM anti-cheat detection works, compare options in the 2026 anti-cheat comparison, and see the plans.