One Studios

One Inventory now provides the ox_inventory resource name, so scripts that look for ox find it and keep working across restarts, and migration no longer needs the old inventory running. This release also adds prop locations for stashes and benches, prop-model shops, cash-or-bank shops, separate holster animations, double-click to use, and a long list of fixes. Scroll to Updating for exactly which files to replace, add, and remove.

⚠️ Before you update

  • Remove ensure ox_inventory from server.cfg. One Inventory now provides the ox_inventory name. A real ox_inventory that is still started takes the name over and the compatibility layer steps aside until it is stopped. Migrating from it? Keep its folder under another name (for example ox_inventory_old) if you still want to import its definitions. See Migrate Inventory.
  • QBox patches 5 and 6 are no longer needed. dependency 'ox_inventory' lines in ox_fuel and qbx_ambulancejob now resolve to One Inventory; removed lines can stay removed. Patch 1 is still required. See QBox.
  • ox hook payloads now use ox's inventory ids. Hooks registered through exports.ox_inventory:registerHook receive the stash name, trunk<plate>, glove<plate> and drop-<id> instead of One Inventory's prefixed ids, so filters and comparisons written for ox match. If you matched the prefixed form inside an ox hook, update the pattern. Native beforeX hooks are unchanged. See Backwards Compatibility.

✨ Added

  • Drop-in ox_inventory replacement. GetResourceState('ox_inventory'), dependency 'ox_inventory' and the exports.ox_inventory functions all resolve to One Inventory, and they survive restart one_inventory: consuming scripts refresh their exports and re-register their hooks exactly as with the real ox_inventory. See Backwards Compatibility.
  • Migration reads ox data from the database. The wizard detects ox_inventory from its database table, so the old resource no longer has to run. Definitions are read from any renamed copy of the folder; without one, inventories still migrate and the wizard says definitions are unavailable. The adapter card shows where the source was found, the container count, and the date of a completed migration. See Migrate Inventory.
  • Prop locations for stashes and crafting benches. A new "Prop (Object)" location type spawns a locker, shelf, crate or workbench at the spot you place it in-game (walk there, adjust rotation and height, save). Players interact through your target script, or with a TextUI prompt when none is running. (suggested on Discord and here)
  • Prop-model shops. A shop can be bound to one or more object models, so every vending machine or counter of that model sells its inventory, with nothing to place. The ox migration imports ox's model shops into it. (suggested on Discord)
  • Cash or bank shops. A shop set to "Cash or Bank" lets the buyer pick the account on every purchase, including drag-to-buy. (suggested on Discord)
  • Separate holster animation. Weapons have a Draw and a Holster animation; Holster defaults to "Same as draw animation", and a new weapon_holster animation is seeded and pre-selected for new weapons. (suggested on Discord)
  • Clear vehicle storage on destruction. An optional Gameplay setting wipes a vehicle's trunk and glovebox when the vehicle is actually destroyed, never on damage alone. Off by default; wipes are logged. (suggested on Discord)
  • Drag-to-buy into the slot you choose. Dragging a shop item onto an empty slot puts it there, even when a stackable copy sits elsewhere. (suggested on Discord and here)
  • Double-click to use or open. Double-clicking a usable item uses it, double-clicking a backpack opens it, wherever the context menu offers the same action. The hotbar key of a backpack slot now opens the inventory with that bag. The hover hints and the keybinds dialog show the shortcut. (suggested on Discord)
  • Rename a backpack from its modal. A pencil icon in the container modal header renames your own bag; the label updates live for everyone viewing it. (suggested on Discord)
  • Duplicate an item. Copies every setting of an item into a new unsaved item so you only fill in the name. (suggested on Discord)
  • Rarity column. The admin Items table shows each item's rarity. (suggested on Discord)
  • Drop prop collision toggle. Turn off collision on drop props so drops can no longer be stacked into a road block. On by default. (suggested on Discord)
  • HUD updates on QB status changes. Hunger and thirst changes from used items now reach HUD resources such as jg-hud.

🔌 Exports

  • RegisterItemButton (server). Can now be called while your resource starts; buttons registered before definitions are loaded apply once they are.
  • RegisterShop (server). currency accepts both for cash-or-bank shops.
  • ox compatibility (server and client). New Inventory, ItemList, GetInventories and SwapSlots on the server and ItemList on the client. RegisterStash, setPlayerInventory, weaponWheel, setStashTarget, suppressItemNotifications and setGetPlayerNameMethod are accepted as no-ops, and RegisterStash also answers on exports.one_inventory. See Backwards Compatibility.

🪝 Hooks & events

  • Shop payloads. beforeShopPurchase and onShopPurchased report the account actually charged in currency, and toSlot is the slot the buyer dropped the item on (nil for auto placement). See Hooks.
  • Hook logging. With debug prints on, every hook registration, removal and cancel is logged with the owning resource, its filters and the inventories involved, and all active hooks are listed once the server is ready. See Hooks.

🛠️ Fixed

  • Inventories load again on FiveM server artifacts from mid-August 2026 onward, which failed with a "protected metatable" error and left players without an inventory.
  • ox GetItemSlots no longer errors and now returns the slots, total count and free slots like ox.
  • ox RemoveInventory no longer wipes the contents of stashes and trunks; it only evicts the inventory from memory like ox.
  • ox Items('WEAPON_PISTOL') finds weapons regardless of casing.
  • ox ClearInventory accepts a single item name for keep, and clears a stash that nobody has opened yet.
  • Compatibility export failures are now reported in red in the server console, with the calling resource and the export name, instead of only in debug output.
  • RegisterStash calls no longer print errors; stashes are created the first time they are opened.
  • Calling an ox-only name on exports.one_inventory now tells you which resource called it and which export to use.
  • A hook cancelling an action is logged with the resource that owns it instead of a bare id.
  • RegisterItemButton no longer fails with "no definition named" when called while a resource starts.
  • The migration wizard's "already populated players" count is correct on QBox.
  • The Overview page's competing-inventory badge is live instead of a boot-time snapshot.
  • Crafting benches with the NPC location type are saved as NPC instead of marker, and the ped shows without a restart.
  • Switching an existing bench from marker to target keeps the zone defaults, and the table badge shows NPC and Prop benches correctly.
  • The Arc hotbar layout fits all 10 slots on screen, and large item counts no longer overlap the key number.

♻️ Changed

  • NPC location editor. Shops, crafting benches and licenses share the same card layout as marker and target locations: X/Y/Z and heading fields, pick and delete per row, add and place in-game buttons. Model and scenario pickers show an explicit "Use ..." row for custom values.

📦 Updating

Back up your install first, especially any open-source files you've edited. folder/* below means every file in that folder; folder/**/* means every file in it and its subfolders.

Replace with the new build:

  • fxmanifest.lua, init.lua
  • client/utils.lua, client/modules/*, client/compat/*
  • server/main.lua, server/utils.lua, server/seed.lua, server/modules/*, server/classes/**/*, server/compat/*
  • web/dist/**/*
  • locales/* (keys were added and changed across every locale file). Replace wholesale, or merge with a diff tool if you maintain custom languages.

Open-source files (re-apply your local edits, or merge by hand). Only the functions to re-check are listed:

  • server/integrations/qb.lua: Framework.ApplyStatus function

Server config and setup:

  • Remove ensure ox_inventory from server.cfg if it is still there (see Before you update).
  • QBox: patches 5 and 6 from the install guide are no longer needed; patches 1 to 4 stay. See QBox.

No SQL to run: the new one_inv_migrations table, the weapon holster column and the seeded weapon_holster animation are created automatically on first start.

Restart the server after updating. Restarting one_inventory on its own is now safe for the compatibility exports as well.

Looking for the developer API? See the documentation. 📚

One Inventory is out of beta: 1.0.0 is here. This release ships a brand new visor inventory layout, two new hotbar layouts, the vertex theme, persistent per-plate trunk and glovebox sizes for owned cars, a smarter container weight system, docs shortcuts in the admin panel, plus a long list of fixes. Scroll to Updating for exactly which files to replace, add, and remove.

⚠️ Before you update

  • Container weight behaviour changed. Items inside a container (backpacks, bags) no longer add their weight to the inventory carrying it: a container now only weighs its own weight, and contents only fill the container's capacity. Prefer the old behaviour? Enable the new "Count Container Contents in Inventory Weight" toggle in the admin Gameplay tab.

✨ Added

  • Visor inventory layout. A brand new selectable inventory layout, joining minimal and immersive.
  • Arc & loadout hotbar layouts. Two new hotbar layouts to pick from, next to classic.

  • Vertex theme. A new inventory theme, joining modern and futuristic.
  • Per-plate trunk & glovebox sizes. Give an owned or upgraded car its own storage size with the new SetTrunkSize and SetGloveboxSize exports. Overrides win over the model and class storage definitions, survive server restarts, follow plate renames, and apply live to an already-open trunk or glovebox.
  • Container weight toggle. The new "Count Container Contents in Inventory Weight" option (Gameplay tab, off by default) decides whether the items inside a container weigh down the inventory carrying it, or the container is its own weight system.
  • Special items can be turned off. The identification, driver license and garbage item pickers now accept "None" to disable that behaviour entirely.
  • Docs shortcuts in the admin panel. A Documentation button in the sidebar opens the online docs, and every section header has a help icon that jumps straight to the matching docs page.

🔌 Exports

  • SetTrunkSize (server). New. Persistent per-plate trunk size override. Pass nil for a value to keep the definition value for that dimension, or nil for both to remove the override.
  • SetGloveboxSize (server). New. The same, for the glovebox.
  • UpdateVehiclePlate (server). Now also moves per-plate size overrides to the new plate.

🛠️ Fixed

  • Using an item now only drains that item's durability. Stacks split from the same original (lockpicks, for example) no longer share durability.
  • A custom metadata.label now shows everywhere: every inventory view and item type, all exports and ox/qb compat shapes, item buttons, the use progress bar, and the add/remove notifications.
  • With the clothing system disabled, dropped clothing can no longer be equipped. Clothing items now behave as normal items: quick-move works on them and the move and drop hover hints show.
  • Cash and black money now always merge into the existing stack, no matter how they are received.
  • Releasing a drag in the gaps between slots no longer drops the item on the ground, on any layout. A ground drop only happens when you release outside the inventory.
  • The inventory and hotbar keys no longer trigger while another resource's NUI has keyboard focus, so opening the txAdmin menu no longer opens your inventory too.
  • Drawing or holstering a weapon now cancels the animation you are playing first (hands up, emotes), so weapons no longer appear out of thin air.
  • weapon_license is an item again: the ox migration no longer classifies it as a weapon, and existing installs are cleaned up automatically on start.

📦 Updating

Back up your install first, especially any open-source files you've edited. folder/* below means every file in that folder; folder/**/* means every file in it and its subfolders.

Replace with the new build:

  • fxmanifest.lua
  • client/utils.lua, client/modules/*
  • server/main.lua, server/utils.lua, server/seed.lua, server/modules/*, server/classes/**/*, server/compat/*
  • web/dist/**/*
  • locales/* (keys were added and changed across every locale file). Replace wholesale, or merge with a diff tool if you maintain custom languages.

Open-source files (re-apply your local edits, or merge by hand). Only the functions to re-check are listed:

  • client/integrations/opensource.lua: CanOpenInventory function

No SQL to run: the new one_inv_vehicle_sizes table is created automatically on first start.

Restart the server after updating.

Looking for the developer API? See the documentation. 📚

Upload item images straight from your PC in-game with no restart, catch a post event after every hook, filter hooks like ox, pick blip sprites and colours visually instead of typing ids, plus a reworked state bag system and a long list of fixes. Scroll to Updating for exactly which files to replace, add, and remove.

⚠️ Before you update

  • State bags reworked (breaking). inv_busy no longer means "inventory open". It now means an inventory action is running (item use, hotbar use, ammo load). The open state moved to inv_open (with an invOpen ox alias). Always truthy-check the busy bags, never compare with == true. Scripts that read inv_busy as "inventory open" must read inv_open instead. See Statebags.
  • Hook changes (breaking). RemoveHook is now scoped to the calling resource: you can no longer remove another resource's hook by id, and RemoveHook(nil) removes all of your own. The ox compat registerHook now matches current ox exactly, returning a string hook id that doubles as the post-event name instead of the old numeric id. See Backwards Compatibility.
  • Parachute unequip moved. Re-using a parachute item no longer unequips it (it notifies that one is already equipped). Unequip is now a right-click "Unequip Parachute" button so it can't be triggered from the hotbar. See Parachutes.
  • ox setContainerProperties now uses runtime definitions. It creates or updates an in-memory container definition instead of a saved database row, and a saved admin container definition with the same name is refused (the database wins). See Backwards Compatibility.

✨ Added

  • In-game item image uploads. Upload an item image straight from your PC in the create and edit modal's image picker (shared by items, weapons, containers and clothing): paste with Ctrl+V or use Browse. Uploads save into web/images/ and show instantly for everyone with no restart. You can also add external image hosts in the config, and metadata.image / metadata.imageurl now accept full URLs. See the new Item Images guide.
  • Visual blip pickers. Blip sprites and colours are now picked from a visual grid across Shops, Crafting, Stashes and Licenses, instead of typing raw ids. Search all sprites by name, or enter an id manually for anything newer than the list.

  • Post-hook events. After every hooked action finishes, a post event fires with (success, payload), where success is false when a hook cancelled the action or it errored. A hook can now register for post events only. See Hooks.
  • Hook filters. RegisterHook now accepts print, itemFilter, inventoryFilter and typeFilter options, AND-combined with the same semantics as ox, so a hook only runs when all its filters pass. See Hooks.
  • Runtime container definitions. Register containers at runtime with the new CreateContainersDefinition export, exactly like runtime item definitions: in-memory, tagged in the admin panel, and never persisted.
  • Disarm export. A new client DisarmPlayer export (with an optional noAnim flag), plus backwards compatibility for the ox_inventory:disarm client event.

🔌 Exports

🪝 Hooks & events

  • Post-hook events. Every hook can now receive a post event after its action finishes. See Hooks.
  • Hook filters. print, itemFilter, inventoryFilter and typeFilter on both native and ox compat hooks. See Hooks.
  • Player server id in payloads. Hook and event payloads now expose the player's server id (a number) for player inventories in every inventory-reference field (inventoryId, fromInventory, toInventory). Non-player inventories keep their string id.

🛠️ Fixed

  • The inventory can no longer be opened while parachuting or in skydive free-fall.
  • The petrol can and fire extinguisher now empty correctly as you use them, matching the hazard and fertilizer cans. Custom weapons in those GTA groups work automatically.
  • Client read-only exports (SearchInventory, GetInventoryItems, GetItemCount, HasItem, GetSlot and more) now return fresh results after dropping and picking an item back up, and after any drag that moves items into your inventory (stashes, trunks, gloveboxes, bags, dumpsters, searched players, quick-move, weapon throw, and within-inventory moves).
  • Every colour picker (markers, theme colours, item rarity) now selects the exact colour you see, and the thumb no longer jumps around while dragging.
  • Pasting into any search box (items, weapons, animations, jobs, npcs) now filters results immediately instead of waiting for a keystroke.
  • Usable items whose effect is still running (like a lockpick minigame) can no longer be triggered again to stack a second effect.
  • The onItemAdded, onShopPurchased and onItemCrafted events now report the item's final stored metadata (serial, durability, container id) instead of the input.
  • Add-style payload slot and toSlot fields now report where the item actually landed, not the requested slot.
  • Overriding StartProgress now replaces the whole progress bar, so you no longer get a doubled bar.
  • A container's context menu now shows the number of unique items instead of the total quantity, fixing a full-bag miscount for large stacks.
  • A second player at an emptied dumpster no longer hits "not valid" errors, and a stale dumpster panel now resyncs.
  • Aim no longer stays locked in forced first person when a weapon runs out of ammo.
  • RegisterItemButton now works on weapons, attachments and every other item type, not just plain items.

♻️ Changed

  • State bag rework. inv_busy now signals a running inventory action and is replicated alongside the ox invBusy alias; setting either truthy from any script blocks item use and inventory opening. The open state is inv_open (with an invOpen alias). Stale flags left over from a restart are cleared on start. See Statebags.
  • Parachute is equip-only. Using the item equips the parachute; unequip is now a right-click "Unequip Parachute" button.
  • Holding the open key no longer loops. Holding the open keybind no longer rapidly opens and closes the inventory.

📚 Documentation

  • New Item Images guide covering every way to get item images in, the upload flow, external image hosts, and the exact resolution order.

📦 Updating

Back up your install first, especially any open-source files you've edited. folder/* below means every file in that folder.

Replace with the new build:

  • fxmanifest.lua
  • client/main.lua, client/utils.lua, client/modules/*, client/compat/*
  • server/main.lua, server/utils.lua, server/classes/*, server/modules/*, server/compat/*
  • web/dist/*
  • locales/* (keys were added and changed across every locale file). Replace wholesale, or merge with a diff tool if you maintain custom languages.

Open-source files (re-apply your local edits, or merge by hand). Only the functions to re-check are listed:

  • client/integrations/opensource.lua: StartProgress function, CanUseInventory function (new; used by the hotbar and use-item guards), CanOpenInventory function (now also rejects while parachuting or in skydive free-fall)

Restart the server after updating. The backwards-compatibility exports now survive restarting one_inventory on its own, so consuming resources no longer need a restart of their own.

Looking for the developer API? See the documentation. 📚

The backpack system has grown into a flexible container system (backpacks, pockets, wallets and packs with per-container allowlists and default items), there's a new drag-onto-player way to give items, death and inventory-open checks now share one source of truth so statebag-only death systems work, parachutes can be equipped, and a long list of fixes. Scroll to Updating for exactly which files to replace, add, and remove.

⚠️ Before you update

  • Backpacks are now containers. Everything backpack is renamed to container, including the GetBackpackFromSlot export (now GetContainerFromSlot). Existing data, items and config migrate automatically on first boot, no action needed. See the Containers guide.
  • The new give system is on by default. New servers and existing installs both default to the drag-onto-player give system. You can switch back to the classic headshot picker any time in the admin panel under Config, Gameplay, Give System. The give key defaults to G.
  • Usable-item callback parameters are fixed. Registered usable-item callbacks now receive (src, itemName, slot, metadata) on the server and (itemName, slot, metadata) on the client, exactly as documented. This is breaking if you adapted your callback to the previous shifted parameters. See Usable Items.
  • Item and weapon names are now case-insensitive. Names are normalized to lowercase everywhere (adding, removing, searching, giving). Items returned from exports now always have a lowercase name.

✨ Added

  • Container system. The backpack system is now a flexible container system: a container can be a backpack, a pocket, a wallet or a pack, same mechanics with different config. Each container can have an item allowlist or blacklist (only these items, or everything except these), and a default item set that spawns inside it whenever the container is created. Containers can never be nested inside other containers. Three example containers (joint case, wallet, lunchbox) are seeded. See the Containers guide.
  • Drag-onto-player give system. A new way to give items: hover an item and press the give key (G), or use the right-click Give button. The inventory closes, the item rides your cursor, and you aim at a nearby player to give it. The target is shown by a floating name or a marker above their head. Confirm with left click, hold ALT to give half a stack, or CTRL to pick a count. ESC cancels and keeps the item. Selectable per server alongside the classic headshot picker.

  • Parachute equipping. Using a parachute item now equips it, showing the bag on your back. You can only open a chute while equipped, the bag hides while skydiving and reappears on the ground, and using the item again unequips it at any time, including mid-air. Opening a chute consumes the item once. See the Parachutes guide.
  • Custom item buttons by export. Register a right-click context-menu button on any item from a script, on both the server and the client, with RegisterItemButton. The button only runs your function: it never uses or consumes the item.
  • Definitions-updated event. A new onDefinitionsUpdated event fires on both server and client whenever any item-like definition is created, edited or deleted, so scripts can refresh cached definitions without a restart.
  • Editable weapon-draw animation duration. Set the duration of a weapon's draw animation in the animation create and edit modal.
  • Image URLs. metadata.imageurl now works exactly like metadata.image, and both accept a full URL as a fallback when the image is not found in the web folder.

🔌 Exports

  • RegisterItemButton (server and client). New. Adds a right-click button to an item; the function runs on whichever side you register it. The server payload includes source; the client payload is the same without it.
  • GetContainerFromSlot (server). Renamed from GetBackpackFromSlot. Returns the container's contents.
  • RegisterShop (server). Each inventory entry now also accepts per-item jobs, gangs and licenses to restrict a single item, using the same forms as the shop-level restrictions.
  • GetInventoryItems (server and client). Now also returns label, description, weight and image per item.
  • SetCanOpenInventory and CanOpenInventory (client). SetCanOpenInventory(false) is now a hard lock that blocks inventory open, interactions and the hotbar. SetCanOpenInventory(true), or never calling it, just runs the normal eligibility checks (dead, falling, pause menu); it is not a force-open.

🪝 Hooks & events

  • onDefinitionsUpdated (server and client). New event, no payload, fired after any item-like definition change.

🛠️ Fixed

  • Death detection now has one source of truth across dead checks (searching, opening and using the inventory and hotbar), so statebag-only death systems like wasabi last-stand are recognised. The death keys it reads are configurable in the open-source integrations/opensource.lua.
  • You can no longer open, close or use hotbar items while dead or in last stand, and an open inventory now auto-closes when a statebag-only death system downs you.
  • Dropping a weapon that has components no longer loses those components.
  • Migrating and importing components of items that already have components now works correctly.
  • Forced first-person aim no longer bugs out when quickly switching weapons.
  • Aiming an empty weapon and then pressing reload or fire no longer locks you in the aimed pose.
  • The inventory can no longer be opened while falling or mid-parachute.
  • Props attached during use animations now keep their rotation and stay visible to other players, and the prop editor now shows example rotation values.
  • rcore clothing now applies and equips correctly, including synced prop components like glasses. The non-functional backwards compatibility for qb-clothing and esx_skin is no longer applied on top of it.
  • Usable-item callbacks now receive their parameters as documented (see Before you update).

♻️ Changed

  • Standardized item format. Every export that returns an item from an inventory slot now returns the same shape, combining the slot data with label, description and image, so the format is consistent across the whole API. See the Slot table format.
  • Status values display as whole numbers. Status bars now show a clean value on the UI while keeping full precision in the database.
  • Case-insensitive item names. Item and weapon names are normalized to lowercase everywhere, so WEAPON_FLASHLIGHT and weapon_flashlight are treated as the same item.
  • ox_inventory migration improvements. The migration now imports container definitions and their contents, per-item shop restrictions (license and grade) into our restriction system, and maps an ox parachute item onto our parachute equip event.

📚 Documentation

  • New Containers guide covering the container model, allowlists and blacklists, and default item sets.

📦 Updating

Back up your install first, especially any open-source files you've edited. folder/* below means every file in that folder.

Replace with the new build:

  • fxmanifest.lua
  • client/main.lua, client/utils.lua, client/modules/*
  • server/main.lua, server/utils.lua, server/seed.lua, server/classes/*, server/compat/*, server/modules/*
  • web/dist/*
  • locales/* (keys were added and changed across every locale file). Replace wholesale, or merge with a diff tool if you maintain custom languages.

Open-source files (re-apply your local edits, or merge by hand). Only the functions and sections to re-check are listed:

  • server/integrations/opensource.lua: IsPlayerDeadNow function, DeathStateKeys table
  • client/integrations/opensource.lua: IsPlayerDeadNow function, CanOpenInventory function, the onDeathStateChanged section, DeathStateKeys table
  • client/integrations/esx.lua: esx:onPlayerSpawn event, esx:onPlayerDeath event
  • client/integrations/qb.lua: QBCore:Player:SetPlayerData event, QBCore:Client:OnPlayerLoaded event
  • client/integrations/clothing/rcore.lua: adds rcore clothing equip and apply support
  • client/integrations/clothing/esxskin.lua and client/integrations/clothing/qb.lua: now ignore rcore-provided clothing

Restart the server fully after updating. Restarting one_inventory on its own from in-game disables the backwards-compatibility exports until the next full restart.

Looking for the developer API? See the documentation. 📚

The biggest update yet. Bulk crafting with a live queue, custom item buttons, a configurable hotbar size, police weapon-draw animations, a bunch of search and config additions, and a long list of fixes. Scroll to Updating for exactly which files to replace and add.

⚠️ Before you update

  • ESX: replace es_extended/one_inventory.lua. This is required for registering usable items on ESX. Overwrite the whole file from [INSTALLATION]/es_extended/.
  • Player search no longer sets state.dead / state.cuffed. One Inventory now only reads these states (from your framework and police scripts), it never sets them. If another resource relied on us setting those bags, give it its own source. See Search Players and Statebags.

✨ Added

  • Bulk crafting. Craft several of a recipe at once. Ctrl-drag a recipe to pick a quantity (a plain drag still crafts one). Queued crafts appear in a live queue at the bottom of the crafting panel with per-item progress, counters and remaining time; cancel a single entry or the whole queue. Craftability updates in real time against your inventory, and every unit is still validated and consumes its ingredients server-side.
  • Item context-menu buttons. Add custom buttons to an item from the new "Buttons" tab in the item editor. Each button fires an event, export, or a function from the open-sourced client/integrations/buttons.lua, and shows in the item's right-click menu. Buttons only run their trigger: they never use or consume the item.
  • Configurable hotbar slots. Set 1 to 10 hotbar slots (default 5) in the gameplay config. Keybinds map 1-9 and 0 for slot 10, across both the minimal and immersive layouts.
  • Per-item shop restrictions. Restrict individual shop items by job, gang or license. Locked items show greyed with a lock icon and a requirement hint, and the purchase is blocked server-side.
  • Police weapon-draw animation. A draw animation that plays only for police jobs, set per weapon or from a global default, with a per-weapon toggle. Configured in the new Weapon Settings card, with a dedicated police-jobs list.
  • Ammo load animation. An optional animation when loading ammo into a weapon (default keeps GTA's native reload). Plays for own-inventory loads and during the bag, stash and trunk progress bar.
  • Search emote. The searcher now plays a configurable, looping emote while searching another player, until the search closes. Seeded with a default.
  • Search closes when hands drop. A new toggle (on by default, under hands-up in the Search card) auto-closes the search when a non-job target lowers their hands.
  • Configurable search animations. The per-state animations that mark a target searchable (dead, cuffed, hands up) are now picked from the animation list in the panel, seeded with defaults, plus a new soft-cuff animation. See the Search Players guide.
  • Copy locations. Duplicate a shop, crafting bench, or other location-based entry to quickly make near-identical variants.
  • Drops config. Optionally stop players dropping items on the ground (they must use a garbage bin instead, with all drop UI hidden), and set the default ground-drop slot count (previously hardcoded to 10).
  • Garbage config. Optionally have items placed in a trash bin permanently deleted once the bin is closed.

🛠️ Fixed

  • Admin panel and inventory layouts now cap their size on ultrawide resolutions.
  • On ultrawide resolutions the immersive-layout character stays inside its column instead of drifting to the right.
  • The screen blur now clears when the inventory closes because the player you were searching walked away.
  • Duplicate or wrong-job NPC peds no longer appear at shops, crafting and license points after joining or a job change.
  • Usable items can now be registered on ESX (requires the updated es_extended/one_inventory.lua, see Updating).
  • You no longer appear in your own give-item headshot list.
  • The inventory can no longer be opened while GTA's pause menu is up.
  • Long item descriptions now wrap instead of overflowing.
  • Giving away your equipped weapon now unequips it.
  • Giving an item updates both inventories live: it leaves the giver's open inventory and appears in the receiver's in real time.
  • Forced first person now applies when you aim right after landing from a jump.
  • The give-count dialog shows the correct item icon, matching the grid.
  • A failed give now shows an error toast (too far away, target can't carry it, or a generic failure) instead of silently doing nothing.
  • The keybind-hints bar no longer shows an empty frame when dragging a non-stackable item with the give picker open.
  • A drop lifetime of 0 now clears the drop on the next cleanup interval, and the cleanup interval is now at least 1.
  • Removed a leftover debug print.

♻️ Changed

  • Hotbar keybind toggles. The hotbar key now closes the hotbar if it's already showing. Holding the key keeps it up while held, plus the usual linger time.
  • Player search reads, never sets, states. Death (including last stand) and cuffing are owned by your framework and police scripts now; search reads them instead of maintaining its own bags. See Search Players.
  • Faster admin item dropdowns. Item pickers now load lazily instead of freezing when opened. The cash and dirty-money pickers list plain items only.
  • Edit keeps your page. After editing an item you stay on the same admin list page instead of jumping back to the first.
  • Location type switch keeps only coordinates. Changing a location's type while editing a stash, shop, crafting bench or license point now carries over just the coordinates, not type-specific settings like target or ped model.
  • Gameplay config split into cards. The Gameplay tab is grouped into sections (weapon settings, search settings, and more).
  • Sticky config actions. The config tabs and save button stay in place as you scroll, so changes don't go unsaved.

📚 Documentation

  • Search Players guide updated for the new state handling and the now-configurable search animations.
  • Statebags page updated: the dead and cuffed bags were removed, since One Inventory no longer sets them.
  • Usable Items guide updated: an item's own use config and a framework-registered callback now both run, and the ESX callback parameters are documented as playerId, itemName, item.

📦 Updating

Back up your install first, especially any open-source files you've edited. folder/* below means every file in that folder.

Replace with the new build:

  • fxmanifest.lua
  • client/utils.lua, client/modules/*
  • server/utils.lua, server/seed.lua, server/classes/*, server/modules/*
  • web/dist/*
  • locales/* (keys were added and changed across every locale file). Replace wholesale, or merge with a diff tool if you maintain custom languages.

ESX only:

  • [INSTALLATION]/es_extended/one_inventory.lua (replace the whole file). Required for registering usable items on ESX.

Open-source files (re-apply your local edits, or merge by hand). Only the functions and sections to re-check are listed:

  • client/integrations/qb.lua: the QBCore:Player:SetPlayerData handler, and _wasDown (renamed from _wasDead)
  • server/integrations/esx.lua: Framework.UseItem, Framework.IsItemUsable, the new Framework.PushItemList, plus the definitions-changed thread and event handler
  • client/integrations/buttons.lua: NEW open-source file, add it. It holds the ButtonFunctions table used by item context-menu buttons (admin panel "Buttons" tab, trigger type "Function").

Restart the server fully after updating. Restarting one_inventory on its own from in-game disables the backwards-compatibility exports until the next full restart.

Looking for the developer API? See the documentation. 📚

A focused follow-up to the first beta haul. Runtime shops now carry restrictions and open from your scripts, the player-search system is fully configurable, dynamic clothing is locked to its ped model, and a stack of fixes landed. Scroll to Updating for exactly which files to replace, add, and remove.

⚠️ Before you update

  • RegisterShop opens via OpenInventory only. Runtime-registered shops no longer place a world marker or E-to-open prompt. Open them from your own script with OpenInventory(src, 'shop', name). See RegisterShop.
  • Dynamic clothing is now locked to its ped model. A piece created for one freemode model (for example mp_m_freemode_01) can no longer be equipped on the other. The model it was made for is saved with the item, and its icon and equip resolve from that saved model instead of the wearer's current ped.

✨ Added

  • Player search configuration. A new config section for the search-player system: turn the whole system on or off, choose which jobs can search, and allow searching based on the target's state (searchable, cuffed, dead), each toggleable. Leaving the allowed-jobs list empty hides the search option from everyone.

🔌 Exports

  • RegisterShop (server): now opened only through OpenInventory (no world marker or E prompt), and supports job, gang and license restrictions. ox_inventory's groups map onto our jobs for backwards compatibility.

🛠️ Fixed

  • ox_inventory RegisterShop(name, shopDetails) now uses the first name argument even when shopDetails also carries a name; the explicit argument wins.
  • Editing a stash's slot count or max weight in the admin panel now applies live, instead of only after a restart.
  • Cancelling an item use no longer leaves the inventory stuck in a locked state.
  • Headshots in the give menu now load independently instead of waiting on one another.
  • Restricted license points now hide when you lack access, matching shops, stashes and crafting, instead of showing but refusing to open.
  • While searching another player, changing their clothing now applies to that player. Previously your own character played the animation and received the clothing.
  • Player search no longer shows for players who shouldn't see it; it now respects the allowed jobs and the target's state.
  • Removed leftover target-zone debug drawing on stashes (and any others left enabled).

♻️ Changed

  • Shop items no longer show their label in the grid: the image, stock and price are enough, and the label is still in the context menu.
  • Shops priced in cash or black money now show that currency's item image instead of a generic icon, using the item set in your config.
  • An item that's usable through both our config and a framework-registered callback now runs both, instead of one blocking the other.

📦 Updating

Back up your install first. folder/* below means every file in that folder.

Replace with the new build:

  • fxmanifest.lua
  • client/main.lua, client/utils.lua, client/compat/*, client/modules/*
  • server/main.lua, server/utils.lua, server/classes/*, server/compat/*, server/modules/*
  • web/dist/*
  • locales/* (keys were added and changed across every locale file). Replace wholesale, or merge with a diff tool if you maintain custom languages.

No files were added or removed this release, and no open-source integration files (server/integrations/, client/integrations/) changed, so there is nothing to merge by hand.

Restart the server fully after updating. Restarting one_inventory on its own from in-game disables the backwards-compatibility exports until the next full restart.

Looking for the developer API? See the documentation. 📚

The first big update since the beta release. Clothing items are now dynamic, covering all of your clothing in your server. There is a proper permission system, a new quick-move flow, several new exports, and a stack of additions & fixes. Scroll to Updating for exactly which files to replace, add, and remove.

⚠️ Before you update

A few changes need action on your side:

  • Hook and event renames. beforeItemCreate is now beforeItemAdd, and the onItemCreated event is now onItemAdded. "Create" is reserved for creating a definition. Update any scripts that register these.
  • Drag keybinds changed (defaults, configurable). Stack half-split moved from Shift + drag to Left-Alt + drag. Dropping is now Shift + right-click instead of left-click, so items can't be dropped by accident. All of these can be rebound in the admin panel under config, keybinds.
  • Admin panel now needs an ACE. Opening the admin panel requires the one_inventory.admin ace in server.cfg. Without it the panel can't be opened. See the new Setting Permissions guide.
  • ESX and QBCore: new dependency. screenshot-basic must be started before one_inventory (used by the admin clothing-icon capture). QBox already ships it. See the ESX and QB-Core install pages.
  • In-game restarts break compatibility exports. Restarting one_inventory from in-game disables the backwards-compatibility exports until a full server restart. See Backwards Compatibility.

✨ Added

  • Dynamic clothing. The clothing system is extended, not replaced. Alongside fixed pieces, one item per component now carries its drawable and texture in its metadata, so a single item covers every variant of that slot and can mirror all the clothing on your server. Items auto-create whenever the worn outfit changes, and any appearance script is auto-detected with zero per-script setup (qb-clothing needs one small export). Full walkthrough in the Clothing as Items guide.
  • Permission system. Panel access is gated by the one_inventory.admin ace; per-group command permissions (who can run /giveitem and friends) are managed in-game from the panel's Permissions tab, with an "Enable all commands" toggle per group. See Setting Permissions.
  • Quick-move. Hold the quick-move key and click an item to send it straight to the open secondary inventory, with backpacks taking priority, then stash or ground, and back again. The key shows in the item hover overlay and the info modal. Configurable.
  • Admin menu hotkey. A configurable key to open the admin panel (keybindAdmin, unbound by default, perm-checked, closes on the same key).
  • me as a command target. Run commands like /giveitem me bread 5 or /clearinv me on yourself.
  • Backpack item actions. Drop, use (when usable) and give buttons on items inside backpacks.
  • Orphan items kept safe. Items whose definition no longer exists are preserved as inert, greyed ? slots that survive a save and resolve back when the definition returns.
  • Import from file on the weapons, ammo and components tabs, same flow as item import.
  • Custom components can be added through the component combobox.
  • Throwable weapons can be marked throwable on creation (for custom throwables).
  • Free shop prices. A shop price of 0 is allowed and shows as "Free".
  • Open key now closes. The open-inventory key also closes the inventory when it's already open.
  • Press-to-set keybinds. Rebinding a key in config now captures the pressed key instead of needing the key name typed.
  • Polish translation.

🔌 Exports

New and updated exports. Click through for full docs.

  • CloseInventory (client): force-close the inventory and clean up any open secondary.
  • SetCanOpenInventory / CanOpenInventory (client): lock or unlock the player's ability to open the inventory (including the hotbar) while another resource's UI is open.
  • CreateItemsDefinition (server): register item definitions at runtime. Backwards compatible with QBCore AddItem(s).
  • RegisterShop (server): register a shop at runtime, opened with OpenInventory.
  • GetClientConfig (server and client) / GetServerConfig (server only): read the config, split so server-only keys never leak to clients.
  • AddItem (server): pass metadata.serial = false to add a weapon without a serial (for example blackmarket guns).
  • GetItemDefinition / GetAllItemDefinitions (server and client): now resolve every definition type (item, weapon, ammo, component, backpack, clothing), each tagged with a type field, with an optional type filter.

🪝 Hooks & events

  • Renamed beforeItemCreate to beforeItemAdd and the onItemCreated event to onItemAdded.
  • ox_inventory parity. Native hooks now carry the same payload fields as ox_inventory's hooks, with a lot of extra params added so existing ox-style handlers line up, plus a new beforeShopOpen hook. Full list of events and payloads on the Hooks page.

🛠️ Fixed

  • Cash statistic in the inventory now refreshes live on give, drop, move and stash, instead of only on reopen.
  • Clothing menu no longer shows when searching a player while clothing is disabled.
  • A weapon moved from the hotbar back into the inventory now correctly shows "Unequip", not "Equip".
  • Opening the inventory over the hotbar no longer leaves the hotbar stuck closed afterwards.
  • TAB no longer cycles focus inside the inventory, so a TAB keybind can close it again.
  • qbx_core usable items now work.
  • Usable items registered through QBCore's backwards compatibility now fire.
  • Admin panel statistic cards now count correctly.
  • Stash editor resets its locations when switching location type, matching shops, instead of carrying target coords over to markers.
  • Equipped clothing can now be dropped.
  • The give picker now shows the target's headshot instead of your own.
  • A receiver with their inventory open now sees a given item sync live, without reopening.
  • In the immersive layout the ped is now invisible only to the player themselves, not to everyone.
  • The "Use" button is hidden in the context menu for items that aren't usable.
  • Context-menu total weight for stacked ammo is now correct.
  • A bad or non-existent item-use export can no longer break the inventory.

♻️ Changed

  • Admin dashboard UI refresh.
  • Insufficient-funds messages now name the account (Cash, Bank, Black Money) instead of a generic message.
  • Adding an item that is usable through both our config and a framework now surfaces a clear error.

📚 Documentation

  • New guide: Clothing as Items, covering appearance-script support, how it works, and adding a new appearance script.
  • New guide: Setting Permissions, covering panel access and per-group command permissions.
  • New guide: Usable Items, covering how to bind actions to items across one_inventory, ESX and QBCore.
  • New page: Backwards Compatibility, listing exactly which framework and inventory functions keep working.
  • The migration guide is now Migrate Inventory, refreshed for the latest import flow.

📦 Updating

Back up your install first, especially any open-source files you've edited. folder/* below means every file in that folder; folder/**/* means every file in it and its subfolders.

Replace with the new build:

  • fxmanifest.lua
  • client/main.lua, client/utils.lua, client/modules/*
  • server/main.lua, server/utils.lua, server/seed.lua, server/classes/*, server/compat/*, server/modules/*
  • web/dist/*
  • locales/* (keys were added and changed across every locale file). Replace wholesale, or merge with a diff tool if you maintain custom languages.

Add (new this update):

  • stream_disabled/* (green-screen capture map for clothing icons, disabled by default)
  • web/images/clothing/**/* (generated clothing icons)
  • client/integrations/clothing/*
  • server/integrations/clothing/*
  • [INSTALLATION]/clothing/*

Remove:

  • client/functions.lua (deleted)

Open-source files (re-apply your local edits, or merge by hand). Only the functions to re-check are listed:

  • server/integrations/qb.lua: isQbx, Framework.UseItem, Framework.IsItemUsable
  • server/integrations/opensource.lua: new IsPanelAdmin(src) and GetPlayerGroups(src)
  • client/integrations/qb.lua and client/integrations/esx.lua: the player-loaded handler now calls ApplyClothingOnSpawn()

Server config and setup:

  • Add the one_inventory.admin ace to server.cfg (required to open the panel). See Setting Permissions.
  • ESX and QBCore: ensure screenshot-basic before one_inventory in server.cfg. See the ESX and QB-Core install pages.
  • qb-clothing users only: add the one-line GetSkinData export from the Clothing as Items guide.

Restart the server fully after updating. Restarting one_inventory on its own from in-game disables the backwards-compatibility exports until the next full restart.

Looking for the developer API? See the documentation. 📚

Beta releasev0.1.0

The first public release of One Inventory, a modern grid inventory for FiveM. 🎉

📦 Inventory core

  • Grid based inventory with drag and drop
  • Configurable slot count and weight per inventory
  • Stack splitting with Shift or Ctrl + drag
  • Auto saving

🎒 Items

  • Use animations with progress bars and item props
  • Execute exports and events on item use
  • Per item metadata, optionally visible in tooltips
  • Built in hunger, thirst, health, and armor effects
  • Item durability that degrades over time or with use
  • Rarity tiers with colored glow
  • Custom right click actions per item
  • 3D props on the ground when items are dropped
  • Identification cards that remember who picked them up

🔫 Weapons

  • Durability with optional break at zero
  • Ammo loading, with families for special ammo types
  • Component and attachment system
  • Weapon tints
  • Unique serial numbers
  • Auto reload, first person aim, and other behavior config toggles
  • Equip and disarm from the hotbar

🗄️ Storage

  • Shared, unique, private, and restricted stashes
  • Vehicle trunks and gloveboxes with per class and per model overrides
  • Hood storage on supercars (frunk)
  • Automatic trunk transfer when a vehicle plate changes
  • Dumpsters with random loot, plus randomized garbage items
  • Backpacks that carry their own inventory
  • Confiscation and one call restore for custom workflows

🛒 Shops, crafting, and licenses

  • Shops with multiple currencies: cash or dirty money
  • Random pricing and stock control
  • Job, gang, and license restrictions
  • NPC vendors, target zones, or markers
  • Auto created blips
  • Multi ingredient crafting with progress bars
  • License purchase system

⚡ Hotbar

  • 5 quick access slots
  • Drag from inventory to assign
  • Press 1 through 5 to use or equip
  • Auto hide with item icons, counts, and durability

👕 Clothing

  • Equipment silhouette for hats, shirts, pants, shoes, and more
  • Ctrl + click to quick equip
  • Saved with the player inventory

🤝 Multiplayer

  • Give items to nearby players with shared trade animation
  • Search and frisk for police, gated by job and player state
  • Read only inventory inspection

🛠️ Admin panel

  • Full in game dashboard
  • Manage players, items, weapons, backpacks, clothing, stashes, shops, crafting, licenses, vehicles, animations, and config
  • Add, remove, or set items on any player
  • Changes broadcast live to all clients, no restart needed

🎨 Themes and customization

  • Layout modes: minimal and immersive
  • Color presets: Midnight Blue, Crimson, Emerald, Purple Haze, Gold, and Custom
  • Custom theme editor
  • Smooth drag and drop, transitions, and hover effects
  • Responsive design with virtual scrolling for large inventories

🌍 Localization

  • Many popular languages built in, with the option to add your own
  • Language picker in the admin panel
  • Instant sync across clients
  • Friendly fallback for missing translations

🔌 Framework support

  • (Backwards) compatibility for ESX, QB-Core, and Qbox so existing scripts keep working
  • Framework money mirrored inside the inventory as items

📥 Migration

  • One click import from ox_inventory and qb-inventory
  • Brings over both your definitions (items, weapons, shops, stashes, crafting, and more) and live player data
  • Conflict strategy per category: overwrite or keep
  • Wizard with preview, progress, and summary reports
  • Server lock after migration until restart, to keep your data safe

🛡️ Safety and performance

  • A lot of built-in checks for every interaction
  • Duplication prevention
  • Competing inventory script detection at startup

Looking for the developer API? See the documentation. 📚