> 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/standalone.md).

# Standalone

Runs the resource with **no framework at all** — no ESX, no QBCore, no QBox.

```lua
Config.Framework = 'standalone'
```

## It is never auto-detected

You have to set it by hand. Detection deliberately does *not* fall back to standalone when no framework answers.

The reason: if `es_extended` merely started late, an auto-fallback would quietly record canvases against a `license:` identifier instead of the character identifier. Everything would appear to work, and the mismatch would only surface later as players finding their canvases unowned. A wrong-but-silent default is worse than an explicit one, so if no framework is detected the resource says so and stays fail-closed.

## What changes

|                 | Standalone                                                                                             |
| --------------- | ------------------------------------------------------------------------------------------------------ |
| Player identity | the player's `license:` identifier                                                                     |
| Admin           | ace only — `add_ace group.admin tyrix.frames.admin allow`                                              |
| Items           | **none** — skip [Item Setup](/docs/script-resources/tyrix-frames/item-setup.md) entirely               |
| Placement       | `/placecanvas <size>` or the `StartPlacement` [export](/docs/script-resources/tyrix-frames/exports.md) |
| Pickup          | removes the canvas, returns nothing. The option reads **Remove Canvas**                                |
| Photo on pickup | discarded — there is no item to store it in                                                            |
| Limit           | `Config.PlacementLimit` is the only economy                                                            |

Everything else is identical: the editor, the collection, the admin panel, Discord logging, routing buckets, all five languages.

## Identity is per-account, not per-character

There are no characters, so `license:` is the right key. It is stable across sessions and present on every connection.

One consequence worth knowing: `Config.PlacementLimit` is documented as per-character, and in standalone that means per-account, because they are the same thing.

## Why standalone means itemless

ox\_inventory cannot run without a framework. It loads its bridge as a directory path — `modules/bridge/<framework>/server.lua` — and only `esx`, `nd`, `ox` and `qbx` exist; anything else hard-errors on start. Overextended's own documentation says an unsupported framework means writing that bridge yourself, and offers no help doing it.

Rather than pretend otherwise, standalone always runs itemless. If you *have* solved the inventory problem on your server, you can still use the `StartPlacement` export from your own code.

## Getting canvases to players

### The command

```
/placecanvas 16x20
```

Any player can use it. Valid sizes are `8x8`, `8x10`, `11x14`, `12x12`, `16x20`, `20x24`, `20x30`. It only exists in itemless mode.

Placement still runs every gate that matters — alive, not in a vehicle, rate limited, and under the placement limit.

### The export

```lua
exports.tyrix_frames:StartPlacement(source, '16x20')
```

Drive it from your own shop, reward or menu resource. See [Exports](/docs/script-resources/tyrix-frames/exports.md).

## Controlling who can place

By default any player can place up to `Config.PlacementLimit.default`. Two ways to change that:

**Tiered allowances.** Keep the command available and give specific people more, via `Config_SV.PlacementOverrides` keyed by `license:` or `discord:`.

**Gate it entirely.** Set `default = 0`… and note that `0` means *unlimited*, not *none*. There is no "nobody can place" setting, because the command is the feature. If you want placement to be a purchased or earned privilege, the clean way is to leave the limit at a sane number and drive placement from your own script through the export rather than telling players about `/placecanvas`.

## Itemless on a framework server

Standalone forces itemless, but the reverse is also available: set `Config.Inventory = 'none'` on an ESX/QB/QBox server to keep framework identity and admin groups while dropping the item requirement.

That is a reasonable setup for a creative or build server where canvases are scenery rather than an economy item.

{% hint style="warning" %}
**One migration hazard.** Canvases placed while itemless cost nothing. If you later switch to a real inventory, every one of them becomes pickup-able for a real item. On a populated server that is a lot of free items appearing at once. Either switch before players start placing, or wipe the table when you do.
{% endhint %}
