THE ORB
Starting the studio

How to add custom props to FiveM

Updated October 11, 2026 · 5 min read

A custom prop is a resource with the model as a .ydr (with its collision inside), its textures, and a .ytyp archetype that registers the model name. Its fxmanifest.lua loads the .ytyp with data_file 'DLC_ITYP_REQUEST'. Put the folder in resources, add ensure to server.cfg, restart, and spawn the prop by name with CreateObject.

The files a prop needs

FileWhat it isNeeded?
.ydrThe drawable: the mesh and its materials. The collision can live inside it.Yes
.ytdThe texture dictionary. Textures can also be embedded in the .ydr.If the textures are not embedded
.ytypThe archetype: registers the model name with its bounds and draw distance.Yes, to spawn it by name
.ybnCollision as a separate file. For a prop spawned by name, put the collision inside the .ydr instead.No
fxmanifest.luaThe resource manifest.Yes

The folder and the fxmanifest.lua

Folder
my_prop/
  fxmanifest.lua
  stream/
    my_prop.ydr
    my_prop.ytd
    my_prop.ytyp
fxmanifest.lua
fx_version 'cerulean'
game 'gta5'

files {
    'stream/**/*.ydr',
    'stream/**/*.ytd',
    'stream/**/*.ytyp',
}

-- Registers the archetype so the game knows this model exists.
data_file 'DLC_ITYP_REQUEST' 'stream/**/*.ytyp'

Without the data_file line the model streams, but CreateObject returns 0 or an invisible prop.

Install it and spawn it

  1. 1

    Copy the folder

    Put my_prop/ in your server's resources/ folder.

  2. 2

    Start it

    Add ensure my_prop to server.cfg.

  3. 3

    Restart

    Restart the server, or run refresh and then ensure my_prop in the server console.

Spawn it from a client script
local model = `my_prop`
RequestModel(model)
while not HasModelLoaded(model) do Wait(0) end
-- The 7th argument (dynamic) must be true for a prop that moves with physics.
local obj = CreateObject(model, x, y, z, true, false, true)
SetModelAsNoLongerNeeded(model)

The model name is what the hash resolves to, so keep it unique on your server.

Props converted with THE ORB Studio also carry a client.lua with a chat command named after the prop: stand where you want it and type /my_prop, and it is placed on the ground in front of you, facing your direction, and frozen in place. /my_prop undo removes the last one. Props placed this way are not saved to any file and are gone after a server restart. To place a prop permanently, add it to a map file (.ymap), for example with CodeWalker.

Route 1: Blender and Sollumz

  1. 1

    Install

    Blender and the free Sollumz add-on (from the Sollumz GitHub releases page).

  2. 2

    Import and check the size

    GTA V works in metres. A model exported at the wrong scale shows up 100 times too big or too small.

  3. 3

    Set up the materials

    Turn the model into a Sollumz drawable and give its materials GTA shaders, for example normal_spec, or emissive for parts that glow.

  4. 4

    Convert the textures to DDS

    The game only uses DDS textures and Blender cannot write them. Microsoft's texconv converts them from the command line. A prop exported without DDS textures comes out untextured.

  5. 5

    Build the collision

    Make a copy of the mesh into a bound composite and give it a collision material (wood, metal, concrete…). Parent it under the drawable so Sollumz exports it inside the .ydr.

  6. 6

    Export

    Set Sollumz to export the native format for the legacy game (GEN8). It can also write CodeWalker XML and the Enhanced format (GEN9), and FiveM streams neither. Export the .ytyp too; if your Sollumz version writes it as .ytyp.xml, import it in CodeWalker to get the binary file.

  7. 7

    Package

    Copy the .ydr, .ytd and .ytyp into stream/ with the fxmanifest.lua above.

Route 2: from a GLB, with the converter

The GLB to FiveM Converter does route 1 on our server, with Blender and Sollumz already set up, and shows you the model first:

  1. 1

    Drop a .glb or .gltf

    That is what Meshy, Blender and Sketchfab export. You can also pick a model from Sketchfab after connecting your account.

  2. 2

    Check the size

    The model stands next to a 1.80 m person on a metre grid, so a prop exported 100 times too big is obvious before it reaches your server.

  3. 3

    Pick what it is

    Hand item, Furniture, Street prop or Hero piece. Each one sets a triangle and texture budget, and the converter scores how heavy the model is against it.

  4. 4

    Pick what it is made of

    The collision surface: wood, metal, concrete, glass, rubber, cloth and more. It decides how the prop sounds and reacts when it is shot, hit or walked on.

  5. 5

    Download

    A zip with fxmanifest.lua, the files in stream/ with the collision inside the .ydr, an INSTRUCTIONS.txt and the /command described above (you can leave it out).

Free to try with your Discord login: 10 exports the first month and 5 a month after on the Free plan, unlimited on any paid plan. Each conversion is one export.

Route 3: no model yet

The FiveM Prop Generator makes the model from a sentence ("a weathered wooden crate") or a reference photo, in about a minute. You preview it at real scale next to a 1.80 m figure, and one click sends it to the converter. Generating uses AI credits: paid plans include them every month, and on the Free plan it needs the Pro Pass or a credit pack. You only spend them if a model comes back. See pricing.

Keep it light

A prop that looks fine in a viewer can still cost the server. These are the budgets our converter uses:

TypeUsed forTrianglesTextures
Hand itemheld, thrown, on a table10,0002048 px
Furnitureinteriors, shops, houses12,0002048 px
Street propstalls, signs, decoration15,0002048 px
Hero piecea centrepiece, seen up close50,0004096 px

It also warns about textures above 2048 px, textures or files over 8 MB, more than 4 materials, and a model longer than 20 m or shorter than 5 cm. A texture dictionary over about 16 MB is skipped by FiveM: see Streaming asset over the size limit.

Turn a model into a prop

Drop a .glb, check its real size and weight, and download a resource with the .ytyp, the collision and a /command to place it. Free to try with your Discord login: 10 exports the first month and 5 a month after on the Free plan, unlimited on any paid plan.

Frequently asked questions

Why is my custom prop invisible in FiveM?

Usually the .ytyp is missing or the fxmanifest does not load it with data_file 'DLC_ITYP_REQUEST'. Then the model streams but CreateObject returns 0 or an invisible prop. Also check that the resource is started and the model name matches everywhere.

Why do players walk through my prop?

The game is not loading a collision for it. In our converter, a standalone .ybn next to a prop spawned by name was not loaded, so put the collision inside the .ydr (in Sollumz, parent the bound composite under the drawable).

Why is my prop white or untextured?

The textures are not DDS, the .ytd name does not match what the model asks for, or the .ytd is not in the stream folder. See Missing textures.

A thrown prop goes through walls. Why?

A prop with a mesh collision is treated by GTA as static world collision, and a fast-moving dynamic prop can pass through it. For thrown props, give the prop a primitive bound in Blender, or check the hit in your script with a swept shape test.

Do custom props work on ESX and QBCore?

Yes. A prop is a streamed resource, not a framework feature, so it works the same on any framework.

More guides