Installation Guide
Step-by-step setup for oxide-phone — what's in the package, dependencies, load order, the items for each inventory, database, server convars, calls, photo storage, police evidence, emergency numbers, apps, custom wallpapers, translations, admin access, updating and verification.
This guide takes you from a fresh download to a working phone. Every step says 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, the item file of your inventory, and (optionally) the phone's settings file.
What's in the Package
Buying Oxide Phone gives you four resources (a resource is one folder your server starts). Each is its own download in your Cfx Portal assets, under the name below:
| Folder | What it is | Needed? |
|---|---|---|
oxide-phone | The phone itself | Yes |
oxide-hookr | Hookr, a dating app for the phone | No |
oxide-leakd | Leakd, a photo and video sharing app for the phone | No |
oxide-glitch | Glitch, a live streaming app for the phone | No |
The three apps are optional. Each one works on its own, so you can install all three, some of them, or none. An app does nothing without oxide-phone. Each app has its own guide for its settings: Hookr, Leakd and Glitch.
Prerequisites
Required Resources
These must be installed and running. Most servers already run ox_lib and oxmysql.
| Resource | Minimum Version | Purpose |
|---|---|---|
ox_lib | Latest recommended | Shared helpers and translations |
oxmysql | Latest recommended | Saves phones, SIM cards, messages and settings to your database |
o-link | 1.11.0 or newer | The bridge that connects the phone to your framework, inventory, jobs, money, notifications, dispatch and the map |
Why 1.11.0 or newer? Several parts of o-link the phone relies on arrived in o-link 1.11.0: the part that puts apps from other resources on the phone (Hookr, Leakd, Glitch and any other app), the part that lets other resources (the gig jobs, dispatch, banking and your own scripts) send texts, mail and notifications to this phone, and the 911/311 hand-off to oxide-dispatch. With an older o-link the phone itself still starts and works, but no apps from other resources appear in its Store, other resources can't reach it, and 911/311 calls reach oxide-dispatch only as a plain alert.
To see which o-link you have, open o-link/fxmanifest.lua in a text editor and look at the line that starts with version.
OneSync must be turned on. The server reads where players stand to decide who hears a phone ring, who is close enough to share a contact, who is in a no-signal area and where a traced phone is. Most servers already have OneSync on. If yours doesn't, add set onesync on to your server.cfg.
That is everything the phone needs. Every other resource on this page is optional.
Supported Frameworks
Everything goes through o-link, so you install one copy of the phone and it works on whichever framework you run.
| Framework | Support |
|---|---|
| QBCore | Full |
| QBX (qbx_core) | Full |
| ESX | Full with an inventory resource such as ox_inventory. With ESX's own item list, see ESX Without an Inventory Resource |
| Custom | Via o-link |
Optional Resources
The phone works without every one of these. Each one adds something when it runs. Integrations describes each one in full.
| Resource | What it adds |
|---|---|
pma-voice | Voice for phone calls |
A target resource (such as ox_target) | Forensics stations become a target option instead of an E prompt |
| Photo storage (Fivemanage, S3/R2, or your own) | Makes the camera, voicemail and voice messages work, and the photos and videos in Hookr, Leakd and Glitch |
oxide-police | Extraction reports go into police cases, and active warrants count as search authorizations |
oxide-dispatch | 911/311 calls arrive as dispatch calls, and responder replies arrive as texts |
oxide-drugselling | Forensics can process trap phones and trace trap numbers |
oxide-banking | Its Banking app can be installed on the phone |
oxide-tablet | The Forensics app is also on the tablet |
Installation Steps
Place the folders
Put the oxide-phone folder, and the folder of each app you want (oxide-hookr, oxide-leakd, oxide-glitch), 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 screens of the phone and the apps ship ready to use.
Remove any other phone script
If another phone resource is installed (for example qb-phone, npwd or lb-phone), take its folder out of resources. Two phones react to the same phone item and fight over it. A stopped resource still counts as installed, so move the folder out rather than just not starting it.
Add them to your server.cfg
Your server.cfg is the text file that tells your server which resources to start. Add the phone after o-link, and the apps after the phone, following the Load Order below.
Set up the items in your inventory
Follow the part of Framework Setup that matches your server. This is the step most people get wrong, so take your time.
Restart your server
The phone and each app create their database tables automatically. See Database Setup.
Restart the whole server, not just the phone. A running server only notices new folders after refresh is typed in the server console, and o-link only finds the phone at the moment o-link itself starts. A full server restart takes care of both. If you type refresh and ensure oxide-phone on a running server instead, the phone starts, but the apps and other resources can't reach it until the next full restart.
Adding an app later is different. If oxide-phone was already installed when the server last started, type refresh and then ensure oxide-hookr (or oxide-leakd, oxide-glitch) in the server console. The app reaches the phone straight away, with no restart.
Set the phone up in game
Join as an admin and type /phone settings. The sections below (Photos, Police and Evidence, Emergency Numbers) say which settings to look at first.
Check it works
Use 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-phone
ensure oxide-hookr
ensure oxide-leakd
ensure oxide-glitchox_libandoxmysqlgo anywhere aboveo-link(part 1 or 2). Most frameworks already start them in part 1.- Your inventory,
pma-voice, your target resource and your dispatch resource belong in part 2, aboveo-link.o-linklooks for them at the moment it starts. - Don't put
oxide-phoneor the apps aboveo-link. They listo-linkas something they need, so starting one of them first makes the server starto-linkearly, before your framework.o-linkthen can't find your framework, and nothing works properly. - Leave out the line of any app you didn't install. The phone works without all three.
- List the phone before the apps, as above. Each app finds the phone whichever starts first, so nothing breaks if the order differs, but this order matches each app's own guide (Hookr, Leakd, Glitch).
- 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. - If you add or restart
o-linkwhile the server is running, restartoxide-phoneand the apps afterwards too. Restarting the whole server is the safest option.
Framework Setup
The Items
The phone uses five items. They must exist in your inventory with the names below. You can rename any of them later in game with /phone settings (Items). Hookr, Leakd and Glitch need no items of their own.
| Item | Label | Weight (g) | Stackable | Usable | What it does |
|---|---|---|---|---|---|
phone | Phone | 190 | No | Yes | Opens the phone. Each phone item is its own device with its own data |
sim_card | SIM Card | 5 | Yes | Yes | Goes into the phone you hold. The number is registered to your character |
burner_sim | Burner SIM | 5 | Yes | Yes | A SIM card registered to nobody |
powerbank | Powerbank | 150 | Yes | Yes | Charges the phone you hold once (only when batteries are turned on) |
phone_wiper | Phone Wiper | 30 | Yes | No | Carrying one adds Secure wipe to the phone's Settings app. Wiping uses it up |
Using a SIM card or powerbank puts it into (or charges) the phone that is open, or, if no phone is open, the phone in your lowest inventory slot.
The phone item must not stack. Each phone saves its device ID on the item. Stacked phones would share one device.
Inventories and Item Data
Some inventories can save extra information on an item (this is called item data or metadata). The phone uses it to remember which device a phone item is, and which number a SIM card that was taken out belongs to.
| Inventory | Keeps item data | What that means |
|---|---|---|
ox_inventory | Yes | Every phone keeps its contacts, texts and number when it changes hands. A SIM taken out of a phone becomes an item that remembers its number |
qb-inventory | Yes, with unique = true on the phone and SIM items | Same as above. The QBCore block below sets unique = true |
| ESX's own item list (no inventory resource) | No | Each character gets one phone tied to them. A SIM taken out is lost. SIM cards, powerbanks and the phone wiper don't work at all (see below) |
With any other inventory o-link supports, the phone finds out the first time a phone is used and prints one line in the server console saying which way it went (see Verification).
ox_inventory (QBX, and QBCore or ESX servers using ox_inventory)
- Open
items/ox_inventory_items.luain theoxide-phonefolder. - Copy every line between
return {and the final}. - Open
ox_inventory/data/items.lua. Delete its existing['phone']entry. The stock one calls another phone script (npwd) when the item is added or removed. - Paste the copied lines just above the file's final closing
}. - Save the file.
Use the entries exactly as they are in the template. If your file already has one of these item names from another script, keep only the phone's copy.
QBCore (qb-inventory)
-
Open
qb-core/shared/items.lua. -
Find the existing
phoneline and replace it with the first line below. Then add the other four lines:phone = { name = 'phone', label = 'Phone', weight = 190, type = 'item', image = 'phone.png', unique = true, useable = true, shouldClose = true, description = 'A smartphone' }, sim_card = { name = 'sim_card', label = 'SIM Card', weight = 5, type = 'item', image = 'sim_card.png', unique = true, useable = true, shouldClose = true, description = 'A SIM card registered to your name' }, burner_sim = { name = 'burner_sim', label = 'Burner SIM', weight = 5, type = 'item', image = 'burner_sim.png', unique = true, useable = true, shouldClose = true, description = 'A SIM card registered to nobody' }, powerbank = { name = 'powerbank', label = 'Powerbank', weight = 150, type = 'item', image = 'powerbank.png', unique = false, useable = true, shouldClose = true, description = 'Charges a phone once' }, phone_wiper = { name = 'phone_wiper', label = 'Phone Wiper', weight = 30, type = 'item', image = 'phone_wiper.png', unique = false, useable = false, shouldClose = true, description = 'Wipes a phone so nothing on it can be recovered' }, -
Save the file.
The F1 key on QBCore. The phone opens with F1 by default, and stock QBCore's qb-radialmenu also uses F1. If you run qb-radialmenu, pick another default key for the phone: in /phone settings → General, change Open keybind default to a key no other script of yours uses, and press Save Changes. A new default only reaches players who have never joined your server. Players who already joined change it themselves in Esc → Settings → Key Bindings → FiveM → Open phone.
ESX Without an Inventory Resource
Most ESX servers run ox_inventory. If yours does, follow ox_inventory above instead.
ESX's own item list keeps its items in the database. Run this in 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). It only adds items that are missing:
INSERT IGNORE INTO `items` (`name`, `label`, `weight`) VALUES
('phone', 'Phone', 1),
('sim_card', 'SIM Card', 1),
('burner_sim', 'Burner SIM', 1),
('powerbank', 'Powerbank', 1),
('phone_wiper', 'Phone Wiper', 1);On ESX's own item list the phone opens, and every character gets one phone and a registered number the first time they use it. SIM cards, powerbanks and the phone wiper need an inventory resource o-link supports (for example ox_inventory): without one, using them does nothing.
Item Icons
Icons for all five items ship in the items/ folder: phone.png, sim_card.png, burner_sim.png, powerbank.png and phone_wiper.png. Copy the five .png files into your inventory's image folder:
| Inventory | Image folder |
|---|---|
ox_inventory | ox_inventory/web/images/ |
qb-inventory | qb-inventory/html/images/ |
Both inventories already have a phone.png for their stock phone item. Let the copy replace it: the new icon shows this phone.
Without an icon the item still works; it just shows a blank picture.
Database Setup
You don't need to import anything. The phone creates all its tables the first time it starts. They all start with oxide_phone_, apart from the shared settings table:
| Tables | What they store |
|---|---|
oxide_phone_devices, oxide_phone_sims, oxide_phone_device_state | Phones, SIM cards and numbers, each phone's home screen, installed apps and player settings |
oxide_phone_contacts, oxide_phone_call_log, oxide_phone_voicemails, oxide_phone_blocks, oxide_phone_mail, oxide_phone_mail_pending, oxide_phone_mail_attachments, oxide_phone_notifications, oxide_phone_media, oxide_phone_notes, oxide_phone_places | What is on each phone: contacts, recent calls, voicemail, blocked numbers, mail (with its attachments, and mail waiting for a phone), notifications, photo, video and voice clip addresses (with where and when each was made), notes, and Maps' saved places and parked car |
oxide_phone_mail_aliases, oxide_phone_mail_meta | Mail aliases (every alias a phone ever held) and the mail provider's record of who mailed which address, when, and whether it arrived. Never the content |
oxide_phone_albums, oxide_phone_album_items, oxide_phone_album_members | Photos albums, what is in each one and who a shared album is shared with |
oxide_phone_threads, oxide_phone_thread_members, oxide_phone_thread_prefs, oxide_phone_messages, oxide_phone_message_copies, oxide_phone_deliveries, oxide_phone_message_media, oxide_phone_message_locations, oxide_phone_message_edits, oxide_phone_message_reactions | Text conversations and each phone's own settings for them, the copy of each text on each phone, texts waiting for a phone, attached photos, voice messages and locations, earlier versions of edited texts, and reactions |
oxide_phone_polls, oxide_phone_poll_options, oxide_phone_poll_votes, oxide_phone_location_shares, oxide_phone_location_points | Polls and their votes, live locations and the places each one reported |
oxide_phone_calls, oxide_phone_texts_meta | Carrier records: who called or texted which number, when, and where they stood. Never the content |
oxide_phone_darkchat_handles, oxide_phone_darkchat_rooms, oxide_phone_darkchat_members, oxide_phone_darkchat_messages | Dark Chat |
oxide_phone_feed_profiles, oxide_phone_feed_posts, oxide_phone_feed_likes, oxide_phone_feed_follows, oxide_phone_feed_media, oxide_phone_feed_edits, oxide_phone_feed_bookmarks, oxide_phone_feed_tags, oxide_phone_feed_activity, oxide_phone_feed_reports | Feed: profiles, posts with their photos, video and earlier versions, likes, follows, bookmarks, hashtags, the Notifications tab and reported posts |
oxide_phone_bank_transfers, oxide_phone_bank_requests | The Wallet app's transfer history and payment requests |
oxide_phone_shares, oxide_phone_radio_log | Nearby shares (the record of who shared what with whom) and Airplane Mode windows for carrier records |
oxide_phone_custody, oxide_phone_authorizations, oxide_phone_extractions, oxide_phone_evidence_reports | Police custody logs, search authorizations, extractions and their reports |
oxide_phone_sim_events, oxide_phone_remote_actions | SIM cards reported lost and their replacements, and Find Phone locks and erases waiting for a phone to come back online |
oxide_phone_docks | Phones left on a charging station's pad, with the item each one goes back as |
oxide_phone_app_accounts, oxide_phone_app_logins, oxide_phone_app_permissions, oxide_phone_app_media, oxide_phone_app_evidence, oxide_phone_app_installs | Apps from other resources (such as Hookr, Leakd and Glitch): their accounts and which phone is signed in to which, the permissions each phone gave them, the photos and videos they were given, what they recorded for police, and Store downloads still running |
oxide_settings | The phone's settings. This table is shared with other Oxide resources, one row per setting |
Each app creates its own tables the first time it starts: their names start with oxide_hookr_, oxide_leakd_ and oxide_glitch_. The same tables are in each app's sql/migrations/ folder. The apps check their tables at every start, so the database user your server connects with (the one in your oxmysql connection line) must be allowed to create tables for the apps to work.
If your database user isn't allowed to create tables, set the phone's tables up by hand once with your database manager:
- Import
sql/install.sqlfrom theoxide-phonefolder. - Import every file in
oxide-phone/sql/migrations/, in number order (0001first). Some lines fail with a message that a column, key or table already exists. That is expected: that part is already done. Skip that line and run the rest of the file.
Running these files on a database that already has the tables does no harm: lines for parts that are already done either do nothing or fail, and you skip the ones that fail. When an update adds tables or columns, the phone adds them itself at start; a database user that can't do that imports the new files in sql/migrations/ the same way.
Configure Before the First Start
Settings live in the database after the first start. On its first start the phone copies the settings from shared/config.lua (the phone's settings file) into the oxide_settings database table. From then on it reads them from the database, and editing shared/config.lua does nothing. You change settings in game with /phone settings.
You don't have to edit the file at all. Every setting can be changed in game after the first start, and most changes apply straight away. If you like to prepare things first, Configuration lists every setting.
Server Convars
A convar is a setting line in server.cfg. The phone reads these:
| Convar | Default | What it does |
|---|---|---|
oxide_phone_fivemanage_key | empty | Your Fivemanage API key, for photos. When empty, the phone uses FIVEMANAGE_MEDIA_API_KEY. See Fivemanage |
oxide_phone_s3_access_key | empty | Your S3/R2 access key ID, for photos. See S3 or R2 |
oxide_phone_s3_secret_key | empty | Your S3/R2 secret key, for photos |
oxide_phone_compat_qbphone | true | Answers qb-phone mail from other scripts. Set to false to turn it off. See Compatibility |
oxide_phone_compat_lb | false | Answers LB-Phone exports from other scripts. Set to true to turn it on. See Compatibility |
voice_enablePhones | 1 | pma-voice's own switch for phone calls. Must be 1 for calls to work |
ox:locale | en | ox_lib's language setting. The phone uses it to pick its language file |
oxide_phone_camera_debug | 0 | For troubleshooting only. Set it with setr to 1 and each player's F8 console shows where the phone camera is, once a second. See Troubleshooting |
Keys stay on your server. They are never sent to players. After changing a convar, restart the server (or restart oxide-phone in the server console).
Calls
Calls need pma-voice with phone calls turned on, which is its default. If your server.cfg sets voice_enablePhones, it must be 1:
setr voice_enablePhones 1Without pma-voice the phone still works: texts, contacts, mail and notifications are unaffected, and the Phone app tells players that calls are not available on this server.
A ringing phone can be heard by players standing near it. Players who turn the sound off or use Do Not Disturb on their phone ring silently. The ring sound, its range and the ring time are in /phone settings (Calls & Messages).
Voicemail uses the same storage as photos (see Photos). Without storage, callers can't leave a message and the rest of calling works as normal. Players record voicemail with their microphone.
Photos
The phone does not store photos or videos itself. Until you pick a storage service, the Camera app says that photos are not set up; everything else works. Pick one in /phone settings (Media → Photo storage) and put its key in server.cfg. The same storage and key hold videos and voice clips; there is nothing separate to set up for them.
The apps use the phone's storage too. Without it, players can't add photos to a Hookr profile (which needs at least one), can't post photos or videos on Leakd, and Glitch channels keep plain initials instead of pictures. Live streams on Leakd and Glitch don't use storage: the video goes through your game server (see Apps).
Fivemanage
-
Create a media API key in your Fivemanage dashboard.
-
Add it to
server.cfg:server.cfg set oxide_phone_fivemanage_key "your-key"If your
server.cfgalready hasset FIVEMANAGE_MEDIA_API_KEY "..."for other scripts, skip this step. The phone uses that key. -
Restart your server.
-
In
/phone settings→ Media, set Storage to Fivemanage and press Save Changes.
S3 or R2 Compatible Storage
-
Create a bucket and an access key that can write to it. Serve the bucket from a public
https://address (for Cloudflare R2, a custom domain or the publicr2.devaddress). -
Add the keys to
server.cfg:server.cfg set oxide_phone_s3_access_key "your-access-key-id" set oxide_phone_s3_secret_key "your-secret-key" -
Restart your server.
-
In
/phone settings→ Media, set Storage to S3 or R2 compatible and fill in:- Endpoint, starting with
https://(for examplehttps://<account-id>.r2.cloudflarestorage.com) - Region (
autofor R2) - Bucket
- Public address, the
https://address the bucket is served from (for examplehttps://photos.example.com)
- Endpoint, starting with
-
Allow uploads from the game in the bucket's CORS settings: origin
https://cfx-nui-oxide-phone, methodPUT, headerContent-Type. Videos use the same rule. Also allowing methodGETlets Photos read files directly for editing; without it the server fetches them instead, which is slower.
Other Storage
Set Storage to Custom and have a resource of your own hand out upload addresses (see Building Apps → Custom photo storage). Add the host your photos are served from under Allowed hosts.
Photos and videos are only ever shown from the storage hosts you configured. An address anywhere else is refused when it is saved and never shown.
Police and Evidence
Police can seize a phone, get a search authorization, extract what is on it, read carrier records and trace a number, all in the Forensics app, which police see on their phone. Nothing else needs to be installed. Set it up in /phone settings → Evidence:
- Police jobs: your police job names (as your framework spells them) and the lowest grade that counts.
- Authorizers: who issues search authorizations, for example police command or a
judgejob. - Forensics stations (optional): places where police extract a phone they carry. Add a row, press the crosshair button (Place in world) and pick the spot in the world, then set its Reach. Turn on Extract only at a station if extraction should not work anywhere else.
Must be on duty is on by default. It applies to police and to authorizers: a job with no duty system can't issue authorizations while it is on.
On ESX: some ESX versions have no on-duty switch for jobs. There, police always count as off duty, so the Forensics app never shows. If your officers don't see Forensics, turn Must be on duty off in /phone settings → Evidence and press Save Changes.
When oxide-police runs, every extraction report is also attached to the case the officer names, and an active warrant for the phone's owner counts as a search authorization. To send reports to another MDT, or to decide authorizations with your own system, see Evidence Bridge.
Emergency Numbers
Dialling 911 or 311 in the Phone app (or pressing Emergency call on the lock screen) sends the call to your dispatch system:
- With
oxide-dispatch, calls arrive as its 911/311 calls with the caller's number, and replies from responders arrive on the caller's phone as texts. - With another dispatch resource, the call arrives as a normal alert.
- With no dispatch resource at all, players with the jobs listed for the number get a notification and a map blip for 30 seconds.
Change the numbers and jobs in /phone settings → Emergency.
Apps
The phone brings its own apps, set up in /phone settings → Apps:
- Notes, Calculator and Clock need no setup. The Clock's timer goes off even with the phone put away.
- Maps shows o-link's shared map (the same one oxide-tablet uses). Players tap to set a waypoint, and Share my location sends where they stand as a text. Choose how the map shows Cayo Perico with Map mode in
/phone settings→ General, or withoxide-phone:mapmode(see Admin). - Wallet shows the bank balance from your framework and sends and requests money by phone number. The money goes to the character the number is registered to, so a burner SIM cannot receive it. Set the largest transfer and the daily limit in Apps → Wallet. When
oxide-bankingruns, its own Banking app appears in the Store, and Wallet stays beside it. - Dark Chat and Feed are in the Store. In Dark Chat players pick a handle and nobody sees their number. In Feed, admins can delete any post, mute an author for 24 hours, verify handles and work through reported posts.
With the gig jobs (pizza, landscaping, postal, roadside, animal control, newspaper, pest control) and their usePhone setting on, the Gigs app appears on the phone and their shift updates and job calls arrive as Gigs notifications. With Apps → Gigs off, the updates arrive as texts from the job instead. See Integrations.
Hookr, Leakd and Glitch
Each app you installed shows up in the phone's Store, and players get it there. To put an app on every phone instead (players can't remove it):
- Type
/phone settingsin game. - Open Home & Apps → Store.
- Add the app's id under Preinstalled apps:
hookr,leakdorglitch. - Press Save Changes.
Each app's own settings are in its own folder. See Hookr, Leakd and Glitch, and their installation guides: Hookr, Leakd and Glitch.
Live Streams
Leakd and Glitch let players go live with the phone's camera. The video goes from the streamer's game through your server to every viewer, so there is nothing extra to set up, but each viewer uses your server's upload: about 0.73 Mbps at the default quality, so 25 viewers use about 18 Mbps. The phone sets the limits for every app together in /phone settings → Media → Live streams: 25 viewers per stream, 4 streams at once and 40 Mbps of upload by default. Lower them if your server's connection is slow. See Configuration → Live Streams.
Custom Wallpapers (Optional)
The phone has five built-in wallpapers. To add your own:
Copy the image into the wallpapers/ folder inside oxide-phone. Use a .png, .jpg, .jpeg or .webp file, with only letters, digits, - and _ in the name (no spaces). For example skyline.jpg.
Restart the phone so it serves the new file: type restart oxide-phone in your server console, or restart the server.
Add it in game. Run /phone settings, open Home & Apps → Home screen, and add a row under Extra wallpapers: an Id (a short unique name using letters, digits, - and _), a Name players see, and the file name as the Image. Press Save Changes.
A full https:// web address also works as the Image, without a file. Plain http:// addresses are not accepted.
Keep an image's Id the same once players have picked it. If you change or remove it, those phones go back to the default wallpaper.
Wallpapers from links. Players can also paste an image link in Settings → Wallpaper → From a Link, but only from sites you approve. In /phone settings, open Home & Apps → Home screen and add each site under Approved wallpaper links, for example images.example.com (its subdomains count too) or an address links must start with, such as https://cdn.example.com/wallpapers/. Leave the list empty to turn this off. See Configuration → Home Screen.
Translations
All player-facing text is in locales/en.json. To translate the phone:
- Copy
locales/en.jsonto a new file named after your language code, for examplelocales/de.json. - Translate the text on the right side of each line. Keep the
%smarkers: they are filled in with names, numbers and times. - Set ox_lib's language in
server.cfg, for examplesetr ox:locale de, and restart the server.
The /phone settings menu is English only.
Admin Access
The admin parts of the phone (/phone settings, the other /phone commands and Feed moderation) 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.
Updating
- Replace the folders with the new versions from your Cfx Portal assets:
oxide-phoneand each app you use. Each one is updated on its own. Your settings and players' data are in the database, so you lose nothing. - Restart the whole server. A running server keeps an old list of each resource's files until
refreshis typed in the server console, so a plainrestart oxide-phoneafter an update can run with parts missing. A full restart avoids that. If you must update without one, typerefreshfirst, thenrestart oxide-phoneandrestarteach app. - Update
o-linktoo when the phone's update asks for a newer one.
New tables and columns are added by the phone and the apps themselves when they start.
Verification
Start your server and watch the server console. There should be no red errors mentioning oxide-phone, and you should see a line like this:
[INFO][oxide-phone][lifecycle] phone readyIn the short line under it, voice says whether calls work (false means pma-voice isn't running or its phone calls are off; see Calls), and media is the photo storage you chose. On the very first start you'll also see a configSeeded line before it. That is the phone copying your settings into the database. It's normal.
Give yourself a phone in game. Replace YOUR_ID with your in-game server ID:
/giveitem YOUR_ID phone 1Use the phone from your inventory. The phone should open in your character's hand and show the home screen with Phone, Messages, Mail and Camera in the dock.
Check the server console. The first time a brand-new phone is used after a start, one of these lines appears:
inventory keeps item metadata; phones carry their own data: every phone item is its own device. This is what you want.inventory cannot keep item metadata; each character gets one phone: see Inventories and Item Data.
Open Settings → General on the phone. You should see a Device ID and a Phone number. The number comes from the free SIM a new phone gets.
Put the phone away with ESC, then press F1 (the default key). The phone opens again.
As an admin, type /phone settings. The Phone Settings menu should open. This confirms your admin permission works.
Open the Store on the phone. Each app you installed (Hookr, Leakd, Glitch) is listed there, next to Dark Chat and Feed. If you installed an app and it isn't listed, check your o-link version first (see Required Resources).
If any step doesn't match what you see, go to Troubleshooting.
Next Steps
Oxide Phone
Framework-agnostic smartphone for FiveM — phones as inventory items with SIM cards, calls, texts, mail, a camera, everyday apps and a Store, three included apps, and a full police evidence layer.
Configuration
Every setting in oxide-phone, what it does in game, its default value and where to find it in the /phone settings menu — plus how database-backed settings work, the o-link map mode and the app ID reference.