Framework choice is not a popularity contest. It is a dependency decision: what your scripts require, what interfaces they call, what your team understands, and what you can verify before launch.

Short answer: Keep ESX when your current resources and staff workflows depend on ESX interfaces. Keep QBCore when the required stack depends on QBCore interfaces. Evaluate QBox for a new or deliberately migrated build only after testing every required resource and bridge. The comparison below is a planning worksheet, not a catalog census or migration-cost study.

ESX vs QBCore vs QBox at a glance

FactorESXQBCoreQBox
Ecosystem / script catalogVerify each required resource against the current ESX versionVerify each required resource against the current QBCore versionVerify native support or a documented bridge for each required resource
ArchitectureUse the maintainer documentation to map the ESX interfaces your stack callsUse the maintainer documentation to map QBCore shared objects and eventsUse the maintainer documentation to map Qbox interfaces and bridge behavior
Use case to verifyExisting builds with verified ESX dependenciesExisting builds with verified QBCore dependencies and team knowledgeNew or scoped migration builds that pass a resource-by-resource test
Migration work to scopeCount ESX-only resources, data changes, integrations, and staff workflowsCount QBCore-only resources, data changes, integrations, and staff workflowsCount unsupported resources, bridge tests, data changes, and acceptance checks

Choose ESX when

You inherited an ESX stack, have staff who know its patterns, and your required resources pass on the current ESX version. Staying avoids a migration project, but that is not evidence that future maintenance is cheaper; record the dependencies and problems you are accepting.

Choose QBCore when

Your team already works in QBCore, your scripts are QBCore-native, and the required resources pass against the current interfaces, and staff can support those dependencies. Treat team familiarity as one planning input, then test the actual build instead of inferring support breadth.

Choose QBox when

You are starting fresh or have a scoped migration plan and can validate each required resource and bridge. Do not infer maintainability or compatibility from positioning language; install the target versions, run the acceptance checks, and record unsupported dependencies before committing the build.

Check the interface before changing a resource name

These are documented interfaces checked on September 8, 2026, not a tested compatibility matrix. The resource's own supported-version list and installation instructions still matter. Qbox specifically warns about resources that access core tables or internal files directly, rather than using its supported interfaces.

  • QBCore: the core-object documentation uses exports['qb-core']:GetCoreObject().
  • Qbox: qbx_core has no native core object. Its QB bridge can supply the QBCore-style export. Renaming that call to exports['qbx_core']:GetCoreObject() is not a migration. Check the Qbox compatibility exceptions and the documented qbx:enableBridge setting.
  • ESX: its maintained imports file obtains exports['es_extended']:getSharedObject(). An ESX integration needs the expected ESX API; changing the export name does not convert its player, inventory or job logic.

A compatibility check you can repeat

  1. Create an isolated test server and database using fictional players. Record the FXServer artifact, framework release or commit, resource release, database migration and every bridge or dependency version.
  2. Choose one required integration, such as a shop connected to your inventory. Write its expected behavior before running it: one purchase removes the configured amount and adds exactly one item; insufficient funds change neither balance nor inventory.
  3. Install in the documented dependency order. Test login, the action, failure handling and reconnecting. If persistence is part of the feature, restart the test server and confirm the expected state returns without a duplicate item or charge.
  4. Record expected versus actual behavior, relevant sanitized errors and the version tested. Mark missing evidence as untested. A clean startup proves only that startup completed; it does not prove these player actions work.

Repeat for each required integration. If the core version or bridge changes, repeat the affected checks. Bring a failing example to the free error decoder or follow the debugging lesson to identify the first missing value or API before buying a replacement.