# Everything you can put in an fxmanifest.lua

> A full fxmanifest.lua reference for FiveM resources: fx_version, game, script loading order, shared scripts, NUI files, data_file, dependencies, escrow, and the mistakes that stop a resource starting.

Source: https://fam-tools.com/guides/fivem-fxmanifest · FAM Tools · published 2026-04-02 · updated 2026-09-07 · about 10 min

**Short answer.** fxmanifest.lua declares fx_version, game, and the client, server and shared scripts. Load order inside each list is the order you write them — dependencies first.

The manifest is the only file every resource must have. It tells the server what the resource is, which files belong to it, and in what order they load. It is also, by a wide margin, the file people get wrong when a resource "will not start".

## The minimum that works

fx_version selects the manifest schema. cerulean is current and is what you should use; adamant and bodacious are older and lack features. game can be gta5, rdr3 or common for something that runs on both.

```lua
fx_version 'cerulean'
game 'gta5'

author 'Your Name'
description 'What this resource does'
version '1.0.0'

client_script 'client.lua'
server_script 'server.lua'
```

## Script loading and order

Each list loads in the order you write it. This is not alphabetical and it is not by dependency graph — if config.lua defines something main.lua needs, config.lua goes first.

shared_script loads on both sides. It is the right place for a config table, and the wrong place for anything containing a secret, because clients receive it.

```lua
shared_scripts {
  '@ox_lib/init.lua',   -- another resource's file, loaded first
  'config.lua',
  'shared/*.lua',       -- glob, alphabetical within the glob
}

client_scripts {
  'client/main.lua',
  'client/menu.lua',
}

server_scripts {
  '@oxmysql/lib/MySQL.lua',
  'server/main.lua',
}
```

> **Never put a secret in a shared script** — shared_scripts are sent to every client. An API key, a webhook URL or a licence secret in one is public. Server-only values belong in server_scripts, or better, in a convar read with GetConvar.

## NUI: HTML interfaces

ui_page names the entry point, and files lists everything the page is allowed to load. A file not listed there returns 404 to the browser with no server-side error, which is why a NUI that works locally shows a blank panel in game.

```lua
ui_page 'html/index.html'

files {
  'html/index.html',
  'html/style.css',
  'html/script.js',
  'html/assets/*.png',
  'html/fonts/*.woff2',
}
```

> **A blank NUI is almost always a missing files entry** — Open the CEF console with F8 and look for 404s. Every one of them is a path you forgot to list. Globs help, but they do not recurse — html/assets/*.png does not match html/assets/icons/x.png.

## Data files and streaming

data_file registers a game data file so the engine reads it. The stream folder is picked up automatically in cerulean, so you rarely need to declare it.

```lua
files {
  'vehicles.meta',
  'handling.meta',
}

data_file 'VEHICLE_METADATA_FILE' 'vehicles.meta'
data_file 'HANDLING_FILE'         'handling.meta'

-- only needed if your stream folder is somewhere unusual
-- this_is_a_map 'yes'
```

## Dependencies and load gating

dependency stops the resource starting until the named resource is running. dependencies takes a list. There is also a version form for gating on a server build.

```lua
dependency 'oxmysql'

dependencies {
  'ox_lib',
  'qb-core',
  '/server:12000',    -- requires artifact build 12000+
  '/onesync',         -- requires OneSync enabled
  '/gameBuild:3258',  -- requires this game build
}
```

> **tip** — The /server, /onesync and /gameBuild forms turn a confusing runtime failure into a clear message at start. Worth adding to anything you distribute.

## The full field list

| Field | Purpose |
| --- | --- |
| fx_version | Manifest schema. Use 'cerulean'. |
| game / games | 'gta5', 'rdr3' or 'common'. |
| author, description, version | Metadata shown in txAdmin and the console. |
| client_script(s) | Runs on the client. |
| server_script(s) | Runs on the server only. |
| shared_script(s) | Runs on both. No secrets. |
| ui_page | The NUI entry HTML. |
| files | Anything the client must be able to download. |
| data_file | Registers a game data file by type. |
| dependency / dependencies | Gates the start. |
| provide | Declares this resource as a replacement for another. |
| lua54 | 'yes' to use Lua 5.4 features. |
| use_experimental_fxv2_oal | 'yes' for the newer Lua compiler. |
| escrow_ignore | Files to leave readable in an escrowed resource. |
| this_is_a_map | 'yes' for map resources. |

## Why a resource refuses to start

- A syntax error in the manifest itself — it is Lua, so a missing comma inside a table is fatal. The console names the line.
- A referenced file that does not exist. Case matters on Linux and does not on Windows.
- A dependency that is not running, or is spelled differently from the folder name.
- A folder name with a space, or with characters other than letters, digits, dash and underscore.
- Two resources with the same folder name in different bracket folders. Only one will start.
- fx_version missing entirely — the resource is treated as an old-style one and almost nothing works.

## Questions

### What is the difference between files and client_script?

client_script is Lua that the game runtime executes. files is anything else the client must be able to download — HTML, CSS, images, .meta files. A .lua listed only in files is downloaded and never run.

### Do I need escrow_ignore?

Only if you publish an escrow-protected resource and want specific files, usually config.lua, to stay editable by the buyer. On your own resources it does nothing.

### Does the order of the fields matter?

No, but the order inside each script list does. Put configs and libraries before the files that use them.

## Related

- https://fam-tools.com/guides/fivem-streaming-assets
- https://fam-tools.com/guides/fivem-server-cfg
- https://fam-tools.com/guides/fivem-crash-debugging
