Browse docs
Configuration
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.
| Configuration | SQL mode: Enabled = true | File mode: Enabled = false |
|---|---|---|
Part 1: PhoneConfigurator, CommandPermissions, CustomTones | Edit the file and restart | Edit the file and restart |
| Part 2: framework, inventory, phone, SIMs, voice, apps and other settings | Edit in Phone configurator and save | Edit Part 2 of config.lua and restart |
config/media.lua | Edit the Media section in Phone configurator | Edit this server-only file and restart |
Locale files, config/functions.lua, inventory definitions and custom assets | File-owned | File-owned |
config/WebHooks.lua | Separate Webhooks editor with its own SQL overrides | Same separate Webhooks editor; unaffected by the Configurator switch |
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
| Group | Settings |
|---|---|
| Devices & SIM cards | Phone.Unique, Sim.Enabled, Phone.Item, Phone.DeviceName, Sim.NumberPrefix, Sim.NumberLength |
| Framework & integrations | Bridge.Framework, Bridge.Inventory, Bridge.Locale, Calls.VoiceProvider |
| Phone use | Phone.BlockWhenDead, Phone.BlockWhenCuffed, Phone.AllowMovement, Phone.HoldToLook.Enabled |
| Keyboard & commands | Phone.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
| Setting | Enabled | Disabled |
|---|---|---|
Unique phones: Phone.Unique | Every 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.Enabled | Calls 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:
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.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:
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
- Add both Phone resource grants before starting the resource.
- Verify administrator ACE membership; previous framework-role and Qbox role/job fallbacks no longer apply.
- Review the existing Part 1 group lists and restart
sky_phone. - Test an allowed user and an unprivileged user, then revoke access while the panel is open.
- 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:
| Key | Saved FiveM ID |
|---|---|
| Ü | OEM_1 |
| Ö | OEM_3 |
| Ä | OEM_7 |
| ß | OEM_4 |
< | OEM_102 |
| Main Enter | RETURN |
| NumPad Enter | NUMPADENTER |
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
| Symptom | What to check |
|---|---|
| Config file edits do nothing | Confirm the mode. SQL mode ignores Part 2 and media.lua; edit the panel and save. |
/phonepanel is denied or unavailable | Both 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 disabled | Verify the active inventory supports metadata; native ESX and hex force both off. |
| Save fails | Keep 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 phone | Restart after changing server defaults and check that player's saved FiveM binding. |
| An OEM key cannot be captured | Select 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.