Installation Guide
Step-by-step setup for oxide-tablet — dependencies, load order, the tablet item for each framework, database, custom wallpapers, admin access and verification.
This guide takes you from a fresh download to a working tablet. Every step says exactly what to do and what you should see when it worked. You don't need to know any Lua — the only files you open are server.cfg, one item file in your inventory, and (optionally) the tablet's settings file.
Prerequisites
Required resources
These must be installed and running on your server. Most servers already run ox_lib and oxmysql.
| Resource | Minimum Version | Purpose |
|---|---|---|
ox_lib | Latest recommended | Shared helpers and translations |
oxmysql | Latest recommended | Saves tablets, home screens and settings to your database |
o-link | 1.8.0 | The bridge that connects the tablet to your framework, inventory, jobs, admin checks, notifications and the map |
Why o-link 1.8.0? The tablet loads map files that first shipped in o-link 1.8.0. With an older o-link, oxide-tablet fails to start. Update o-link first.
A supported inventory
The tablet opens from an inventory item, so o-link has to be able to read your inventory. o-link supports these inventory resources: ox_inventory, qb-inventory, ps-inventory, qs-inventory, codem-inventory, core_inventory, origen_inventory, tgiann-inventory, jpr-inventory, ak47_qb_inventory and hex_4_inventory.
ESX owners: ESX's own built-in item list (an ESX server with no inventory resource installed) is not one of these. On a server like that, the tablet item can't be used to open the tablet. Install ox_inventory (most ESX servers already run it) or another inventory from the list above.
Supported frameworks
Everything goes through o-link, so you install one copy of the tablet and it works on whichever framework you run.
| Framework | Support |
|---|---|
| QBCore | Full |
QBX (qbx_core) | Full |
| ESX | Full, with a supported inventory (see above) |
| Custom | Via o-link |
Apps from other resources
The tablet comes with three apps of its own: App Store, Settings and Maps. That is everything it ships with. Any other resource can add its own screen as an app, if the version you run supports the tablet. You don't set that up here: when both resources are running, the app shows up in the App Store on its own. Those resources never require the tablet — if you remove it, they go back to their own screens.
Installation Steps
Place the resource
Put the oxide-tablet folder in your server's resources folder. If you run several Oxide resources, keep them together in a folder named [oxide]. There is nothing to build — the tablet's screens ship ready to use.
Add it to your server.cfg
Your server.cfg is the text file that tells your server which resources to start. Add the tablet after o-link, following the Load Order below.
Set up the tablet item
Follow the part of Framework Setup that matches your server. This is the step most people get wrong, so take your time.
Check the settings file before the first start
Open shared/config.lua and review the few settings in Configure Before the First Start. Save the file when you're done.
Start (or restart) your server
The database tables are created automatically. See Database Setup.
Check it works
Run through the steps in Verification.
Load Order
Every Oxide resource uses the same four-part order in server.cfg:
# 1. Framework — everything your framework requires (qb-core, es_extended, qbx_core, etc.)
ensure <framework>
# 2. Scripts — your other resources (phone, inventory, garages, etc.)
ensure <your-other-scripts>
# 3. o-link — the bridge. Starts after your framework/scripts, before any Oxide resource.
ensure o-link
# 4. Oxide resources — keep these together, ideally in a folder named [oxide]
ensure oxide-tablet- Your inventory belongs in part 2, above
o-link.o-linklooks for your framework and inventory at the moment it starts. If they aren't running yet, the tablet item won't work. - Don't put
oxide-tabletaboveo-link. The tablet listso-linkas a dependency, so starting the tablet first makes the server starto-linkearly, before your framework.o-linkthen can't find your framework, and nothing works properly. - If your Oxide resources are in an
[oxide]folder, oneensure [oxide]line in part 4 starts them all. Within part 4 the order doesn't matter — the tablet and the resources that add apps find each other whichever starts first. - If you restart
o-linkwhile the server is running, restartoxide-tabletafterwards too. Restarting the whole server is the safest option.
Framework Setup
What the tablet item needs
The tablet opens when a player uses an inventory item. By default that item is named tablet. The item must be set up like this:
| Requirement | Why |
|---|---|
| Usable | Using the item is what opens the tablet |
| Doesn't stack | Each tablet saves its own IMEI on the item. If tablets stack, every tablet in the stack shares one IMEI, one home screen and one set of apps |
| Named to match the tablet's item list | The default list contains tablet (see Config.Items below) |
You don't set up the IMEI yourself. The first time a tablet is used, the tablet writes the IMEI onto the item automatically.
Stock QBCore already has a tablet item, but it is set up wrong for this resource: it stacks and it can't be used.
-
Open
qb-core/shared/items.lua. -
Search for
tablet. The stock line looks like this:qb-core/shared/items.lua tablet = { name = 'tablet', label = 'Tablet', weight = 2000, type = 'item', image = 'tablet.png', unique = false, useable = false, shouldClose = true, description = 'Expensive tablet' }, -
Change
unique = falsetounique = true, anduseable = falsetouseable = true. The line should now read:qb-core/shared/items.lua tablet = { name = 'tablet', label = 'Tablet', weight = 2000, type = 'item', image = 'tablet.png', unique = true, useable = true, shouldClose = true, description = 'Expensive tablet' },If your file has no
tabletline at all, paste the line above in with the other items. -
Save the file and restart your server.
Players who already carry a stack of old, stacking tablets should get fresh ones after this change. A stack made before the change stays a stack.
Stock QBX runs ox_inventory, which does not include a tablet item, so you add one.
-
Open
ox_inventory/data/items.lua. -
Add this entry with the other items:
ox_inventory/data/items.lua ['tablet'] = { label = 'Tablet', weight = 2000, stack = false, close = true, }, -
Save the file and restart your server.
stack = false is what keeps each tablet separate.
Keep the entry simple. Don't add a consume line, a client block containing status, usetime or export, or a server block with an export. Any of those makes ox_inventory handle the item by itself, and the tablet never finds out the item was used. If your file already had a tablet item from another script, check it for these lines and remove them.
ESX servers running ox_inventory use the same file and the same entry as QBX:
-
Open
ox_inventory/data/items.lua. -
Add this entry with the other items:
ox_inventory/data/items.lua ['tablet'] = { label = 'Tablet', weight = 2000, stack = false, close = true, }, -
Save the file and restart your server.
Follow the same "keep it simple" rule as QBX: no consume line, no client block containing status, usetime or export, and no server block with an export.
If your ESX server has no inventory resource, see A supported inventory above.
If you use a different inventory from the supported list, add an item named tablet following that inventory's own guide. Make sure it is usable and doesn't stack.
Some inventories can't save extra information on an item. The tablet still works with them, but tablets don't get their own IMEI — home screens, installed apps and player settings are then saved per character instead of per tablet. The server console tells you when this happens (see Troubleshooting).
Item icon
A ready-made icon ships in this resource at itemimages/tablet.png. Copy it into your inventory's image folder:
| Inventory | Image folder |
|---|---|
| qb-inventory | qb-inventory/html/images/ |
| ox_inventory | ox_inventory/web/images/ |
If a tablet.png is already in that folder, you can keep the one you have or replace it with this one. Without any icon the item still works — it just shows a blank picture.
Database Setup
You don't need to import anything. The tablet creates its tables automatically the first time it starts:
| Table | What it stores |
|---|---|
tablet_devices | One row per tablet (by IMEI): its name, home screen, installed apps, player settings and battery charge |
tablet_profiles | Home screen, apps and settings for players who open the tablet without a tablet item |
oxide_settings | The tablet's settings. This table is shared with other Oxide resources, one row per setting |
A copy of these table definitions ships in sql/install.sql. You only need it if your database user isn't allowed to create tables. In that case, import sql/install.sql once using your database manager (the program you use to look at your server's database, such as HeidiSQL, phpMyAdmin, or the database page in your hosting panel). The file is safe to run on a database that already has these tables: it only creates tables that are missing.
Configure Before the First Start
Read this before you start the server with the tablet for the first time. On its first start, the tablet copies the settings from shared/config.lua into the oxide_settings database table. From then on it reads settings from the database, and editing shared/config.lua does nothing. After the first start you change settings in game with /tablet settings.
Two things are good to know about this:
- When an update adds a brand-new setting, its value from
shared/config.luais added to the database automatically. Your existing settings are left alone. - In
/tablet settings, Reset to default on a setting puts back the value fromshared/config.luaas it was when the server last started.
Open shared/config.lua (the tablet's settings file) and look at these three settings. Everything else can wait; the full list is in Configuration.
Config.RequireItem
Config.RequireItem = truetrue(default): the keybind and/tablet openonly work while the player carries a tablet item.false: anyone can open the tablet with the keybind or/tablet open, with no item. Home screens are then saved per character. Using a tablet item still works as normal.
An app that its own resource opens directly (through that resource's own command, item or menu) never needs a tablet item.
Config.Items
Config.Items = {
{ item = 'tablet', apps = {} },
}This is the list of inventory items that open the tablet.
itemis the item name exactly as your inventory spells it.apps = {}(empty) makes a normal tablet. Players install apps from the App Store.- A filled-in
appslist makes a locked tablet. It shows only the apps listed (plus the Settings app), and the App Store isn't offered. App names are app IDs from the resource that adds the app, listed in that resource's documentation.
Here is an example with a second item. It turns a work-issued item into a tablet that only shows one app:
Config.Items = {
{ item = 'tablet', apps = {} },
{ item = 'work_tablet', apps = { 'their_app' } }, -- only that one app
}Don't list an item that another resource already opens by itself. If both resources react to the same item, both open when it's used. Before listing an item here, check the other resource's config for an "open with an item" option and turn it off.
Every item you list must also exist in your inventory and be set up as described in Framework Setup.
Config.OpenKey
Config.OpenKey = ''The default key that opens the tablet. It's empty by default, which means no key is bound. Players can still bind their own key in game: Esc → Settings → Key Bindings → FiveM → Open tablet.
To set a default key, put the key name in the quotes, for example Config.OpenKey = 'F10'. A default only applies to players who have never joined your server. Anyone who has joined before keeps their own binding.
Good to know: the App Store
Apps from other resources don't appear on anyone's home screen by themselves. Each player installs them from the tablet's App Store. If you'd rather every tablet had certain apps, or every app installed automatically, see Config.Store in Configuration.
Custom Wallpapers (Optional)
The tablet has 8 built-in wallpapers. You can add your own images too:
Copy the image into the wallpapers/ folder inside oxide-tablet (next to itemimages/, not inside web/).
- Use a
.png,.jpg,.jpegor.webpfile with a lowercase extension. - Use only letters, digits,
-and_in the file name, with no spaces. For exampleskyline.jpg. - An image about 1600x1000 (16:10) fits the screen without cropping.
Add it to the wallpaper list. Each entry needs an id (a short unique name using letters, digits, - and _), a label (the name players see) and a url (the file name).
Before the first start, add it in shared/config.lua:
Config.Home = {
dockSize = 6,
maxPages = 5,
wallpapers = {
{ id = 'skyline', label = 'Skyline', url = 'skyline.jpg' },
},
}After the first start, run /tablet settings, open Home Screen, and add a row under Wallpaper images. Press Save Changes.
Restart the tablet so it picks up the new file. Type restart oxide-tablet in your server console, or restart the server.
A full https:// web address also works as the url. Plain http:// addresses are not accepted.
Keep an image's id the same once players have picked it. Saved home screens remember the id, not the file name. If you change or remove the id, those players go back to the default wallpaper.
Players pick a wallpaper on the home screen: they right-click the home screen (or press and hold an app, or press the pen button in the corner), then press Wallpaper and choose from Images.
Admin Access
The admin parts of the tablet (/tablet settings, /tablet wipe and /tablet notify) use o-link's admin check. A player passes if they have the admin or command permission. On ESX, members of an ESX admin group pass too.
-
Most QBCore and QBX servers already give their
group.admingroup thecommandpermission inserver.cfg, so existing admins work straight away. -
Otherwise, add these two lines to your
server.cfg, replacingYOUR_LICENSEwith the admin's license identifier:server.cfg add_principal identifier.license:YOUR_LICENSE group.admin add_ace group.admin admin allow
The full command list is in Admin Tools.
Verification
Start your server and watch the server console. There should be no red errors mentioning oxide-tablet, and you should see a line like this:
[INFO][oxide-tablet][boot] tablet ready
{"items":1,"requireItem":true}On the very first start you'll also see a configSeeded line. That is the tablet copying your settings into the database — it's normal.
Give yourself a tablet in game. Replace YOUR_ID with your in-game server ID. The command is the same on QBCore (qb-inventory) and on QBX or ESX (ox_inventory):
/giveitem YOUR_ID tablet 1Use the tablet from your inventory. The tablet should open and your character should hold it. The home screen shows a Calendar and an ID widget, the App Store and Settings apps, and a hint to open the App Store.
Open the App Store. You should see Maps, plus any apps your other resources add. Press Get on one and it appears on your home screen.
Put the tablet away with Esc. Then type /tablet device in chat. You should see something like Tablet (IMEI 35xxxxxxxxxxxxx), which means this tablet has its own IMEI.
If you see "This tablet has not been activated yet" after using it, your inventory couldn't save the IMEI on the item. See Troubleshooting.
As an admin, type /tablet settings. The Tablet Settings menu should open. This confirms your admin permission works.
If any step doesn't match what you see, go to Troubleshooting.
Next Steps
Oxide Tablet
Framework-agnostic tablet for FiveM — every item its own device with an IMEI, a customizable home screen, an App Store, notifications, and a shell other resources put their screens on.
Configuration Reference
Every setting in oxide-tablet, what it does in game, and its default value — plus how database-backed settings and the /tablet settings editor work.