Configuration
919PHONE is configured through two Lua files and one locale file. Most server owners only need to edit config.lua and config_s.lua.
| File | Scope | Editable |
|---|---|---|
config.lua |
Shared - client + server | Yes |
config_s.lua |
Server only | Yes |
locale.json |
UI strings | Yes |
modules_editable/bridge/ |
Framework hooks | Yes |
General
Config.OpenKey = 'M' -- keybind to open/close the phone
Config.AllowWalkingWhileOpen = true -- allow movement while NUI is openPhone item
Config.PhoneItem = {
Enabled = true,
Item = 'phone', -- must match your inventory item name exactly
}Set Enabled = false to allow opening the phone without carrying an item (keybind only).
Phone prop
Controls the world prop shown during open/call animations.
Config.PhoneProp = {
Enabled = true,
Model = 'prop_npc_phone_02',
Bone = 28422,
Offset = { x = 0.0, y = 0.0, z = 0.0 },
Rotation = { x = 0.0, y = 0.0, z = 0.0 },
}Passcode lockout
Config.ContactShareRange = 8.0 -- meters for nearby contact sharing
Config.PasscodeMaxAttempts = 5 -- wrong attempts before lockout
Config.PasscodeLockoutDuration = 30 -- lockout duration in secondsDefault player settings
Applied when a character's phone is first created or fully reset by an admin.
Config.DefaultSettings = {
theme = 'dark',
setupCompleted = false, -- starts first-run setup wizard on first use
brightness = 100,
volume = 75,
texttone = 'Tone 1',
vibration = true,
silentMode = false,
doNotDisturb = false,
phoneSize = 'large',
showCallerID = true, -- when false, outgoing calls appear as "No Caller ID"
blockedNumbers = {},
healthAlerts = {
hungerEnabled = true,
hungerThreshold = 25,
thirstEnabled = true,
thirstThreshold = 25,
stressEnabled = true,
stressThreshold = 75,
},
}Players can change most of these in the in-game Settings app. Values here only affect new characters and admin resets.
Media (ringtones, text tones, music)
Add audio files under web/build/ in the resource. Paths in config are relative to the resource root as served to NUI (web/build/).
Config.Ringtones = {
{ name = 'Default', file = 'ringtones/midnight.mp3' },
}
Config.Texttones = {
{ name = 'Tone 1', file = 'texttones/texttone1.mp3' },
}
Config.MusicTracks = {
{ name = 'Midnight Drive', artist = 'Artist Name', file = 'music/track.mp3', art = 'music/track.png' },
}The art field on music tracks is optional.
Voicemail
Voicemail recordings and custom inbox greetings are uploaded to FiveManage (same API key as photos). The default greeting is bundled at web/public/default_voicemail.mp3.
Config.Voicemail = {
MaxRecordingSeconds = 60, -- max length of a message left by a caller
MaxMessagesPerPhone = 50, -- inbox cap per phone number
RetainDays = 30, -- auto-delete messages older than this
}Default settings for new characters:
voicemailGreetingUrl = '', -- empty = bundled default greeting
voicemailGreetingFileId = '',Players configure their greeting in Settings → Voicemail. Callers are routed to voicemail when the callee is offline, on Do Not Disturb, does not answer within 30 seconds, or declines the call. Busy lines do not offer voicemail.
NUI microphone access is required for recording greetings and leaving messages.
Maps
Permanent map pins visible to all players in the Maps app.
Config.MapPins = {
{ label = 'Hospital', x = 295.9, y = -1446.7, icon = 'fa-hospital', color = '#ff3b30' },
}x/y- GTA V world coordinatesicon- Font Awesome solid icon name (withoutfa-prefix in config values shown above use full fa name likefa-hospital)color- hex color for the pin marker
Players can also save personal pins; those persist per character in the database.
Health alerts
Config.Health = {
PollInterval = 5000, -- ms between stat checks
AlertCooldown = 120, -- seconds before the same alert can fire again
RecoveryMargin = 5, -- % recovered past threshold before re-arming
}Hunger, thirst, and stress are read from your framework via the bridge (modules_editable/bridge/).
Config.Mail = {
EmailSuffix = '@celltowa.com',
SubjectLimit = 80,
BodyLimit = 2000,
SendCooldown = 10,
PageSize = 25,
NoReplyName = 'noreply',
}Players claim an address once inside the Mail app. Other resources can send mail via exports.
Hagglr (classifieds)
Config.Hagglr = {
PostCooldown = 60,
TitleLimit = 80,
BodyLimit = 500,
PriceLimit = 30,
AllowImages = true,
PageSize = 20,
}Tweeder (social)
Config.Tweeder = {
PostCooldown = 30,
ReplyCooldown = 15,
LikeCooldown = 2,
ReportCooldown = 300,
CharLimit = 280,
ReplyCharLimit = 280,
PageSize = 30,
ModerateAce = 'admin',
BlockedWords = {}, -- lower-case substrings
AllowImages = true,
}Staff with the ACE permission set in ModerateAce can delete posts in-game. Reports and deletions are forwarded to Config.Logs in config_s.lua (see Moderation logging below).
Cloutgram (Instagram-style social)
Config.Cloutgram = {
PostCooldown = 30,
CommentCooldown = 10,
StoryCooldown = 60,
LikeCooldown = 2,
ReportCooldown = 300,
CaptionLimit = 2200,
BioLimit = 150,
WebsiteLimit = 100,
MaxMediaPerPost = 10,
PageSize = 20,
StoryDuration = 86400, -- 24 hours in seconds
ModerateAce = 'admin',
BlockedWords = {},
AllowImages = true,
}Hagglr and Snitch also support player reports (Config.Hagglr.ReportCooldown, Config.Snitch.ReportCooldown). All four social apps log reports to Config.Logs.
App visibility
Set any app to false to hide it from all players' phones. Disabled apps are removed from the home screen and cannot be opened. Appstore apps (tweeder, hagglr, cloutgram) are also removed from the App Store catalog when disabled.
Config.Apps = {
phone = true,
messages = true,
contacts = true,
settings = true,
clock = true,
calendar = true,
camera = true,
photos = true,
notes = true,
appstore = true,
health = true,
weather = true,
calculator = true,
music = true,
maps = true,
banking = true,
mail = true,
tweeder = true,
hagglr = true,
}Changes take effect on server restart. Players already in-game will see the updated app list on their next phone open.
External App SDK
Config.Sdk = {
Enabled = true,
MaxExternalApps = 50,
MaxFetchPayload = 65536,
QueueMessagesWhenClosed = false,
}
Config.AllowedDefaultApps = {
-- myapp = true,
}Enabled- master switch for third-party app registrationMaxExternalApps- max concurrently registered external appsMaxFetchPayload- max JSON payload size for SDKfetchNuicallsQueueMessagesWhenClosed- hold the latestsendAppMessagefor each app until it is openedAllowedDefaultApps- ids allowed to register withcategory = 'default'
See SDK Getting Started.
Server-only config (`config_s.lua`)
Config.FiveManage = {
ApiKey = 'YOUR_FIVEMANAGE_API_KEY',
}
Config.Logs = {
FiveManage = {
ApiKey = 'YOUR_FIVEMANAGE_LOGS_API_KEY',
},
Discord = {
Webhooks = {
'https://discord.com/api/webhooks/...',
},
},
}FiveManage media key - required for:
- Camera captures and gallery uploads
- Photo attachments in Messages
- Image attachments on Tweeder posts and Hagglr listings
Moderation logs - optional; configure one or both:
- FiveManage Ingest Logs API (
Config.Logs.FiveManage.ApiKey, separate from the media key) - Discord webhooks (
Config.Logs.Discord.Webhooks) - all non-empty URLs receive each report/delete event
Reports are reviewed externally — in a Discord channel, the FiveManage dashboard, or an admin menu using the exports. The phone does not include a staff moderation inbox.
Localization
All UI text lives in locale.json at the resource root. Edit this file to change app names, settings labels, error messages, and notification copy. Restart the resource after saving.
Bridge customization
For framework-specific behavior, edit:
modules_editable/bridge/bridge_s.lua -- server
modules_editable/bridge/bridge_c.lua -- clientThe bridge is auto-selected based on your running framework and inventory. Override functions there when the defaults do not match your server setup.
Admin commands
All admin chat commands check the ACE permission configured in Config.Admin.Ace (default: admin).
Config.Admin = {
Ace = 'admin',
}Grant the permission in your server ACL (typically server.cfg):
add_ace group.admin admin allow
add_principal identifier.fivem:YOUR_ID group.adminStaff without this ACE receive a chat denial message. Commands do not fall back to another permission.
| Command | Description |
|---|---|
/resetphonepasscode [id] |
Clears a player's phone passcode |
/resetphonedata [id] |
Wipes all phone data and assigns a new phone number |
In-game social moderation (not chat commands)
Tweeder and Cloutgram in-game post deletion uses Config.Tweeder.ModerateAce and Config.Cloutgram.ModerateAce (both default to admin). That is separate from the chat commands above but uses the same ACE name by default.
Admin exports
These exports accept a character identifier instead of a server ID, which works well with admin menus such as 919ADMIN PRO. They do not check ACE permissions themselves — the script or admin menu that calls them should verify staff access first.
| Export | Description |
|---|---|
getPhoneIdentity(citizenid) |
Phone number, mail address, Tweeder/Cloutgram handles |
getIdentifierByPhoneNumber(number) |
Reverse lookup: phone number → citizenid |
deleteTweederPost(postId) |
Soft-delete a Tweeder post (offline-safe) |
deleteCloutgramPost(postId) |
Soft-delete a Cloutgram post (offline-safe) |
Identifier by framework:
| Framework | Identifier |
|---|---|
| QBCore / QBX | citizenid |
| ESX | character identifier (e.g. char1:…) |