Browse docs
Installation
Free Phone
Free Phone is a complete FiveM smartphone with an iPhone-inspired Sky UI, persistent devices, physical or virtual SIM cards, calls, messages, social networks, media apps, server services, games, and custom-app compatibility.
Requirements
| Type | Supported options |
|---|---|
| Database | MySQL or MariaDB with oxmysql |
| Framework | ESX Legacy, Qbox, or QBCore |
| Inventory | ak47, CodeM, Core, Jaksam, JPR, LJ, MF, One, Origen, ox, PS, QB, QS, SMX, TGIANN, hex, or native ESX; see metadata requirements below |
| Calls | YACA, PMA Voice, or SaltyChat |
| Radio | YACA, PMA Voice, or SaltyChat |
Start the selected framework, inventory, and voice resources before sky_phone.
Free Phone uses its own framework bridge and file storage. It does not require sky_base or an
add_filesystem_permission sky_base write sky_phone entry. For other Sky resources installed on
the same server, follow Filesystem permissions.
Phone requires its own administrator ACE setup. Permissions granted to Sky Base do not grant Phone permission to register its command access.
Install the resource
Copy Free Phone
Download the published release package, copy its resource into your FiveM resources directory,
and keep the folder name exactly sky_phone. GitHub's automatically generated Source code
archives do not include the built frontend. Stop any other phone resource handling the same item.
Configure the server
Open config/config.lua and choose the configuration owner first:
Config.PhoneConfigurator = {
Enabled = true,
}
With the default true, use /phonepanel → Phone configurator → General after starting
the server with the ACE setup below. Verify framework, inventory, language, phone item, unique
device mode, physical SIM mode and voice provider, then save with the checkmark. Automatic
provider detection is available for framework and inventory.
Part 1 (PhoneConfigurator, CommandPermissions, CustomTones) always stays file-owned.
Part 2 and media.lua are ignored in SQL mode, even on the first start. To configure by file,
set the switch to false, edit Part 2 and server-only config/media.lua, then restart.
See Configuration for the complete boundary,
restart behavior, permissions and key capture. Lua examples below identify the same fields;
in SQL mode, change them in the panel.
Add inventory items
Open Inventory Items & Setup and choose your actual inventory. The guide covers all 17 Phone adapters with item locations, complete definitions or item-editor fields, images, metadata requirements, and version limits.
Set the matching adapter in /phonepanel → Phone configurator → General → Framework & integrations → Inventory, save with the checkmark, and restart after changing it. Item definitions must use the same names as Phone.Item, Sim.RegisteredItem, and Sim.AnonymousItem.
ox_inventory
Use the complete ox definitions and required setup. This includes both physical SIMs, consume = 0, the ox-specific Phone client exports, and removal of the old NPWD phone handler if present. Upstream ox_inventory must provide the server usedItem event added in 2.38.0; older versions can close the inventory without completing Phone item use.
qb-inventory
Use the QB setup and its shared item template. It includes the phone and both SIMs for qb-core/shared/items.lua, with the matching images in qb-inventory/html/images/.
Other inventories
The inventory selector links to each provider's setup. TGIANN, for example, uses the tgiann adapter and requires hasMetadata = true on all three items.
Do not copy ox's sky_phone.UsePhoneItem or sky_phone.UseSimItem use exports into another inventory. These handlers call ox_inventory directly, even if another adapter is selected in Phonepanel. Use the provider's native item format and Phone's existing usable-item registration.
Add physical SIM items
With Sim.Enabled = true, register sky_phone_sim_registered and sky_phone_sim_anonymous using your provider's definitions. Both need independent, non-stackable item identities. Copy their PNGs, along with phone.png, from sky_phone/config/images/ into the image location listed in the guide.
Native ESX and HEX automatically disable unique phones and physical SIMs. SMX's character/item-name metadata has separate limits; Core and MF require the version checks described in their setup sections. With physical SIMs disabled, the phone item is still required.
Add the start order
Add both Phone ACE capabilities before starting the resource, and start Free Phone after its dependencies:
add_ace resource.sky_phone command.add_ace allow
add_ace resource.sky_phone command.remove_ace allow
ensure oxmysql
ensure es_extended
ensure ox_inventory
ensure pma-voice
ensure sky_phone
Replace the example framework, inventory, and voice resources with the providers used by your server.
For QB-Core with qb-inventory, the corresponding order is:
add_ace resource.sky_phone command.add_ace allow
add_ace resource.sky_phone command.remove_ace allow
ensure oxmysql
ensure qb-core
ensure qb-inventory
ensure pma-voice
ensure sky_phone
Verify administrators' ACE membership against Config.CommandPermissions in Part 1.
admin maps to group.admin; QBCore also registers qbcore.admin. A framework role alone is
insufficient. Phone does not need add_principal / remove_principal resource capabilities;
the server/framework owns player membership. See the
permission migration steps.
Start and verify
Restart the server and inspect the console. Free Phone creates and upgrades its database tables automatically, then registers the configured phone item. A manual SQL import is normally not required.
In SQL mode, open /phonepanel, review General and save. Restart after changing providers,
device identity modes or keyboard defaults. Use the configured phone item or the default F1
shortcut to open the phone. Existing personal FiveM bindings still take priority.
Manual database installation
Hosts that require a manual schema import can run:
sky_phone/sql/install.sql
Keep runtime migrations enabled after the import because they install future schema upgrades.
First-start checklist
- The server console reports the selected framework and inventory without errors.
- An authorized administrator can open
/phonepaneland save in SQL mode; an unprivileged player is denied. - General shows the intended values after reopening the panel and restarting the resource.
- The configured phone item opens the phone.
- Unique phones receive a persistent IMEI and do not stack.
- A physical SIM provides cellular service, or automatic numbers work when SIMs are disabled.
- Calls have audio through the configured voice provider.
- Light and dark modes render correctly.
- The server-owned pepper values have been replaced and stored safely before production use.
Production setup guide
Review the following settings before opening a production server. In SQL mode, change them in the Configurator and save. Lua snippets below show field names and file-mode examples; do not replace complete configuration tables with these abbreviated examples.
Configuration files
| File | Purpose |
|---|---|
config/config.lua Part 1 | Always file-owned: Configurator switch, fixed ACE groups and local custom tones |
config/config.lua Part 2 | File-mode values for framework, inventory, devices, SIMs, calls, apps, limits and providers; use the panel in SQL mode |
config/media.lua | Server-only file-mode media values; use the Media panel section in SQL mode |
config/functions.lua | File-owned death, cuff and phone-opening hooks |
config/WebHooks.lua | Server-only logging defaults; the separate Webhooks editor stores SQL overrides |
config/locales/en.lua | Canonical English locale and fallback structure |
config/locales/de.lua | German locale overrides |
config/music/ | Server-owned MP3/OGG tracks and optional artwork |
Framework, inventory, and locale
Use General → Framework & integrations. In file mode, edit the existing Bridge fields:
Config.Bridge.Framework = "auto" -- auto, esx, qbox, qb
Config.Bridge.Inventory = "auto"
Config.Bridge.Locale = "en" -- 15 bundled locales, including en and de
Config.Bridge.Debug = false
Use explicit provider values when automatic detection could select the wrong resource. Debug mode adds diagnostic information; warnings and errors are always printed.
Choose a device mode
Config.Phone.Unique = true
| Mode | Behavior |
|---|---|
true | Each phone item has its own IMEI. Settings, apps, account link, local data, and SIM follow that item. The item must not stack. |
false | Each framework character receives one persistent virtual device. Any configured phone item opens that device. |
With unique phones, using an item selects that exact handset. The F1 key reopens the last selected
IMEI; when no handset has been selected, the server chooses the first concrete phone slot.
Choose a SIM mode
Config.Sim.Enabled = true
| Mode | Behavior |
|---|---|
true | The phone itself opens without a SIM; cellular service requires an inserted registered or anonymous physical SIM item. |
false | Devices without a SIM receive a persistent automatic number. Physical SIM items are not required. |
Test device- or SIM-mode changes on a database copy before applying them to an existing production server.
These are separate switches under General → Devices & SIM cards. Disabling physical SIMs does not prevent opening the phone and does not replace existing numbers. New number prefix and length values affect newly generated numbers only.
Configure calls and radio
Config.Calls.VoiceProvider = "pma" -- auto, yaca, pma, pma-voice, saltychat, salty
Config.Radio.VoiceProvider = "auto" -- auto, yaca, pma, saltychat
Start the selected voice resource before Free Phone. Radio's automatic selection checks YACA,
PMA Voice, and SaltyChat. Configure restricted frequencies in Config.Radio.LockedChannels and
display-name permissions in Config.Radio.DisplayName.AllowedJobs.
Configure media
In SQL mode, enter FiveManage and GIPHY keys in the Media detail section and save. In file mode, edit the server-only media file and restart:
Config.Media.FiveManage.ApiKey = "your-fivemanage-v3-media-token"
Config.Media.GiphyApiKey = "your-giphy-api-key"
Without a valid FiveManage token, Camera uploads, video uploads, Voice Memo uploads, and FiveManage
Gallery imports are unavailable. Limit Gallery import origins through
Config.Media.Import.Websites; direct URLs are accepted only from configured HTTPS hosts.
Configure server-owned music
Place MP3 or OGG files anywhere below config/music/. Optional artwork can use WEBP, PNG, JPG, or
JPEG. Define stable tracks in Config.Music.Tracks:
Config.Music.Tracks = {
{
Id = "night-drive",
Title = "Night Drive",
Artist = "Sky Records",
},
}
Name files after the track ID, for example night-drive.ogg and night-drive.webp. Restart
sky_phone after adding tracks.
Set production security values
On a new production server, use Phone configurator → Server to replace all four defaults with long, random, different values before players create passcodes or social accounts:
Config.Server = {
PasscodePepper = "replace-with-a-long-random-value",
CrewLinkPasswordPepper = "replace-with-a-separate-random-value",
FlipTokPasswordPepper = "replace-with-another-random-value",
PicstagramPasswordPepper = "replace-with-a-third-random-value",
}
config.lua. Clients download that file even inside a server-only
execution block. File mode has no private pepper storage; use SQL mode for private peppers.Players must treat Sky Cloud and social-app credentials as in-character roleplay credentials and must never reuse real-world passwords.
Configure optional apps
- Select a Garage provider in
Config.Garage.System. - Select a Housing provider in
Config.Housing.System. - Define company jobs, profiles, services, phone numbers, permissions, and availability under
Config.Companies.Definitions. - Configure Weazel News editorial jobs and grades under
Config.WeazelNews.AllowedJobs. - Add trusted external CrewLink ping resources to
Config.CrewLink.ExternalPingResources. - Configure custom-app origins, storage ceilings, rate limits, and adapters under
Config.CustomApps.
Disable development tools
Before production, review:
Config.Phone.DevelopmentCommand = false
Config.TestData.Enabled = false
Config.Bridge.Debug = false
Migrate from LB Phone
Free Phone detects supported LB Phone tables but never starts an import automatically.
Back up the database
Create a complete backup before previewing or importing data.
Preview the migration
Run from the server console:
skyphone:migrate lb-phone dry
Import and verify
skyphone:migrate lb-phone
Restart the resource and verify accounts, devices, calls, messages, media, and social apps. Use
force for an idempotent retry or remove to remove data created by the migration.
Update safely
- Back up the database, including the Configurator and Webhooks SQL settings.
- Back up file-owned configuration, custom tones, music and other assets.
- Preserve all four production pepper values.
- Replace the resource files.
- Preserve Part 1. In SQL mode keep the saved Configurator row; file edits do not import into it. In file mode merge configuration options instead of overwriting the new config blindly.
- Add both Phone resource ACE grants and verify administrator membership when updating from the old framework-role checks.
- Restart Free Phone, review warnings/errors, then verify admin access, General settings, phone/SIM item use and player hotkeys.