Browse docs

Configuration

Configure Free Phone through the General page, separate SQL and file settings, set up ACE groups, and record valid FiveM keyboard bindings.

Configuration and permissions

Open /phonepanel → Phone configurator → General to manage the main server settings. In German, this page is named Allgemein. These settings apply to the server; the Settings app on a player's phone manages that device's personal preferences.

For a new server, complete the installation steps and the ACE setup below first.

Choose SQL or file configuration

Config.PhoneConfigurator.Enabled = true is the default. Its switch is in Part 1 of sky_phone/config/config.lua and always requires a resource restart after editing.

ConfigurationSQL mode: Enabled = trueFile mode: Enabled = false
Part 1: PhoneConfigurator, CommandPermissions, CustomTonesEdit the file and restartEdit the file and restart
Part 2: framework, inventory, phone, SIMs, voice, apps and other settingsEdit in Phone configurator and saveEdit Part 2 of config.lua and restart
config/media.luaEdit the Media section in Phone configuratorEdit this server-only file and restart
Locale files, config/functions.lua, inventory definitions and custom assetsFile-ownedFile-owned
config/WebHooks.luaSeparate Webhooks editor with its own SQL overridesSame separate Webhooks editor; unaffected by the Configurator switch
In SQL mode, editing Part 2 or media.lua does not change the active configuration, including on the first start. The shipped source/shared/config_default.lua supplies initial defaults, and sky_phone_configurator stores the saved values. Do not edit generated defaults or delete the SQL row to apply a setting.

Switching to file mode does not export SQL settings into Lua files. Review the file values before switching and restarting. The saved SQL values remain available when SQL mode is enabled again. File mode makes the Configurator read-only; other authorized Phonepanel tools remain available when AdminPanel.Enabled is on.

General page

GroupSettings
Devices & SIM cardsPhone.Unique, Sim.Enabled, Phone.Item, Phone.DeviceName, Sim.NumberPrefix, Sim.NumberLength
Framework & integrationsBridge.Framework, Bridge.Inventory, Bridge.Locale, Calls.VoiceProvider
Phone usePhone.BlockWhenDead, Phone.BlockWhenCuffed, Phone.AllowMovement, Phone.HoldToLook.Enabled
Keyboard & commandsPhone.Keybind, CrewLink.QuickPing.Enabled, CrewLink.QuickPing.DefaultKey, Phone.HoldToLook.Control, Command, Phone.DevelopmentCommand

General and the detail sections edit the same draft. Moving between them keeps your changes. Use the detail sections for the remaining settings, such as SIM item names, radio providers, cell towers, media and app limits. Search matches field labels, descriptions and paths.

Device identity and physical SIMs

SettingEnabledDisabled
Unique phones: Phone.UniqueEvery phone item has its own IMEI and device data. Giving away that item transfers the handset.All phone items for one framework character open that character's persistent device.
Physical SIMs: Sim.EnabledCalls and messages require an inserted physical SIM. The phone itself can open without one.Devices without a SIM receive a persistent automatic number. Physical SIM items are unnecessary.

The switches are independent. Unique phones need per-slot metadata and non-stackable phone items. Physical SIMs need metadata-capable, non-stackable SIM items even when unique phones are disabled. Native ESX inventory and hex_4_inventory force both switches off because they cannot store that metadata, including when selected through auto.

Test identity/SIM changes on a database copy before changing an established server, then restart and verify item use, retained device data, calls and messages. Disabling physical SIMs does not bulk-replace existing numbers. Number prefix and length changes affect newly generated numbers; length includes the prefix, and the prefix accepts digits only.

Save and restart

Changes do not autosave. Press the checkmark in the panel header and wait for confirmation. The server checks permissions, field values and the configuration revision before storing both payloads. A failed save retains the draft. After a revision conflict, compare the draft with the current server values and reapply the intended changes.

Restart sky_phone after changing framework, inventory or voice providers, identity modes, or keyboard defaults. Saving does not restart the resource. Existing SQL settings remain in the same table and format; the General page requires no manual SQL migration.

Administrator access

Free Phone uses the same Config.CommandPermissions group convention as the Jobs resources, implemented inside sky_phone. It has no runtime dependency on Sky Base or Jobs Base.

Add both lines to server.cfg before ensure sky_phone:

server.cfg
add_ace resource.sky_phone command.add_ace allow
add_ace resource.sky_phone command.remove_ace allow

The first grant allows Phone to register its configured ACEs. The second removes grants installed by Phone when it stops, so removed groups do not retain those grants after a restart. If either capability is missing, the console reports it and protected Phone actions are denied. Grants for resource.sky_base do not apply to resource.sky_phone.

Phone does not need command.add_principal or command.remove_principal. Player membership remains part of the server/framework permission setup.

Edit the existing table in Part 1 of config/config.lua:

config/config.lua
Config.CommandPermissions = {
    phonepanel = { "god", "superadmin", "admin" },
    phonetestdata = { "god", "superadmin", "admin" },
    fliptokverify = { "god", "superadmin", "admin" },
    picstagramverify = { "god", "superadmin", "admin" },
    picstagramadmin = { "god", "superadmin", "admin" },
}

Values are group suffixes: admin grants group.admin access to sky_phone.<permission>. For QBCore, Phone also grants the corresponding qbcore.admin principal. ESX and Qbox use group.*. Do not enter group.admin or player identifiers as values in this table.

Your player must inherit an allowed ACE group. If your existing admin setup does not establish membership, an example server configuration entry is:

server.cfg
add_principal identifier.license:YOUR_LICENSE group.admin

Replace the placeholder with the actual identifier. This is server configuration, not a resource capability for Phone. A framework-only role, a job called admin, or Qbox HasGroup does not independently authorize Phone administration.

Every protected request checks sky_phone.<permission> again on the server. Explicit ACE denies apply, and revocation takes effect on the next action even while the panel is open. Missing or empty permission lists deny player access. The phonetestdata group check applies when TestData.AdminOnly is enabled; keep test data disabled in production.

Permission keys stay fixed if you rename commands. Granting command.phonepanel alone does not authorize the panel callbacks. The Configurator cannot edit its own permission table.

Update from the previous permission model

  1. Add both Phone resource grants before starting the resource.
  2. Verify administrator ACE membership; previous framework-role and Qbox role/job fallbacks no longer apply.
  3. Review the existing Part 1 group lists and restart sky_phone.
  4. Test an allowed user and an unprivileged user, then revoke access while the panel is open.
  5. Check policy and inheritance separately in the server console:
test_ace group.admin sky_phone.phonepanel
test_ace identifier.license:YOUR_LICENSE sky_phone.phonepanel

A successful group test does not prove player membership. Effective grants that already exist before Phone starts are left in place and may still grant access independently of the lists. Avoid manually duplicating Phone-managed principal/object allow pairs: Cfx remove_ace removes all matching allow entries during cleanup. Deny entries remain untouched.

Record a keyboard shortcut

For Phone.Keybind and CrewLink.QuickPing.DefaultKey, choose a key from the selector or click Record key and press one key. Escape cancels recording without closing the panel; Tab leaves capture. Choose those keys from the selector if needed. Modifier combinations and unknown input are rejected. The phone shortcut has a separate disable switch that stores false.

The saved value is a FiveM KEYBOARD mapper ID, not the character printed on the key, a browser KeyboardEvent.code, or a numeric GTA control. German Windows layout examples:

KeySaved FiveM ID
ÜOEM_1
ÖOEM_3
ÄOEM_7
ßOEM_4
<OEM_102
Main EnterRETURN
NumPad EnterNUMPADENTER

Capture uses the Windows virtual-key value forwarded by FiveM CEF for OEM keys. A US physical-key map would give incorrect results for German keys. If the event lacks a usable code, choose a verified ID from the selector. The server validates the saved ID too.

These are server defaults. After saving and restarting, players with existing bindings may still need to change/reset their own binding under FiveM Settings → Key Bindings → FiveM. Capturing a key does not rebind the administrator's personal controls.

Phone.HoldToLook.Control and SkyPic.Camera.*Control remain numeric GTA control indices. For example, 19 is INPUT_CHARACTER_WHEEL, normally Left Alt. Do not paste OEM_1 or a browser virtual-key number into those fields. See the official FiveM keyboard IDs.

Secrets and backups

In SQL mode, enter API keys and peppers in the Media, RealtimeSecrets and Server detail sections. Existing values are masked; leave them unchanged to retain them. Preserve all four Server peppers during updates and back up sky_phone_configurator with the rest of the database. Changing a pepper invalidates the existing credentials protected by it.

Clients download config.lua, including blocks guarded by IsDuplicityVersion(). File mode does not provide private pepper storage; use SQL mode for private peppers. In file mode, media keys belong in server-only config/media.lua, and Cloudflare credentials use the documented non-replicated sky_phone_cf_* convars. Custom tones, Lua hooks, inventory definitions and custom assets must also be backed up separately.

Troubleshooting

SymptomWhat to check
Config file edits do nothingConfirm the mode. SQL mode ignores Part 2 and media.lua; edit the panel and save.
/phonepanel is denied or unavailableBoth Phone ACE grants, the player's actual ACE membership and denies, CommandPermissions.phonepanel, and active AdminPanel.Enabled / AdminPanel.Command. Read console diagnostics.
Unique phones or physical SIMs stay disabledVerify the active inventory supports metadata; native ESX and hex force both off.
Save failsKeep the draft for comparison. Resolve validation errors or reload the current revision after a conflict, reapply changes, then save.
The old hotkey still opens the phoneRestart after changing server defaults and check that player's saved FiveM binding.
An OEM key cannot be capturedSelect the verified FiveM ID; do not enter the printed character or guess a US key position.

For implementation references and the separate live FiveM checks, see the repository's configuration guide. Browser tests and successful builds do not verify actual CEF keyboard layouts or live server permissions.