<!-- fivemad.com, Markdown source of https://fivemad.com/docs/tools/vehicle-pack-validator -->
> Source: https://fivemad.com/docs/tools/vehicle-pack-validator
> Section: Tools
> Tags: vehicles, addon cars, fxmanifest, carcols, handling, validation
> Tool: https://fivemad.com/tools/vehicle-pack-validator
> Last updated: 2026-09-22
> Site map for assistants: https://fivemad.com/llms.txt

# Vehicle Pack Validator

Check a FiveM vehicle resource for broken links between metas, stream files and fxmanifest. Every check it runs, what it means and how to fix it.

The Vehicle Pack Validator reads an addon car resource (or a whole `[cars]` folder) and reports every broken link between `fxmanifest.lua`, the vehicle metas and the files in `stream/`. Each finding names the file and line and says what to change. It is for server owners installing car packs and for devs who build them.

## What it is for

A car that does not spawn, spawns without textures, has no tuning parts or flashes another car's light pattern is almost always a wiring problem, not a model problem: a `data_file` line with the wrong type, a meta missing from `files { }`, a `handlingId` with a typo, a kit id that another pack already uses. Finding those by hand across five metas and a manifest takes a long time, and it gets worse when you merge twenty car resources.

Drop the pack here before you put it on the server, or when a car misbehaves and you want to rule out the metas.

## Quick start

1. Open the tool and use **Choose a folder** (pick the resource folder, or the parent `[cars]` folder), **Open a .zip**, or drag the folder or zip onto the card.
2. Wait for the progress bar to finish reading the files.
3. Read the verdict at the top: **Ready to ship**, **Works, with problems** or **Broken**, with counts of errors, warnings, notes, vehicles, broken cars and resources.
4. Work through the **Findings** tab, errors first. Click a model name under a finding to jump to that car in the **Vehicles** tab.
5. Open the **fxmanifest** tab to compare your manifest with the one built from the files that are really in the folder.
6. Press **Report .md** to download the whole report as Markdown for a ticket or a Discord post.

No pack at hand? **Try a sample** loads a made up pack with invented names and placeholder model files, broken on purpose.

> [!NOTE]
> Everything is read in your browser, nothing is uploaded. Big model files are not opened in full, so even a large car folder checks quickly.

## Input

What you can drop:

- One resource folder (the one with `fxmanifest.lua` or `__resource.lua`).
- A folder holding many resources. Each folder with a manifest becomes its own resource, and conflicts between them are checked.
- A `.zip`. Normal and zip64 archives with store or deflate compression work. Password protected zips and 7z or rar archives must be extracted first. Files the zip reader skips are listed under the verdict.

Vehicle files that sit in no resource with a manifest are grouped by their top folder (the folder above `stream/`, `data/`, `meta/`, `metas/`, `audioconfig/` or `sfx/`), so a pack without a manifest is still checked and gets a "no fxmanifest" error.

Ignored: `__MACOSX/`, `.git/`, `.DS_Store`, `Thumbs.db`, `desktop.ini`.

What it looks at:

| Files | Used for |
|---|---|
| `*.meta` | The vehicle metas. You can name them anything: a meta is recognised by its root element (`CVehicleModelInfo__InitDataList` is vehicles.meta, `CHandlingDataMgr` handling, `CVehicleModelInfoVarGlobal` carcols, `CVehicleModelInfoVariation` carvariations, `CVehicleMetadataMgr` vehiclelayouts, plus dlctext, content unlocks and shop metas). |
| `.yft .ytd .ydr .ydd` | Presence, location, file type and memory size. |
| Other stream files (`.ybn .ycd .ymap .ytyp` ...) | Name and location. |
| `*.dat151.rel`, `*.dat54.rel`, `.awc` and other audio data | Engine sound checks and the audio `data_file` lines. |
| Client and shared `*.lua` | `AddTextEntry` calls for car display names. |
| `*.fxap` | Marks the resource as escrowed. |

## The report

### Verdict

- **Broken**: at least one error. The title says how many cars will not work as shipped.
- **Works, with problems**: no errors, some warnings.
- **Ready to ship**: no errors or warnings. Notes may remain, they are optional.

### Findings tab

Findings are grouped: fxmanifest and data_file, Stream files, vehicles.meta, handling.meta, Mod kits (carcols and carvariations), Sirens, Engine sound, Asset size, Conflicts between resources, File and folder names. The filter row switches between **All**, **Errors**, **Warnings** and **Notes**. Each finding has a title, evidence lines (`file:line` and what was found) and a fix. Model buttons under a finding open that car in the Vehicles tab.

### Vehicles tab

One row per `modelName`, worst status first. The chips show what the car links to:

| Chip | Meaning |
|---|---|
| `.yft` | The model file, with its path and memory size. Red when missing, amber when over 16 MiB. |
| `_hi` | The high detail model. Amber when missing. |
| `.ytd` | The texture dictionary from `txdName`. |
| `handling` | The matching `handlingName`, or "base game". |
| `variations` | The carvariations entry. |
| `kit` | Kits and their ids. |
| `siren` | `sirenSettings` id, only for cars that have one. |
| `sound` | `audioNameHash` and whether it is a base game sound, in this pack or not found. |

Open a row to see the meta file and line plus all findings for that car. With more than 6 vehicles a filter box appears (by model or resource).

### fxmanifest tab

A suggested manifest per resource, built from what is really in the folder. It says whether it **differs from the current manifest** or **matches** it. The rules:

- `fx_version 'cerulean'` and `game 'gta5'`, plus `lua54`, `name`, `author`, `description`, `version` if you had them.
- Your `shared_scripts`, `client_scripts` and `server_scripts` are kept.
- One `data_file` line per vehicle meta with the type that matches its root element, and one per sound file, in Rockstar's DLC order: `HANDLING_FILE`, `VEHICLE_LAYOUTS_FILE`, `VEHICLE_METADATA_FILE`, `CARCOLS_FILE`, `VEHICLE_VARIATION_FILE`, `CONTENT_UNLOCKING_META_FILE`, `VEHICLE_SHOP_DLC_FILE`, `TEXTFILE_METAFILE`, `AUDIO_SYNTHDATA`, `AUDIO_GAMEDATA`, `AUDIO_SOUNDDATA`, `AUDIO_WAVEPACK`.
- Other valid `data_file` lines you had (types this tool does not manage) are kept. `DLCTEXT_FILE` is dropped.
- `files { }` lists every data file target, the `.nametable` files, `<folder>/*.awc` for wave packs, and your own entries for other files (images, json).
- `escrow_ignore` is kept.

Compare it with yours before you replace anything.

## Every check

Severity: **Error** blocks loading (car does not spawn, meta not loaded, crash). **Warning** means it loads but looks, sounds or behaves wrong, or clashes with something. **Note** is information.

### fxmanifest and data_file

| Check | Severity | What it means | How to fix |
|---|---|---|---|
| No fxmanifest.lua | Error | A folder with metas or stream files has no manifest, so FiveM never starts it. | Add an `fxmanifest.lua` (the suggested one is a start) and `ensure` the folder. |
| Both manifests | Warning | `fxmanifest.lua` and `__resource.lua` exist. FiveM ignores `__resource.lua`. | Move what you need into fxmanifest.lua, delete `__resource.lua`. |
| Legacy manifest | Note | The resource still uses `__resource.lua`. | Rename to fxmanifest.lua, replace `resource_manifest_version` with `fx_version 'cerulean'` and `game 'gta5'`. |
| Lua syntax problem | Error | Unclosed string, unclosed `--[[` comment, unclosed `{`, a missing comma between table entries, or `data_file` without both a type and a path. Everything after the break is silently missing. | Fix the line shown. The server console shows the same error on start. |
| `fx_version` missing | Error | The resource does not start. | Add `fx_version 'cerulean'` at the top. |
| `game` missing | Warning | The server warns about manifests without a game. | Add `game 'gta5'`. |
| `this_is_a_map` in a vehicle resource | Note | Makes the client reload the map store on start. Cars do not need it. | Remove it unless the resource also streams map files. |
| files entry matches no file | Warning | A `files { }` path points at nothing. | Fix the path (relative to the resource folder) or remove it. |
| files entry only matches with different case | Warning | Works on Windows, finds nothing on Linux. | Make the path match the real file name exactly. |
| data_file loaded twice | Warning | The same type and path appear twice, so every entry is added twice. | Remove the duplicate line. |
| `DLCTEXT_FILE` | Note | Not a type FiveM has a loader for. It does nothing. | Delete the line. Car names come from `AddTextEntry`. |
| Unknown data_file type | Error | A misspelled type is ignored, so the file never loads. Close matches are suggested. | Use the exact type name, it is case sensitive. |
| Audio data_file uses a wildcard | Error | Audio data files cannot be globbed. | One line per sound pack with the exact path. |
| data_file points at a missing file | Error | Nothing matches the path. For audio types the path must be the file without the version suffix, for `AUDIO_WAVEPACK` the folder. | Fix the path. `audioconfig/mycar_game.dat151.rel` is written `audioconfig/mycar_game.dat`. |
| data_file not in files { } | Error | Clients only download what `files { }` lists, so the game never sees it. | Add the path to `files { }`. |
| Wrong data_file type for a meta | Error | A vehicles.meta loaded as `HANDLING_FILE` and so on. The type is checked against the root element. | Change the type to the one the finding names. |
| Meta never loaded | Error (core metas), Note (content unlocks, shop meta) | A vehicles, handling, carcols, carvariations or vehiclelayouts meta has no `data_file` line. | Add the `data_file` line and list the file in `files { }`. |
| CARCOLS or VARIATION before VEHICLE_METADATA | Note | Rockstar loads vehicles.meta, then carcols.meta, then carvariations.meta. FiveM only moves handling and layouts to the front. | Reorder the lines to rule it out. |
| Not a vehicle meta | Note | A meta with an unknown root element. Not checked. | Make sure it has the right `data_file` type if it belongs to the car. |
| Not valid XML | Error | The game skips or crashes on a meta it cannot parse. | Fix the tag at the line shown (VS Code highlights the break). |

Globs follow FiveM's rules: `*` and `?` stay inside one folder, `**` matches any number of folders.

### Stream files

| Check | Severity | What it means | How to fix |
|---|---|---|---|
| Files outside stream/ | Error | `.yft`, `.ytd`, `.ydr` or `.ydd` not under `stream/`. Listing them in `files { }` does not stream them. | Move them into `stream/` (subfolders are fine). |
| Stream folder spelled differently | Warning | `Stream/` or `STREAM/`. Linux hosts do not find it. | Rename to lowercase `stream`. |
| Exported XML or openFormats file | Error | `.yft.xml`, `.ytd.xml`, `.oft`, `.otd` and so on. The game only loads compiled files. | Import in CodeWalker (or OpenIV) and save the binary, delete the export. |
| Not a GTA V resource file | Error | Empty, damaged or renamed from another format (not checked for escrowed resources). | Re-export the file or get a fresh copy from the author. |
| Enhanced edition (RSC8) asset | Error | FiveM runs the Legacy game and cannot load RSC8. | Use the Legacy version or convert it with CodeWalker. |
| Wrong resource version | Warning | Expected `yft` 162, `ytd` 13, `ydr` 165, `ydd` 165. Usually a file renamed to the wrong extension. | Check the file really is what its extension says. |
| Same file twice in one resource | Warning | Streaming uses the file name only, so one silently replaces the other. | Keep one copy. |
| Meta or script inside stream/ | Warning | Files in `stream/` are streamed as assets, not loaded as data. | Move metas to `data/` and load them with `data_file`. Scripts go in `client_scripts`. |

### vehicles.meta

| Check | Severity | What it means | How to fix |
|---|---|---|---|
| Defines no vehicles | Warning | `<InitDatas>` is missing or empty. | Check the file was not saved half way. |
| No modelName | Error | An entry without `<modelName>`. | Set it to the `.yft` name without extension. |
| No .yft for modelName | Error | The car cannot spawn ("model does not exist"). If the name is a base game car, it is a Note instead: the entry edits that car. | Stream `<model>.yft` or fix `<modelName>`. |
| `_hi.yft` missing | Warning | No high detail model, the car can look low poly or flicker up close. | Stream `<model>_hi.yft` (a copy of the `.yft` works). |
| No txdName | Error | Entry without `<txdName>`. | Set it to the model name and stream `<model>.ytd`. |
| txdName has no .ytd | Error | Not in the pack, not a model name, not a shared game txd. Car renders white, checkered or not at all. | Stream the `.ytd` or point `txdName` at the right one. If `<model>.ytd` exists, the fix says to use it. |
| `<model>.ytd` exists but txdName differs | Warning | The model's own `.ytd` is streamed for nothing. | Set `<txdName>` to the model name if that is where the textures are. |
| Layout does not exist | Error | Not a base game layout and not in a loaded vehiclelayouts.meta. Breaks entering the car or crashes. | Use `LAYOUT_STANDARD`, `LAYOUT_LOW` or ship the layouts file. |
| Unknown vehicle type | Warning | `<type>` is not a game type. | Usually `VEHICLE_TYPE_CAR`. |
| Unknown vehicle class | Warning | `<vehicleClass>` is not a game class. | Use one the finding lists. |
| No display name | Note | No `AddTextEntry` for `<gameName>` in the resource's Lua, so menus show NULL. | Add `AddTextEntry('<gameName>', 'Your Car Name')` in a client script. |
| txd parent does not exist | Warning | `<txdRelationships>` parent is not in the pack or the game. | Point it at a `.ytd` in the pack or a shared game txd like `vehshare`. |
| txd child is not in the pack | Note | The relationship does nothing. | The child is usually the car's `txdName`. |
| modelName has special characters | Warning | Spaces and symbols break spawn commands and garages. | Use a-z, 0-9 and `_`, rename files to match. |
| No carvariations entry | Warning | No default colours and no mod kit, tuning menus stay empty. | Add an entry with colours and `<kits>` (`0_default_modkit` if no custom parts). |
| Also a base game car | Warning | A streamed `.yft` with a base game model name replaces that car for everyone, traffic too. | Rename the model if it is meant as a new car. |

### handling.meta

| Check | Severity | What it means | How to fix |
|---|---|---|---|
| No handlingId | Error | Entry without `<handlingId>`. | Set it to a `<handlingName>` from handling.meta. |
| handlingId not in any handling.meta | Error | Keeps the car from spawning or crashes the client. | Add the handling entry or fix the id. |
| Uses base game handling | Note | The id is a base game handling name. | Fine if on purpose. |
| handling without handlingName | Error | Empty `<handlingName>`. | Use the name vehicles.meta refers to. |
| handling not used | Note | No vehicle in the pack uses it. | Check for a typo or remove it. |
| handling changes a base game car | Warning | The name is a base game handling, so every car of that model on the server drives differently. | Rename it and point `handlingId` at the new name. |
| handlingName defined more than once | Warning | Only the last one loaded is used, start order decides. | Keep one, or give each car its own name. |

### Mod kits (carcols and carvariations)

| Check | Severity | What it means | How to fix |
|---|---|---|---|
| carvariations for an unknown model | Warning | No vehicles.meta defines that `modelName`. | Fix the typo or add the missing vehicles.meta. |
| No mod kit | Note | `<kits>` is empty, tuning menus show nothing. | Add `<Item>0_default_modkit</Item>` or the car's own kit. |
| Kit not in any carcols.meta | Warning | The car gets no tuning parts. | Match the `<kitName>` exactly or load the carcols.meta that has it. |
| Kit has no numeric id | Error | `<id value="..." />` missing or not a number. | Give every kit a unique id. |
| Kit id above 65535 | Error | Kit ids are 16 bit, it wraps and collides. | Pick an unused id between 1000 and 65535. |
| Kit id used by the base game | Warning | Tuning parts get mixed with a game car's kit. Game ids run 0 to 640 and 999. | Move yours above 1000 and keep a list across your packs. |
| Kit not used by any car | Note | No carvariations entry lists it. | Add it to the car's `<kits>`. |
| Tuning parts with no .yft | Warning | `visibleMods` or `linkMods` model missing, the part shows in the menu but is invisible. | Stream the `.yft` or remove the entry. |
| Kit id used by several kits | Error | Two kits with different names share an id, across resources too. | Give all but one a new id. |
| Kit name with different ids | Warning | carvariations picks kits by name, so only one is used. | Rename one kit and update its carvariations. |

### Sirens

| Check | Severity | What it means | How to fix |
|---|---|---|---|
| sirenSettings not defined | Warning | The id in carvariations exists in no carcols.meta or the game. Lights stay dark. | Load the carcols.meta with that siren id or use one that exists. |
| Siren id above 255 | Warning | FiveM keeps 8 bits, so 300 acts as 44 ([citizenfx/fivem issue 2612](https://github.com/citizenfx/fivem/issues/2612)). | Use a free id between 21 and 254. |
| Siren id taken by the base game | Warning | Game ids are 0 to 20. The patterns overwrite each other. | Pick a free id above that. |
| Siren settings share an id | Error | Also after the 255 wrap. Only one wins, other cars flash the wrong pattern. | Give each its own id and update `sirenSettings`. |

### Engine sound

| Check | Severity | What it means | How to fix |
|---|---|---|---|
| No audioNameHash | Note | Empty on a new model, so the car falls back to a generic engine. | Set it to a base car (`ADDER`, `SULTAN`) or your sound pack name. |
| Sound not in this pack's game.dat | Warning | The pack has sound files but none of its `.dat151.rel` files defines a sound with that name. | Check the spelling against the sound pack. |
| Sound is not a base game sound | Warning | No sound pack in the drop. Silent or default sound unless another resource streams it and starts first. | Ship the sound pack or use a base car name. |
| Audio file never loaded | Error | A `.dat151.rel`, `.dat54.rel` or `.dat10.rel` has no matching `AUDIO_GAMEDATA`, `AUDIO_SOUNDDATA` or `AUDIO_SYNTHDATA` line (or the wrong type). | Add `data_file '<TYPE>' '<path without the number and .rel>'` and list the `.rel` in `files { }`. |
| Sound folder has no AUDIO_WAVEPACK | Error | A folder of `.awc` files is never mounted. The car is silent. | Add `data_file 'AUDIO_WAVEPACK' '<folder>'` and list the `.awc` files. |

### Asset size

| Check | Severity | What it means | How to fix |
|---|---|---|---|
| Oversized asset | Warning over 16 MiB, Error over 48 MiB | The file's physical or virtual memory size, the number the server prints in its "Asset uses X MiB of physical memory" warning. FiveM says assets over 48 MiB "can and WILL lead to streaming issues". | `.ytd`: 2048 px is plenty for a body, 512 to 1024 for details, DXT1/BC1 without alpha. Models: fewer polygons, textures out to the `.ytd`. |
| Large file (header unreadable) | Warning | Escrowed or unreadable header and the file is over 16 MiB on disk. Only a hint. | Check it in CodeWalker. |

### File and folder names

| Check | Severity | What it means | How to fix |
|---|---|---|---|
| Resource folder name | Error with spaces, Warning with other symbols | `ensure` cannot start a name with spaces. | Rename to lowercase letters, numbers, `_` or `-`. |
| Paths with spaces | Warning | Break globs and some hosting panels. | Use underscores and update metas and manifest. |
| Stream files with special characters | Warning | The asset name no longer matches what the metas ask for. | Rename to plain lowercase names. |
| Stream files with uppercase | Note | Works, the game ignores case. | Lowercase avoids typos. |
| Escrowed resource | Note | `.fxap` found. Only runs with the owning license key, sizes are estimated. | Do not rename or move escrowed files. |

### Conflicts between resources

| Check | Severity | What it means | How to fix |
|---|---|---|---|
| modelName defined more than once | Error | Only one definition wins, start order decides. | Keep one, or rename a car. |
| Stream files in several resources | Warning | One finding per group of resources that share file names. The last started wins. | Often the same car installed twice: remove one. |

Handling, kit, kit name and siren duplicates across resources are also listed under Conflicts.

## Example

A typical manifest from the fxmanifest tab for a car with its own engine sound:

```lua title="fxmanifest.lua"
fx_version 'cerulean'
game 'gta5'

client_scripts {
    'client.lua',
}

files {
    'data/handling.meta',
    'data/vehicles.meta',
    'data/carcols.meta',
    'data/carvariations.meta',
    'audioconfig/mycar_game.dat151.rel',
    'audioconfig/mycar_sounds.dat54.rel',
    'sfx/dlc_mycar/*.awc',
}

data_file 'HANDLING_FILE' 'data/handling.meta'
data_file 'VEHICLE_METADATA_FILE' 'data/vehicles.meta'
data_file 'CARCOLS_FILE' 'data/carcols.meta'
data_file 'VEHICLE_VARIATION_FILE' 'data/carvariations.meta'
data_file 'AUDIO_GAMEDATA' 'audioconfig/mycar_game.dat'
data_file 'AUDIO_SOUNDDATA' 'audioconfig/mycar_sounds.dat'
data_file 'AUDIO_WAVEPACK' 'sfx/dlc_mycar'
```

And the display name the "No display name" note asks for:

```lua title="client.lua"
CreateThread(function()
    AddTextEntry('MYCAR', 'My Car GT')
end)
```

## Tips

- Drop all your car resources at once. Kit id, siren id, handling and stream file clashes only show up when the tool sees both sides.
- Keep one list of the kit and siren ids you use across packs. Base game kits run up to 640 (and 999), sirens up to 20.
- Links with `?sample` open the tool with the sample pack loaded, and `?tab=vehicles` or `?tab=manifest` picks the tab that opens after a check.

> [!WARNING]
> If a check is clean and a car still misbehaves, open the F8 console while you spawn it and look for streaming errors. This tool does not open the models.

## Limitations

- It reads metas and file headers. It does not open the models, so it cannot see a broken mesh, missing bones or a wrong embedded texture.
- Escrowed (`.fxap`) stream files are encrypted, so their memory size is estimated from the file size.
- A sound that another resource provides cannot be seen from here. The finding says so instead of calling it broken.
- Handling values themselves are not judged. Use the handling editor for that.
- Everything runs in your browser. Nothing is uploaded.

## Related tools

- [Vehicle Handling Editor](/docs/tools/vehicle-handling-editor)
- [Vehicle Sirens](/docs/tools/vehicle-sirens) to build siren settings with free ids
- [YTD Optimizer](/docs/tools/ytd-optimizer) for oversized texture dictionaries
- [Native Audio Builder](/docs/tools/native-audio-builder) for custom sound banks
- [fxmanifest Generator](/docs/tools/fxmanifest-generator)
