Obsi Inventory reads its options from the upstream convars and from five files in `data/obsi/`.
Values saved in the admin panel are stored in the database and take priority over the files.

## Files

| File | Contents |
| --- | --- |
| `data/obsi/core.lua` | Slot layout, player defaults, clothing, weight effects, throwing, plates, fast actions, ped camera |
| `data/obsi/interact.lua` | Give, trade, world containers, target options, discovery, shops, weapon attachments |
| `data/obsi/admin.lua` | Admin command and key, roles, addon defaults, history, security |
| `data/obsi/rarity.lua` | Default rarities |
| `data/obsi/staff.lua` | Staff identifiers (server side only) |
| `locales/<lang>.json` | Every string; English and Polish are complete |

The upstream files (`data/items.lua`, `data/shops.lua`, `data/stashes.lua`, `data/crafting.lua` and the rest) keep their format.

## Convars

The upstream convars still apply. The ones you usually set:

| Convar | Default | Meaning |
| --- | --- | --- |
| `inventory:framework` | | `esx`, `qbx`, `ox` or `nd` |
| `inventory:slots` | `35` | Total player slots |
| `inventory:target` | `false` | Use `ox_target` for shops and stashes |
| `inventory:keys` | `["F2", "K", "TAB"]` | Inventory, secondary inventory and hotbar keys |

Use `setr` so the client can read them, for example `setr inventory:slots 35`.

## core.lua

### Slot layout

```lua
pockets = 5,      -- slots 1-5, hotbar keys 1-5
baseSlots = 25,   -- slots 6-25 always open; the rest needs a backpack
```

See [Slots and backpacks](/inventory/features/slots-and-backpacks).

### Player defaults

The settings every new player starts with.
Each player's own copy is stored on their client.

```lua
defaults = {
    accent = '#E5122E',          -- any hex / rgb() / hsl() colour
    secondary = '#121417',       -- console background colour
    theme = 'graphite',          -- graphite | carbon | slate
    sharp = true,                -- square corners
    font = 'Inter',              -- Inter | Segoe UI
    scale = 100,                 -- 70 to 130 %
    density = 'comfortable',     -- comfortable | compact
    clothingColumn = true,
    clothingSide = 'center',     -- left | center | right
    pedPreview = true,
    pedCamera = true,
    notifyStyle = 'compact',     -- compact | minimal
    streamer = false,
    sounds = true,
},
```

### Other sections

| Key | Page |
| --- | --- |
| `clothing` | [Clothing](/inventory/features/clothing) |
| `weight` | [Slots and backpacks](/inventory/features/slots-and-backpacks#weight-effects) |
| `throw` | [Throwing](/inventory/features/throwing) |
| `plates` | [Items and rarity](/inventory/features/items-and-rarity#armour-plates) |
| `fastActions` | Buttons in the **FAST ACTIONS** strip: hands up, undress, hanger, trade, give |
| `item` | `renameMax = 32`, `describeMax = 160` |
| `pedMode` | `'clone'` or `'pause'`, how the character copy is drawn |
| `ped` | Camera `fov = 40.0` and `easeMs = 160` |
| `status` | `interval = 500` ms between status updates while open |

## interact.lua

| Key | Page |
| --- | --- |
| `give` | [Give and trade](/inventory/features/give-and-trade#drag-and-give) |
| `trade` | [Give and trade](/inventory/features/give-and-trade#trade-settings) |
| `search` | Search animation for dumpsters and trunks |
| `target` | Extra `ox_target` options for dumpsters, trunks, stashes and evidence when `inventory:target` is off |
| `discovery` | [Items and rarity](/inventory/features/items-and-rarity#item-discovery) |
| `shop` | [Shops](/inventory/features/shops) |
| `attachments` | [Weapon attachments](/inventory/features/weapon-attachments) |

## admin.lua

```lua
admin = {
    command = 'invadmin',        -- false = no command
    key = nil,                   -- e.g. 'F10'
    superAce = 'group.admin',    -- players with this ace get every page
    rateLimit = { calls = 30, window = 3000 },
    roles = { ... },             -- see Permissions
},
```

### History

```lua
history = {
    enabled = true,
    retentionDays = 30,      -- 0 = keep forever
    flushInterval = 5000,    -- ms between batched inserts
    maxBuffer = 500,
    ignore = {},             -- e.g. { open = true, close = true }
},
```

### Security

| Setting | Default | Meaning |
| --- | --- | --- |
| `autoKick` | `false` | Drop players on severe reports |
| `distanceCheck` | `true` | Report opens and drops from too far away |
| `maxDistance` | `10.0` | Metres for that check |
| `emergencyLock` | `false` | Blocks every inventory from opening (never saved) |
| `retention` | `100` | Reports kept in memory for the Security page |
| `imageHosts` | `r2.fivemanage.com`, `i.fmfile.com` | Hosts allowed for item image URLs |
| `severe` | `malformed`, `locked_slot`, `exploit` | Report kinds treated as severe |

`logHookRejections`, `trimPlates`, `logLevel` and `evidenceGrade` are live copies of the matching upstream convars.

### Addon defaults

`features` holds the default state of every addon on the [Addons](/inventory/admin/admin-panel#addons) page.
The default applies until an admin flips the switch; from then on the database value is used.
