Code Graph
A FiveM server is not one program. It is dozens of resources talking to each
other through events, exports and NUI messages, and none of that is visible in a
file tree. Code Graph reads your whole resources/ folder and draws the
connections.
Opening it
Section titled “Opening it”Open Code Graph from the sidebar and pick a resource, or the whole project. The first parse of a large server takes a few seconds; after that Boltise re-parses only the files that changed.
What it finds
Section titled “What it finds”Boltise parses your Lua with the same AST parser that powers the editor’s
squiggles, so it understands CfxLua as written — compound assignment
(count += 1), backtick hash strings, and safe navigation (drawColor?[1]) are
all valid input, not syntax errors.
It extracts far more than functions:
| Symbol | What it is |
|---|---|
| Functions | Global and local function definitions |
| Event handlers | AddEventHandler, RegisterNetEvent |
| Event triggers | TriggerEvent, TriggerServerEvent, TriggerClientEvent |
| Exports | exports('name', fn) and every exports.resource:fn() that calls one |
| NUI | RegisterNUICallback and SendNUIMessage |
| Database queries | MySQL.Async.*, exports.oxmysql:* and friends |
| Commands | RegisterCommand |
| Threads | CreateThread, and separately the tick loops — CreateThread with Wait(0) |
| Callbacks | The ESX and QBCore callback patterns |
| State bags | GlobalState, LocalPlayer.state |
| Framework calls | QBCore:GetCoreObject(), ESX:getSharedObject(), ox_lib calls |
| Natives | GTA V and RDR2 native calls |
| Lifecycle | onResourceStart, onResourceStop, onPlayerConnecting and the rest |
| Convars | GetConvar, SetConvar, RegisterConvar |
| Streaming | RequestModel, RequestAnimDict, RequestTextureDict |
| Config fields | Config.X = value from your config files |
The connections
Section titled “The connections”Symbols alone are a list. The value is in the edges between them:
event— aTriggerEventmatched to theAddEventHandlerthat receives itnet—TriggerServerEventpaired withTriggerClientEvent, so you can follow a round trip across the client/server boundaryexport_call—exports.other_resource:fn()matched to theexports('fn', …)that defines it, in a different resourcenui—SendNUIMessagematched to theRegisterNUICallbackthat answers itcallback— a framework callback request matched to its responsedb— which symbols reach the databasestate_bag— a state read matched to the write that set itnative— which functions call which nativesfunction_callandlifecycle— direct calls and resource lifecycle wiring
Cross-resource edges are the point. A missing export or a typo’d event name is invisible in a file tree and obvious in a graph.
Reading the map
Section titled “Reading the map”Files are grouped by what they are — configuration, client, server,
shared, ui, and dependency nodes for externals like qb-core and ox_lib
that live outside your project. Resources are categorised too: script,
vehicle, map, clothing, ui, data.
Click any node to open that exact line in the editor. That is the fastest way to use the graph — find the thing, jump to it, stop reading the map.
Config fields and database tables appear alongside your code, so a value in
config.lua and the query that reads it are visibly connected.
Insights
Section titled “Insights”Code Graph also reports structure rather than just drawing it:
- God nodes — the highest-degree symbols. A function everything depends on is where a refactor hurts, and where a bug spreads.
- Communities — clusters of symbols that talk to each other more than to anything else. These are your real modules, whatever the folder names say.
- Connectivity — how many symbols are connected at all. Orphans are often dead code, or code wired up by a name that no longer matches.
When something is missing
Section titled “When something is missing”If a resource shows fewer symbols than you expect, check the Problems panel — a file that fails to parse contributes nothing to the graph, and the parse error will say where. Boltise falls back to a coarser extraction if the native parser is unavailable, which finds less; a full parse is the normal case.
See also
Section titled “See also”- Code Editor — the same parser drives live syntax checking and native completion
- NUI Preview — cross-references your UI’s
fetchcalls with the Lua callbacks that answer them - What the AI Can Do — the assistant reads this graph too
Help us improve these guides
Allow anonymous page and key-link counts? We use PostHog in the US. No session recording. You can change this below at any time.