> For the complete documentation index, see [llms.txt](https://tyrix.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://tyrix.gitbook.io/docs/script-resources/tyrix-frames/item-setup.md).

# Item Setup

Seven items, one per canvas size. **Use the table for your inventory only.** The item names are identical across all three and are referenced internally - do not rename them.

{% hint style="info" %}
Running [Standalone](/docs/script-resources/tyrix-frames/standalone.md) or `Config.Inventory = 'none'`? Skip this page entirely. There are no items.
{% endhint %}

## ox\_inventory

Add to `ox_inventory/data/items.lua`, then restart ox\_inventory:

```lua
['tyrix_frame_8x8']   = { label = 'Photo Canvas (8" x 8")',   weight = 500,  stack = false, close = true, consume = 0, description = 'A blank canvas. Place it, hang your memories.', server = { export = 'tyrix_frames.useFrame' } },
['tyrix_frame_8x10']  = { label = 'Photo Canvas (8" x 10")',  weight = 600,  stack = false, close = true, consume = 0, description = 'A blank canvas. Place it, hang your memories.', server = { export = 'tyrix_frames.useFrame' } },
['tyrix_frame_11x14'] = { label = 'Photo Canvas (11" x 14")', weight = 900,  stack = false, close = true, consume = 0, description = 'A blank canvas. Place it, hang your memories.', server = { export = 'tyrix_frames.useFrame' } },
['tyrix_frame_12x12'] = { label = 'Photo Canvas (12" x 12")', weight = 800,  stack = false, close = true, consume = 0, description = 'A blank canvas. Place it, hang your memories.', server = { export = 'tyrix_frames.useFrame' } },
['tyrix_frame_16x20'] = { label = 'Photo Canvas (16" x 20")', weight = 1400, stack = false, close = true, consume = 0, description = 'A blank canvas. Place it, hang your memories.', server = { export = 'tyrix_frames.useFrame' } },
['tyrix_frame_20x24'] = { label = 'Photo Canvas (20" x 24")', weight = 1800, stack = false, close = true, consume = 0, description = 'A blank canvas. Place it, hang your memories.', server = { export = 'tyrix_frames.useFrame' } },
['tyrix_frame_20x30'] = { label = 'Photo Canvas (20" x 30")', weight = 2200, stack = false, close = true, consume = 0, description = 'A blank canvas. Place it, hang your memories.', server = { export = 'tyrix_frames.useFrame' } },
```

| Field           | Why it matters                                                                                                                       |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| `stack = false` | **Required.** Each canvas carries its own photo in metadata. Stacked canvases share one metadata blob, so a stack would lose photos. |
| `consume = 0`   | **Required.** The server removes the item only after a validated placement. `consume = 1` burns the canvas on a cancelled placement. |
| `server.export` | **Required.** This is how ox tells the script the item was used. Without it the item does nothing.                                   |

Icons: copy `web/images/` into `ox_inventory/web/images/`.

## qb-inventory

Also covers **ps-inventory**, **lj-inventory** and **qs-inventory** - the script talks to qb-core's `Player.Functions`, which all of them keep.

Add to `qb-core/shared/items.lua`, then restart qb-core:

```lua
['tyrix_frame_8x8']   = { name = 'tyrix_frame_8x8',   label = 'Photo Canvas (8" x 8")',   weight = 500,  type = 'item', image = 'tyrix_frame_8x8.png',   unique = true, useable = true, shouldClose = true, combinable = nil, description = 'A blank canvas. Place it, hang your memories.' },
['tyrix_frame_8x10']  = { name = 'tyrix_frame_8x10',  label = 'Photo Canvas (8" x 10")',  weight = 600,  type = 'item', image = 'tyrix_frame_8x10.png',  unique = true, useable = true, shouldClose = true, combinable = nil, description = 'A blank canvas. Place it, hang your memories.' },
['tyrix_frame_11x14'] = { name = 'tyrix_frame_11x14', label = 'Photo Canvas (11" x 14")', weight = 900,  type = 'item', image = 'tyrix_frame_11x14.png', unique = true, useable = true, shouldClose = true, combinable = nil, description = 'A blank canvas. Place it, hang your memories.' },
['tyrix_frame_12x12'] = { name = 'tyrix_frame_12x12', label = 'Photo Canvas (12" x 12")', weight = 800,  type = 'item', image = 'tyrix_frame_12x12.png', unique = true, useable = true, shouldClose = true, combinable = nil, description = 'A blank canvas. Place it, hang your memories.' },
['tyrix_frame_16x20'] = { name = 'tyrix_frame_16x20', label = 'Photo Canvas (16" x 20")', weight = 1400, type = 'item', image = 'tyrix_frame_16x20.png', unique = true, useable = true, shouldClose = true, combinable = nil, description = 'A blank canvas. Place it, hang your memories.' },
['tyrix_frame_20x24'] = { name = 'tyrix_frame_20x24', label = 'Photo Canvas (20" x 24")', weight = 1800, type = 'item', image = 'tyrix_frame_20x24.png', unique = true, useable = true, shouldClose = true, combinable = nil, description = 'A blank canvas. Place it, hang your memories.' },
['tyrix_frame_20x30'] = { name = 'tyrix_frame_20x30', label = 'Photo Canvas (20" x 30")', weight = 2200, type = 'item', image = 'tyrix_frame_20x30.png', unique = true, useable = true, shouldClose = true, combinable = nil, description = 'A blank canvas. Place it, hang your memories.' },
```

| Field            | Why it matters                                                                                                        |
| ---------------- | --------------------------------------------------------------------------------------------------------------------- |
| `unique = true`  | **Required.** QB's equivalent of ox's `stack = false`. Without it two canvases share a stack and one photo is lost.   |
| `useable = true` | **Required.** The script registers the use handler itself, but QB will not fire it unless the item is marked useable. |

There is no `consume` field to set - the script removes the item only after a validated placement.

Icons: copy `web/images/` into `qb-inventory/html/images/`, or your fork's image folder.

## ESX native inventory

Run once against your database, then restart `es_extended`:

```sql
INSERT INTO `items` (`name`, `label`, `weight`, `rare`, `can_remove`) VALUES
    ('tyrix_frame_8x8',   'Photo Canvas (8" x 8")',   1, 0, 1),
    ('tyrix_frame_8x10',  'Photo Canvas (8" x 10")',  1, 0, 1),
    ('tyrix_frame_11x14', 'Photo Canvas (11" x 14")', 1, 0, 1),
    ('tyrix_frame_12x12', 'Photo Canvas (12" x 12")', 1, 0, 1),
    ('tyrix_frame_16x20', 'Photo Canvas (16" x 20")', 2, 0, 1),
    ('tyrix_frame_20x24', 'Photo Canvas (20" x 24")', 2, 0, 1),
    ('tyrix_frame_20x30', 'Photo Canvas (20" x 30")', 2, 0, 1);
```

Older ESX schemas omit `rare` and `can_remove` - drop those two columns and their values if your `items` table does not have them.

{% hint style="warning" %}
**Photos are not kept on pickup here.** ESX's native inventory stores only a name and a count per item, with nowhere to put the photo. The script detects this, forces `Config.WipeOnPickup = true`, and logs a line at startup. Run ox\_inventory or qb-inventory if you want canvases to keep their photo.
{% endhint %}

## Selling the items

There is no shop built in - sell the items through whatever shop, crafting or reward system your server already uses. The item names above are all you need.

If you want to grant a placement without an item at all, see the `StartPlacement` [export](/docs/script-resources/tyrix-frames/exports.md).
