One Studios

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. 📚