Browse docs

Installation

Install Free Phone, configure inventory items and ACE access, choose SQL or file configuration, and verify the first startup.

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

TypeSupported options
DatabaseMySQL or MariaDB with oxmysql
FrameworkESX Legacy, Qbox, or QBCore
Inventoryak47, CodeM, Core, Jaksam, JPR, LJ, MF, One, Origen, ox, PS, QB, QS, SMX, TGIANN, hex, or native ESX; see metadata requirements below
CallsYACA, PMA Voice, or SaltyChat
RadioYACA, 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/config.lua — Part 1
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 and choose your actual inventory. The tabs cover all 17 Phone adapters with item locations, complete definitions or item-editor fields, and image destinations. Check Inventory compatibility below before using Core, MF, SMX, HEX or native ESX.

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, including both physical SIMs, consume = 0 and the ox-specific Phone client exports. Follow the ox compatibility checks below to verify the inventory version and remove the old NPWD phone handler if present.

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 tabs contain each provider's native item format and adapter value. TGIANN, for example, uses the tgiann adapter and requires hasMetadata = true on all three items. Keep its framework usable callbacks; a roleplay item action bypasses them.

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 under Inventory compatibility. 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:

server.cfg
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:

server.cfg
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 /phonepanel and 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

FilePurpose
config/config.lua Part 1Always file-owned: Configurator switch, fixed ACE groups and local custom tones
config/config.lua Part 2File-mode values for framework, inventory, devices, SIMs, calls, apps, limits and providers; use the panel in SQL mode
config/media.luaServer-only file-mode media values; use the Media panel section in SQL mode
config/functions.luaFile-owned death, cuff and phone-opening hooks
config/WebHooks.luaServer-only logging defaults; the separate Webhooks editor stores SQL overrides
config/locales/en.luaCanonical English locale and fallback structure
config/locales/de.luaGerman 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/config.lua — file mode
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
ModeBehavior
trueEach phone item has its own IMEI. Settings, apps, account link, local data, and SIM follow that item. The item must not stack.
falseEach 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
ModeBehavior
trueThe phone itself opens without a SIM; cellular service requires an inserted registered or anonymous physical SIM item.
falseDevices 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.lua
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",
}
Keep each value private, different, and stable. Changing a pepper invalidates the passcodes or passwords protected by that value. This snippet identifies the panel fields; do not paste private values into shared 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

Inventory compatibility

These checks describe the adapters shipped with Phone 1.1.0. Finish the selected inventory's framework installation, choose its adapter in Phonepanel, save with the checkmark and restart after changing it. In SQL configuration mode, editing Part 2 of config.lua does not change the active inventory settings.

Unique phones and physical SIMs require individual item metadata and separate slots. Leave initial identities empty: Phone assigns IMEIs, SIM identities and numbers. Keep normal inventory use enabled and let Phone remove a SIM after a successful insertion. Do not add another use callback or automatic consumption.

ox_inventory

Phone listens for the server-side ox_inventory:usedItem event introduced in ox_inventory 2.38.0. An older version can close the inventory without reaching Phone's server handler. For forks, verify that the completed-use event still exists.

Search the complete inventory resource for Item('phone' and Item("phone", including modules/items/client.lua or the older items/client.lua. Remove this NPWD handler if present:

Item('phone', function(data, slot)
    local success, result = pcall(function()
        return exports.npwd:isPhoneVisible()
    end)

    if success then
        exports.npwd:setPhoneVisible(not result)
    end
end)

Keep the phone definition and Sky Phone client.export. The old handler can intercept use even when NPWD is stopped. Remove competing phone handlers, restart the server and recheck after inventory updates.

Core and MF

Phone 1.1.0's Core adapter expects a flat item list from getInventory and a slot for removeItemExact. Core's documented API uses a wrapper with content and an internal unique item ID for removal. An installation using that contract needs a matching adapter update; item definitions cannot fix it. On compatible versions, keep the sky_phone_devices category without a stack property and include all three names in Config.CloseAfterUse.

Merge this category into Core's existing configuration before adding the item definitions:

Config.ItemCategories["sky_phone_devices"] = {
    color = "#f2f2f2",
    takeSound = "take",
    putSound = "put",
}

The MF adapter requires ESX and the actual slot item as the fourth usable-callback argument. The older public MF examples use a different argument layout. Check the installed integration against the Phone MF adapter; unique = 1 cannot correct a callback mismatch.

SMX, HEX and native ESX

SMX stores one metadata record per character and configured item name. Multiple copies cannot represent independent phone identities through this bridge. Use Phone.Unique = false and Sim.Enabled = false, or choose an inventory with per-item metadata for transferable devices and physical SIMs.

HEX and native ESX provide count-based items. Phone automatically disables unique phones and physical SIMs for both adapters. Register the phone item only; adding SIM rows or unique flags does not enable physical SIM support.

Provider-specific setup

PS and JPR require QBCore in Phone's adapters. The codem adapter targets mInventory Remake (codem-inventory), not CodeM Supreme V2. Jaksam item entries must be persisted in its item file or editor; remove imported ox-only use hooks. One uses its persistent /inventory:manage editor, since runtime item-definition exports do not survive an inventory restart.

Test phone use, SIM insertion, transfers, stored identities and images with the installed provider before distributing the items. Optional metadata tooltips and SIM removal use the Phone exports.

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

  1. Back up the database, including the Configurator and Webhooks SQL settings.
  2. Back up file-owned configuration, custom tones, music and other assets.
  3. Preserve all four production pepper values.
  4. Replace the resource files.
  5. 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.
  6. Add both Phone resource ACE grants and verify administrator membership when updating from the old framework-role checks.
  7. Restart Free Phone, review warnings/errors, then verify admin access, General settings, phone/SIM item use and player hotkeys.
Use Configuration for General, command permissions, FiveM key capture and troubleshooting. Continue with the Exports and Events pages when integrating external resources.