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 & 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:

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

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.