~/guides/esx-vs-qbcore
ESX vs QBCore: Which FiveM Framework Should You Choose
-- frameworks · updated august 2026 · var fivem team
-- esx 1.14.0 · qb-core 1.3.0 · qbx_core 1.23.0
ESX and QBCore are the two frameworks almost every FiveM roleplay server is built on, they share an ancestor, and the comparison is usually argued with opinions instead of code. This guide reads the actual repositories, manifests and configs of es_extended, qb-core and qbx_core, then lays out what genuinely differs: architecture, player and money APIs, inventory, ecosystem size, learning curve, and what a migration really costs.
Same ancestor, two different paths
These are not two independent projects. QBCore is licensed GPL-3.0 with a copyright line naming ESX (Jérémie N'gadi) alongside Joshua Eger, and the LICENSE file shipped in Qbox's qbx_core still opens with the words es_extended, ESX framework for FiveM. Every mainstream FiveM roleplay framework in 2026 traces back to the same GPL codebase. What separated them is structure, not origin.
ESX Legacy is distributed as a bundle. The esx_core repository ships a [core] folder containing 17 separate resources: es_extended itself plus esx_identity, esx_multicharacter, esx_skin, esx_menu_default, esx_menu_list, esx_menu_dialog, esx_context, esx_notify, esx_textui, esx_progressbar, esx_inventory, esx_lib, esx_loadingscreen, esx_chat_theme, skinchanger and cron. Each one is a swappable unit, which is why so many servers run half stock ESX and half community replacements.
QBCore takes the opposite position. qb-core is one resource, version 1.3.0, holding client, server, shared, an html folder and qbcore.sql. Jobs, gangs, vehicles, weapons, items and locations are all shared files inside that resource, and the surrounding qb-inventory, qb-clothing, qb-target family lives in sibling repositories under the same organisation. One core to read, one config.lua to learn, and a tighter coupling when you want to replace a piece.
Side by side
Every value below was read from the repositories and manifests in August 2026, not from forum folklore. Star counts are a weak proxy for adoption and are included only to show relative project scale on GitHub.
| ESX Legacy | QBCore | Qbox | |
|---|---|---|---|
| core resource | es_extended (in a [core] bundle) | qb-core (single resource) | qbx_core |
| version read | 1.14.0 | 1.3.0 | 1.23.0 |
| first commit era | repo created May 2021 | repo created April 2021 | project started Sept 2022 |
| license | GPL-3.0 lineage, no LICENSE file in repo | GPL-3.0 | GPL-3.0 (es_extended copyright header) |
| declared deps | oxmysql | oxmysql | oxmysql, ox_lib, OneSync, server build 10731 |
| money model | accounts: money, bank, black_money | money types: cash, bank, crypto (extendable) | QBCore model via bridge |
| get a player | ESX.GetPlayerFromId(src) | QBCore.Functions.GetPlayer(src) | exports.qbx_core |
| add money | xPlayer.addMoney(amount) | Player.Functions.AddMoney(type, amount, reason) | same as QBCore via bridge |
| server callback | ESX.RegisterServerCallback | QBCore.Functions.CreateCallback | ox_lib callbacks |
| job grades | job_grades SQL table, grade int | string keys in shared/jobs.lua | numbers, not strings |
| player key | users.identifier (license) | players.citizenid | players.citizenid |
| inventory bridge | ox_inventory (only bridge in core) | qb-inventory | ox_inventory required |
| github stars | 450 | 735 | 139 |
Players, money and jobs
This is where the two frameworks stop being interchangeable. On ESX you fetch a player with ESX.GetPlayerFromId(source) and you get an xPlayer object whose methods are lowercase camelCase: addMoney, removeMoney, getAccount, addAccountMoney, setJob, getJob, addInventoryItem, canCarryItem, setMeta and getMeta. Money is modelled as named accounts, and es_extended ships three by default in its shared config: money, bank and black_money, with new characters starting on a 50000 bank balance.
On QBCore you call QBCore.Functions.GetPlayer(source) and the methods are PascalCase under a Functions table: AddMoney, RemoveMoney, SetJob, SetGang, SetMetaData, HasItem. Money types are config-driven rather than fixed, declared as { cash = 500, bank = 5000, crypto = 0 } with a documented note that you can add your own, for example blackmoney, but never remove one once it exists in the database. AddMoney also takes a third argument, a reason string, and fires an economy log plus a QBCore:Server:OnMoneyChange event, which makes money auditing a first-class citizen rather than something you bolt on.
The database tells the same story. ESX keys its users table on the license identifier and spreads identity across real columns: firstname, lastname, dateofbirth, sex, height, plus job and job_grade, with grades defined in a separate job_grades table carrying a salary per grade. QBCore keys its players table on a citizenid and stores charinfo, job, gang, money and metadata as JSON blobs, with job grades declared in Lua under string keys such as ['0']. Neither schema is portable to the other, which is the real reason a framework switch is expensive.
| Criterion | ESX Legacy | QBCore |
|---|---|---|
| Player object | xPlayer, camelCase methods (addMoney, setJob) | Player.Functions, PascalCase methods (AddMoney, SetJob) |
| Money model | Fixed accounts: money, bank, black_money | Config-driven types: cash, bank, crypto, extendable |
| New character starts on | 50000 bank | cash 500, bank 5000, crypto 0 |
| Core logs every money change | no | yes |
| Identity in the database | Real columns: firstname, lastname, dateofbirth, sex, height | charinfo stored as a JSON blob |
| Job grades | job_grades table, grade int, salary per grade | String keys in shared/jobs.lua |
| Hunger, thirst and reputation held in the core | no | yes |
| Server callbacks | ESX.RegisterServerCallback | QBCore.Functions.CreateCallback |
QBCore keeps more character state inside the core than ESX does. Hunger and thirst decay rates, blood types and a reputation system living in player metadata are all in qb-core config and player code, while ESX leaves that to addon resources. Callbacks differ too: ESX exposes RegisterServerCallback, TriggerServerCallback and an await variant, QBCore exposes QBCore.Functions.CreateCallback and TriggerCallback. None of this is better or worse, but it does mean a script written against one core touches nothing the other core understands. If character identity is a big part of your server, Var-MultiChar is an example of a resource built to sit on either one, with the same slot logic wired to esx_skin, qb-clothing, fivem-appearance or illenium-appearance.
Var-BankBanking with personal IBAN accounts, transfers, beneficiaries, 7-day analytics and society accounts through esx_addonaccount or qb-management, with the framework detected at startup.View the scriptInventory and items
Item definitions live in different places, and that single detail explains a lot of porting pain. QBCore declares its item list in a shared file inside the core resource, shared/items.lua, so items ship with the framework and are edited in Lua. ESX exposes ESX.GetItems and ESX.RefreshItems and keeps its catalog in the database, with the repo shipping a dedicated [SQL] folder. Adding an item is a Lua edit on one and a database row on the other.
On the inventory itself, ESX 1.14.0 now ships an esx_inventory resource inside [core], and es_extended has exactly one bridge in its server code: bridge/inventory/oxinventory.lua. In other words, ox_inventory is the only third-party inventory the ESX core integrates with natively, everything else runs through Config.CustomInventory and community glue. QBCore pairs with qb-inventory by default, while Qbox does not treat ox_inventory as optional at all and lists it as a required dependency in its README.
Ecosystem and learning curve
Ecosystem is the argument most people actually mean when they argue about frameworks. ESX is older in practice and its README points readers at a dedicated Cfx.re releases tag, claiming the framework is trusted by over 12,000 communities, a figure that is self-reported by the ESX project and worth treating as marketing rather than a census. The ESX documentation site makes similar claims about 10,000+ active servers. On GitHub the picture is more modest and closer between the two: 450 stars and 797 forks on esx_core against 735 stars and 981 forks on qb-core. Both catalogs are enormous, and neither one is a reason on its own to pick a side.
Learning curve favours QBCore for a first-time server owner, mostly because there is less to read. One core resource, one config.lua covering money, hunger, thirst and permissions, and shared files you can open in a text editor to see every job and item. ESX asks you to understand that the framework is a set of resources and that its data lives partly in SQL. Both install through txAdmin recipes in a few minutes, which is covered in how to make a FiveM server. For the resource layer on top, the shopping lists differ enough to be worth separate reads: best ESX scripts and best QBCore scripts go category by category on each side.
| Criterion | ESX Legacy | QBCore |
|---|---|---|
| GitHub stars | 450 | 735 |
| GitHub forks | 797 | 981 |
| Self-reported reach | 12,000+ communities, 10,000+ active servers | No comparable public figure |
| What you read to learn it | 17 resources in [core], plus the SQL folder | One resource, one config.lua, shared files |
| Where the item list lives | Database, read through ESX.GetItems | shared/items.lua inside the core |
| Replacing a core piece | Each resource is a swappable unit | Tighter coupling inside one resource |
| Installs from a txAdmin recipe | yes | yes |
Maintenance activity is one signal you can check yourself instead of taking anyone's word for it. In August 2026, esx_core had been pushed to within the last day, qbx_core within the last three weeks, and the last commit on qb-core main was 17 June 2026. Open an issues tab and a commit history before you commit a year of development to a codebase.
The Qbox case
Qbox is the reason the ESX vs QBCore question is no longer a two-way choice. Started on 27 September 2022 as a QBCore fork, qbx_core is now at version 1.23.0 and its own documentation describes the project as refactored to improve code quality, enhance security, lower performance overhead and integrate with Overextended resources. Its manifest declares oxmysql, ox_lib, OneSync and FiveM server build 10731, and critically it ends with provide 'qb-core', so resources that ask the server for qb-core still resolve. A bridge/qb folder with client, server and shared layers does the translation.
The architectural break is that the global core object is gone. Qbox's conversion guide states plainly that the core object no longer exists and that data is reached through export functions and imported modules instead, with QBCore.Shared lookups replaced by exports.qbx_core equivalents. Job and gang grades become numbers rather than strings. Qbox claims 99 percent compatibility with existing QB scripts, and a December 2024 reply on the Cfx.re framework thread put the practical figure at around 95 percent of QBCore resources working through the bridge. The honest counterweight, from the same thread, is that Qbox has fewer ready-made resources than QBCore, and its GitHub footprint (139 stars) reflects a much smaller project.
Migrating between them
There are two very different migrations hiding behind the same word. QBCore to Qbox is supported and incremental: the bridge keeps old resources running while you replace calls one at a time, and the Qbox docs explicitly say both APIs can be used simultaneously so conversion can happen partially or over time. The documented failure cases are resources that read database tables directly, reach into qb-core files never meant to be used externally, or call core functions in invalid ways. Those break, and they break loudly.
QBCore to Qbox, the one supported path
- Install qbx_coreIts manifest declares oxmysql, ox_lib, OneSync and FiveM server build 10731, and the README also lists ox_inventory.
- Leave the qb bridge onThe manifest ends with provide 'qb-core' and a bridge/qb folder translates client, server and shared calls, so existing resources still resolve.
- Convert one resource at a timeBoth APIs work simultaneously, so QBCore.Shared lookups become exports.qbx_core when you reach them, not on migration day.
- Fix the documented breakersResources reading database tables directly, reaching into qb-core internals, or calling core functions invalidly. Job and gang grades also turn from strings into numbers.
ESX to QBCore, or the reverse, is not a bridge job. The player object, the money model, the job schema and the database layout all differ, so there is no shim that makes an xPlayer answer to Player.Functions.AddMoney. In practice a framework switch means rebuilding your resource layer and writing a data migration for characters, balances, vehicles and inventories. That cost is exactly why buying scripts that already speak both dialects is worth more than it looks on the day of purchase.
How to actually choose
Pick ESX if your developers already read ESX Lua, if you want a core made of parts you can replace individually, or if the specific community resources you have shortlisted are ESX first. Pick QBCore if you want the smallest core to learn, character state like hunger, thirst and reputation handled in the framework rather than in addons, and a first-party resource family under one organisation. Pick Qbox if you are starting fresh in 2026, you are already committed to the ox stack, and you would rather inherit a cleaner codebase than the largest catalog.
Whichever way you go, the framework is a decision you make once and pay for repeatedly. The way to keep that bill low is to avoid resources that hardcode a framework. Var scripts detect ESX, QBCore or standalone at startup and route money, jobs and inventory calls through the detected core, so the same purchase survives a migration. Var-Bank detects the society resource too, esx_addonaccount or qb-management, with no custom table to create, and Var-MultiChar works across four different skin managers for the same reason. Buy for the framework you run today, keep the option on the one you might run next year.
Frequently asked questions
Is ESX or QBCore better for a new FiveM server?
Neither is objectively better, they solve the same problem with different structures. ESX Legacy ships its core as a bundle of small resources you can swap individually, while QBCore ships one core resource with its state and item list inside it. Pick ESX if your team already reads Lua from the ESX ecosystem and you want the largest back catalog of community resources, pick QBCore if you want a smaller surface to learn and the qb-* resource family maintained under one org. The decision that actually matters is which one your developers can maintain a year from now.
Can I run ESX and QBCore on the same server?
No, not as a supported setup. Both frameworks define their own player object, their own money model and their own database schema, and both expect to be the single authority on who a player is. Loading es_extended and qb-core together means two sources of truth for balances and jobs, which desynchronises the moment a script writes to one and reads from the other. One framework per server is the only sane configuration.
What is Qbox and is it better than QBCore?
Qbox is a fork of QBCore started on 27 September 2022 that rebuilt the core around the Overextended stack. Its qbx_core manifest declares oxmysql, ox_lib, OneSync and FiveM server build 10731 as dependencies, and the README also lists ox_inventory. It is more modern and it removes the global core object in favour of exports, but it is a smaller project than QBCore on GitHub (139 stars against 735 at the time of writing) and community threads on the Cfx.re forum note it has fewer ready-made resources. Better depends on whether you value the newer codebase more than the larger catalog.
Do ESX scripts work on a QBCore server?
Not by default. An ESX script calls ESX.GetPlayerFromId and xPlayer methods like addMoney or setJob, a QBCore script calls QBCore.Functions.GetPlayer and Player.Functions.AddMoney, and the two APIs do not overlap. A script only runs on both if the developer wrote support for both, usually by detecting the framework at startup and routing through an adapter layer. Var scripts do exactly that, which is why the same purchase covers a later framework switch.
How hard is it to migrate from QBCore to Qbox?
Qbox is the one migration path in this comparison that is officially supported. qbx_core ships a bridge folder for qb resources and its manifest declares provide 'qb-core', so resources that ask for qb-core still resolve. The Qbox documentation claims 99 percent compatibility with existing QB scripts, and its FAQ lists the exceptions: resources that read database tables directly, that reach into qb-core files not meant to be used externally, or that call existing functions in invalid ways. Job and gang grades also change from strings to numbers.
Which framework performs better, ESX or QBCore?
There is no credible public benchmark comparing the two cores under identical load, so treat any exact millisecond claim you read as marketing. In practice the core resource is rarely what costs you frames: the resource layer on top of it is. Measure your own server with resmon, look at what idles above roughly 0.10 ms while nothing is happening, and fix that before blaming the framework.
-- var-fivem.com
Scripts that run on both
Every Var script detects ESX, QBCore or standalone at startup, so a framework switch does not cost you your library. Escrow, Partially Open and Open Source tiers, lifetime updates on all three.
Related: Best ESX scripts · Best QBCore scripts
Keep reading
- esxBest ESX Scripts for Your FiveM ServerA curated tour of ESX-compatible scripts by category: economy, jobs, crime, appearance and minigames, with what to look for in each.read
- qbcoreBest QBCore Scripts for Your FiveM ServerQBCore and Qbox compatible scripts by category, how QBCore compatibility works, and what separates premium resources from free ones.read
- setupHow to Make a FiveM Server in 2026From zero to first spawn in about 20 minutes: the free license key, txAdmin setup with the official screenshots, ESX vs QBCore recipes, server.cfg explained line by line, real hosting costs and the launch checklist.read