escrow_ignore in fxmanifest.lua covers bridge/*.lua, so you can plug in ND_Core, ox_core, or a fully custom framework without source access to the rest of the resource.
Bridge API
bridge/server.lua is the single integration surface. To add a new framework, add a branch alongside the existing FW_QBX / FW_QB / FW_ESX checks. Mirror any event subscriptions on the client side in bridge/client.lua.
The rest of the resource calls only these functions:
Player & identity
Job & grade
GetPlayerJob is the most important one — return shape must match exactly. The resource treats isboss = true as overriding Config.BossGradeNames, so set it correctly for grades that are bosses.
Money
account is 'cash' or 'bank'. Return false on insufficient funds — the boss menu uses this to gate Deposit.
Society
AddSociety and RemoveSociety return false on failure — the boss menu uses the return value to drive the refund-on-failure behaviour. Returning true after a silent failure means money disappears.
Admin & UX
IsAdmin is consulted alongside Config.Admin.acePermissions — return true from either path grants admin.
Client side
bridge/client.lua mirrors the framework-specific event subscriptions the resource needs — typically the “player loaded” and “job changed” events. Add your branch and emit the same internal events used by the existing branches.
The most important client-side hook is publishing a refreshed PlayerData whenever the player’s job changes, so the marker / blip filtering updates without waiting for the next Config.JobPollMs tick.
Testing your branch
-
Set
Config.Framework = 'auto'(or pin to your new value if you’ve added one to the framework switch). -
Set
Config.SocietyBackendaccordingly. -
Start your framework, then
nex_bossmenu. The boot line should print: -
Run
/bossmenu_adminas an admin, place a marker for a job that exists in your framework. - Walk to it as a boss of that job — the prompt should appear and the menu should open.
-
Try every action: balance read, withdraw, deposit, hire (with a candidate nearby), promote, demote, fire. Each one exercises a different bridge function — any missing return path will surface as a
Society account write failedorsetJob did not stickerror.

