Docs
RARX Phone cover

RARX Phone · Configuration

Configuration

Every rarx_phone config file explained - apps, features, keys, branding, coverage, AirShare, music, GIFs, logs, uploads, convars and languages.

  • Qbox
  • QBCore
  • ESX
  • v2.0.0
  • rarx_phone

How the configuration works#

Everything a server owner can change without touching code lives in the config/ folder of the resource. The files are loaded in this order (see fxmanifest.lua):

File Loaded on What it contains
config/config.lua client + server Core options: item, numbers, calls, messages, uploads, per-app limits, sounds, wallpapers, accents.
config/integraciones.lua client + server Banking, garage and housing integrations (resources, exports and database columns).
config/apps.lua client + server The app list (Apps), which RPC module belongs to which app (AppDomains) and app overrides (Config.Apps).
config/widgets.lua client + server Widget catalogue.
config/compat.lua client + server lb-phone compatibility layer (Config.Compat).
config/funciones.lua client + server Feature switches (Config.Features) and keys/commands (Config.Keys).
config/marca.lua client + server Branding (Config.Brand), icon packs, new-phone defaults (Config.Defaults) and text overrides (Config.Locale.Overrides).
config/cobertura.lua client + server Cell-tower coverage (Config.Coverage).
config/airshare.lua client + server Share-nearby (Config.AirShare).
config/music.lua client + server Music library and limits.
config/extra/*.lua client + server Additional modules: camera, car mode, garage, mail, social, accounts, Find Device, shortcuts, health, map POIs, and more.
config/logs.lua server only Logs per action (Discord, ox_lib or FiveManage) and public feed channels (Config.Logs).
config/gifs.lua server only GIF provider and API key for Messages (Config.Gifs).

Startup validation#

After the config files load, the resource checks the whole configuration on start. If a value is invalid, it prints a yellow warning in the server console and falls back to the default value (it never stops the resource):

Text
[rarx_phone] config: Config.Messages.MaxLength = 'lots' no es válido (debe ser un número); se usa 1000
[rarx_phone] config: Apps 'bank': dock = 9 debe ser 1, 2, 3 o 4; se quita del dock

If no warning appears, your configuration is valid. After changing any file in config/, run ensure rarx_phone (or restart the server).

Apps (config/apps.lua)#

Everything app-related is done in Config.Apps, without editing the Apps list itself.

Disable an app#

config/apps.lua
Config.Apps.Disabled = { 'crypto', 'blackmarket' }

A disabled app:

  • does not appear on the home screen, dock, app drawer, search, store, multitasking, notification settings or the admin panel;
  • cannot be opened (not even from a link, notification or widget);
  • has its server requests rejected (err_app_blocked). Modules shared by several apps (for example media, used by Gallery, Voice Memos, Camera and Messages) are only blocked when none of those apps is available.

settings cannot be disabled: the validator warns and keeps it enabled. The core apps (phone, messages, store, widgets) can be disabled, but think twice: without phone nobody can take calls, and without store nobody can install apps.

You can also disable an app with its feature switch (for example Config.Features.Crypto = false) or with enabled = false in Overrides.

Rename an app#

config/apps.lua
Config.Apps.Overrides = {
    dating = { name = 'Tinder' },
    music = { name = { es = 'Música RRX', en = 'RRX Music' } },
    news = { name = { default = 'Weazel', en = 'Weazel News' } },
}
  • name as a string: the same name in every language.
  • name as a per-language table: each language uses its own name; default is used for languages not listed. If a language is missing and there is no default, that language keeps its normal translation.

The name overrides the app_<id> translation key on the server, so it is shown everywhere: home screen, dock, drawer, search, store, multitasking, notifications (banner, notification centre, lock screen and closed-phone alerts), settings and the app title. It takes priority over the translation; Config.Locale.Overrides can still override a specific key.

The label field in the Apps list is only an internal fallback label. Use name to change the visible name.

Change the icon#

config/apps.lua
Config.Apps.Overrides = {
    dating = { icon = 'https://cdn.example.com/tinder.png' },
    bank = { icon = 'nui://my_banking/html/icon.png' },
    music = { icon = 'images/apps/my-music.png' },
    mail = { icon = { default = 'images/apps/mail.png', white = 'images/apps/mail-white.png' } },
}
  • Must start with https://, http://, nui:// or images/ (a path inside the resource's ui/ folder; images/apps/x.png is ui/images/apps/x.png).
  • As a table, the icon can change with the player's icon pack (realist, white, black); default is used for packs not listed.
  • If the image fails to load, the placeholder with the app's initial is shown.
  • Recommended: a square PNG of 180x180 or larger, without rounded corners (the phone adds them).

Position on the home screen and dock#

config/apps.lua
Config.Apps.Overrides = {
    camera = { dock = false, slot = 5 },
    bank = { dock = 4 },
}
  • dock = 1, 2, 3 or 4 (dock slot). false removes it from the dock. If two apps share a slot, the validator warns.
  • slot = default position on the home grid (lower = earlier). false removes the position (goes to the end).
  • This is only the default order: if a player rearranges their home screen, their order wins.

Installed by default or store only#

config/apps.lua
Config.Apps.Overrides = {
    darkchat = { default = false },
    blackmarket = { default = false, store = false },
}
  • default = false: new phones do not include it; the player installs it from the store. Players who already customised their apps keep what they had.
  • store = false: it does not appear in the store unless already installed and cannot be installed from it (if the player already has it, they can keep using and uninstall it). Useful for apps handed out by an admin or a job.
  • fija = true: always installed and cannot be uninstalled.

Restrict by job, grade, item or ACE permission#

config/apps.lua
Config.Apps.Overrides = {
    services = { requires = { jobs = { 'police', 'ambulance' } } },
    fines = { requires = { jobs = { police = 2, sheriff = 0 }, onDuty = true } },
    darkchat = { requires = { items = { 'burner_phone', 'laptop' } } },
    news = { requires = { ace = 'rarxphone.news' } },
}
  • jobs: a list of jobs, or a table of job = minimum grade.
  • onDuty = true: must also be on duty.
  • items: the player must carry any of these items.
  • ace: an ACE permission from server.cfg (add_ace group.admin rarxphone.news allow).
  • When combined, all conditions must be met.
  • Players who do not qualify do not see the app and the server rejects their requests. The check is cached for 5 seconds per player, so after dropping the item or changing job, access is lost within a few seconds (the icon disappears the next time the phone is opened).
  • This is independent of the admin panel app locks (block for everyone or per job), which keep working as usual.

Apps for specific phone models#

config/apps.lua
Config.Apps.Overrides = {
    fans = { models = { 'ifruit26', 'ifruitzfold' } },
}

Models: phone, ifruitduo, ifruit26, ifruitzfold or any item from Config.Item.Names. It is compared with the item used to open the phone. If the model is unknown (for example with Config.Item.Require = false), the app is shown.

App fields reference#

These fields can be set in Config.Apps.Overrides.<id> or directly on the entry in the Apps list.

Field Values Default What it does
enabled true / false true false disables the app completely.
name string or { es = '', en = '', default = '' } none Visible name (overrides the translation).
icon URL/path or per-pack table pack icon Icon.
dock 1-4 or false from the list Dock slot.
slot number or false from the list Default order on the home screen.
default true / false from the list Installed on new phones.
store true / false true Can be installed from the store.
fija true / false from the list Always installed, cannot be removed.
requires { jobs, onDuty, items, ace } none Who can use it.
models list of models none Which models show it.
label string id Internal fallback label.

Full example:

config/apps.lua
Config.Apps.Disabled = { 'crypto' }

Config.Apps.Overrides = {
    dating = { name = { es = 'Tinder', en = 'Tinder' }, icon = 'https://cdn.example.com/tinder.png', slot = 3 },
    fines = { requires = { jobs = { police = 0 } }, default = false },
    blackmarket = { default = false, store = false, requires = { items = { 'burner_phone' } } },
    fans = { models = { 'ifruit26', 'ifruitzfold' } },
}

App IDs#

phone, messages, rrx (Lenz), camera, store, widgets, gallery, settings, notes, calendar, map, weather, music, news, bank, ads, services, vehicles (Garage), mail, taxi, go, invoices, fines, clock, findmy (Find Device), dating (Flechazo), calculator, properties, browser, voicememo, crypto, darkchat, blackmarket, fans (Privé), birdy, shortcuts, health.

AppDomains (also in config/apps.lua) maps each RPC module to its app (bank to bank, rides to taxi and go, and so on). You do not need to touch it unless you add new apps.

Feature switches (config/funciones.lua)#

Each switch in Config.Features set to false turns that feature off on the server (requests are rejected with err_feature_off, or the related apps are disabled) and hides it in the interface. true leaves the feature as is.

Some switches are linked to older keys in config/config.lua (for example Crypto = Config.Crypto.Enabled == true), so you can change either one. On start, the value in Config.Features wins and is copied back to the old key.

Switch Default Linked to What it turns off
Calls true none Making calls. Emergency numbers from Config.Calls.Emergency still work.
VideoCalls true Config.Calls.AllowVideo Video calls.
Voicemail true Config.Voicemail.Enabled Leaving voicemail messages.
CallRecording true Config.Calls.AllowRecording Recording calls.
VoiceFilter true Config.Calls.AllowVoiceFilter Voice filter during calls.
Ringer3D true Config.Ringer3D.Enabled Other players hearing your ringtone.
WebRTC true Config.WebRTC.Enabled WebRTC video (when off, video uses frame streaming).
Pin true none Unlock passcode. Off: no new PINs can be set and existing ones do not lock the phone.
FaceId true none Face unlock. Face Unlock requires a PIN, so Pin = false also leaves it unusable.
Battery true none true = whatever the admin panel says (battery is off by default, Config.Battery.Enabled); false = always off.
Coverage true none Coverage (towers plus admin-panel zones). false = always 4 bars, nothing is blocked for lack of signal.
AirShare true none Share-nearby. false = share buttons go straight to Messages again.
Flashlight true none Flashlight.
Camera true none The Camera app.
Video true none Recording and uploading video (photos and audio still work).
Uploads true none All media uploads: photos, video, voice memos and voice messages.
Browser true Config.Browser.Enabled Browser app.
BrowserSearch true none Searching in the browser (URLs and bookmarks still work).
Crypto true Config.Crypto.Enabled Crypto app.
BlackMarket true Config.BlackMarket.Enabled Black Market app.
Ads true none Ads app.
Bills true none Invoices and Fines apps.
News true none News app.
Mail true none Mail app.
Music true none Music app.
DarkChat true Config.DarkChat.Enabled DarkChat app.
RRX true Config.RRX.Enabled Lenz app (internal id rrx).
RRXLive true Config.RRX.Live.Enabled Lenz live streams.
Fans true none Privé app.
Dating true none Flechazo (dating) app.
Taxi true none Taxi app.
Go true none GO app.
Services true none Services app.
Vehicles true none Garage app.
Valet true Config.Valet.Enabled Requesting your car via valet from Garage.
Properties true none Properties app (and its door/key buttons).
Admin true none The phone admin panel (command, admin and moderation requests).
Shop true Config.Shop.Enabled Physical phone shop.
Recovery true Config.Recovery.Enabled Line recovery at the shop.
CustomNumbers true Config.Numbers.Enabled Requesting custom numbers.
ExternalWidgets true none Widgets filled by other resources (SetWidgetData); with false, widgets with fuente = 'fuera' disappear from the catalogue.
ExternalApps true none Apps from other resources (AddCustomApp returns false, 'disabled').

Other switches that live elsewhere: Config.ServerNotifications.Enabled, Config.Filter.Enabled, Config.Notifications.Outside, Config.Animation.Enabled, Config.Music.AllowCustomUrl, Config.Bank.Offline, Config.Crypto.Transfer, Config.Messages.AllowDelete.

When a switch is off, its controls are also hidden in the interface, for example: Pin and FaceId hide the passcode and face sections in Settings and the setup wizard (a phone that already has a code keeps "Turn off passcode"); Flashlight and Camera hide their buttons in Control Centre and on the lock screen; Video hides the Video mode in Camera; VideoCalls hides every video call button; Voicemail hides the Voicemail tab; Battery and Coverage hide the status-bar indicators; CustomNumbers hides the custom number entry in Settings.

Keys and commands (config/funciones.lua)#

Config.Keys is linked to the older keys (Config.Command, Config.Keybind, Config.Calls.KeyAnswer, Config.Calls.KeyHangup, Config.Admin.Command); changing a value here copies it to the old one.

Key Default What it does
Command 'rarxphone' Command that opens/closes the phone. false = no command (and no key). No spaces.
Open 'F1' Default key to open the phone (each player can rebind it in FiveM Settings > Key Bindings). false = no key.
Answer 'RETURN' Answer a call.
Hangup 'BACK' Decline / hang up.
Preview 'F3' Key for the preview mode. false = no key.
AdminCommand 'telefonoadmin' Admin panel command. false = no command. Forced off when Config.Features.Admin = false.

Key names are FiveM key names (F1 to F12, M, RETURN, BACK, PAGEUP, and so on). FiveM remembers the key each player already bound, so changing the default only affects players who never changed it.

config/funciones.lua
Config.Keys = {
    Command = Config.Command,
    Open = Config.Keybind,
    Answer = Config.Calls.KeyAnswer,
    Hangup = Config.Calls.KeyHangup,
    Preview = 'F3',
    AdminCommand = Config.Admin.Command,
}

The camera keys (Config.Camera.Keys) are documented under Camera.

Branding and texts (config/marca.lua)#

Brand#

Key Default What it does
Config.Brand.Carrier Config.Carrier ('RRX MOVIL') Carrier name (Andromeda status bar and Settings > General). '' = no carrier.
Config.Brand.Models phone = 'iFruit 17', ifruitduo = 'iFruit Duo', ifruit26 = 'iFruit S26', ifruitzfold = 'iFruit Z Fold' Commercial name of each model (Settings > General > Model).
Config.Brand.System ios = 'iFruitOS 26', android = 'Andromeda 16' Operating system name (Settings > General).

Icon packs#

Config.IconPacks = { 'realist', 'white', 'black' } lists the icon packs players can choose. realist gives each app its own colours. If you remove one, it disappears from Settings and players using it switch to the first pack in the list.

New-phone defaults#

Config.Defaults applies to phones that never saved settings and to any setting the player has not changed. It never overrides what a player already chose.

Key Default Values
Wallpaper 'default' An id from Config.Wallpapers, or an https:// / nui:// URL.
LockWallpaper 'default' Same as above.
Accent 'rarx' An id from Config.Accents.
IconPack 'realist' One of Config.IconPacks.
Theme 'light' 'light', 'dark' or 'auto' (dark from 20:00 to 07:00 in-game time).
TwelveHour false true = 12-hour clock.
Ringtone 'ring1' An id from Config.Sounds.Ringtones.
Alert 'aviso1' An id from Config.Sounds.Alerts.

The default language is Config.DefaultLanguage in config/config.lua. The phone clock follows the in-game (GTA) clock; there is no separate time zone.

Overriding any text#

Config.Locale.Overrides overrides any key from locales/<language>.json. It is applied on the server before the language is sent to the client, so it changes both the interface and server-generated texts (notifications, errors).

config/marca.lua
Config.Locale.Overrides = {
    ['*'] = { ui_set_carrier = 'Carrier' },
    es = { app_dating = 'Ligoteo', err_feature_off = 'Esto no está disponible en este servidor.' },
    en = { app_dating = 'Hookup' },
}
  • '*' = all languages; the specific language is applied afterwards.
  • Look up key names in locales/es.json (or any other locale file). Keep any %s placeholders the original text has.
  • Languages not listed in Config.Languages, or values that are not strings, are ignored with a warning.

Core options (config/config.lua)#

All of these are validated on start (type and range); out-of-range values print a warning and fall back to the default.

General#

Key Default What it does
Config.Debug convar rarx_phone_debug Console debug output (set rarx_phone_debug 1).
Config.Framework 'auto' 'auto', 'qbx', 'qb' or 'esx' (also accepts qbx_core, qb-core, es_extended).
Config.EsxIdentifier nil Unused, kept for compatibility. On ESX the character is always identified by xPlayer.identifier.
Config.Notify 'rarx_notify' Notification resource used outside the phone.
Config.Currency '$' Currency symbol across the interface.
Config.DefaultLanguage 'es' Language of new phones (must be in Languages).
Config.Languages es, en, fr, de, pt, pt-BR, it, nl, pl, tr, ar Available languages (each needs locales/<code>.json).
Config.DateLocales / Config.DateLocale per language / 'es-ES' Date format per language, and the fallback.
Config.Carrier 'RRX MOVIL' Carrier name (see Config.Brand.Carrier).
Config.FineAccount 'BPOLICE' Banking account that receives fine payments.
Config.CloseOnDeath true Close the phone when the player dies.
Config.CloseWhenSwimming true Close the phone when swimming.
Config.AllowInVehicle true Allow using the phone in a vehicle.

Animation and prop#

Key Default What it does
Config.Animation.Enabled true Hand animation and phone prop.
Config.Animation.Prop `prop_amb_phone` Prop model.
Config.Animation.PropBone 28422 Bone the prop is attached to.
Config.Animation.PropOffset / PropRotation vector3(0.0, 0.0, 0.0) Prop offset and rotation.
Config.Animation.PropDistance 120.0 Distance at which other players see the phone in your hand.
Config.Animation.PropByModel {} Different prop per phone model.

Item and phone numbers#

Key Default What it does
Config.Item.Require true The player must carry the item to use the phone.
Config.Item.Unique true Each item is a different phone (stored in metadata).
Config.Item.Name 'phone' Main phone item.
Config.Item.Names phone, ifruitduo, ifruit26, ifruitzfold, rrxphone Items that count as phones (and define the model).
Config.Item.Inventory 'auto' Inventory system (rarx, ox, qb, esx).
Config.Item.MetaNumber / MetaFormatted / MetaName / MetaId rrxPhoneNumber / rrxFormattedNumber / rrxPhoneName / rrxPhoneId Metadata field names on the item.
Config.PhoneNumber.Format '({3}) {3}-{4}' Display format (digit groups). 10 digits.
Config.PhoneNumber.Length 7 (1-12) Digits after the prefix. Prefix length + Length must equal the digits in Format.
Config.PhoneNumber.Prefixes 205, 907, 480, 520, 602 Prefixes used when generating numbers.

Shop, line recovery and custom numbers#

Key Default What it does
Config.Shop.Enabled true Physical phone shop (locations are placed from the admin panel).
Config.Shop.PhonePrice 1500 Price of a phone.
Config.Shop.Ped model = 's_m_m_highsec_01', scenario = 'WORLD_HUMAN_CLIPBOARD' Shop ped.
Config.Shop.Blip sprite = 606, color = 3, scale = 0.7 Shop blip.
Config.Recovery.Enabled true Recover a lost line at the shop.
Config.Recovery.Price / Range 5000 / 3.0 Recovery price and interaction range.
Config.Numbers.Enabled true Allow custom number requests.
Config.Numbers.Price 25000 Price of a custom number.
Config.Numbers.KeepPrefix true Custom numbers keep the prefix.
Config.Numbers.Reserved list of numbers Numbers that cannot be requested.

Notifications and storage#

Key Default What it does
Config.Notifications.Outside true Show alerts while the phone is closed.
Config.Notifications.Side 'right' 'left' or 'right'.
Config.Notifications.Seconds 6 (1-120) Banner duration.
Config.Notifications.Max 3 (1-20) Banners shown at once.
Config.Notifications.AutoWake / WakeEvery true / 20 Wake the screen on alerts (minimum seconds between wakes).
Config.ServerNotifications.Enabled false Show notifications from other resources as phone notifications.
Config.ServerNotifications.Replace / Sound / Types / Cooldown true / false / nil / 1500 Options for the above.
Config.Storage.Capacity 0 Storage in MB (0 = calculated).
Config.Storage.Weights photo 2400, video 18000, memo 900, note 4, message 1 Weight per data type for the storage bar.
Config.Storage.Slack 120 MB added on top of the calculated capacity.

Calls#

Key Default Range / values
Config.Calls.RingTimeout 30 s 5-600
Config.Calls.MaxDuration 3600 s 30-86400
Config.Calls.MaxParticipants 5 2-32
Config.Calls.SpeakerRadius 3.0 m 0-100
Config.Calls.AllowVideo / AllowRecording / AllowVoiceFilter true see feature switches
Config.Calls.Voice 'auto' 'auto' detects pma-voice, saltychat, tokovoip_script or mumble-voip. Can be forced to 'pma-voice', 'saltychat', 'tokovoip', 'mumble-voip' or 'none'. See Voice.
Config.Calls.Emergency 911/112/police to police, 061/ambulance to ambulance, mechanic to mechanic Emergency aliases (number to job).
Config.Voicemail.Window / MaxSeconds 120 / 30 Voicemail window and maximum message length (seconds).
Config.Alarms.Max / RingSeconds 10 / 30 Alarms per phone and how long they ring.

Video calls and WebRTC#

Key Default Range
Config.Calls.Video.Fps 20 1-60
Config.Calls.Video.Width 540 64-1920
Config.Calls.Video.Quality 0.7 0.05-1
Config.Calls.Video.KBPorSegundo 1024 8-100000
Config.Calls.Video.MaxConcurrent 8 0-1000
Config.Calls.Video.AutoLog false
Config.WebRTC.Enabled true
Config.WebRTC.Turn 'cloudflare' TURN provider (credentials via convars).
Config.WebRTC.TurnTtl 86400 60-31536000
Config.WebRTC.IceServers Google STUN servers List of { urls = '...' }.
Config.WebRTC.Timeout 6 1-120
Config.WebRTC.MaxKbit 2500 16-100000

Config.Calls.Video.* is the frame-streaming video used as a fallback without WebRTC and for group calls. Higher values mean better image and more server bandwidth.

Ringtone heard by others (Ringer3D)#

Key Default
Enabled true
Radius / MaxVolume / Rolloff 12.0 / 0.6 / 1.6
VehicleMuffle / Hysteresis 0.45 / 2.0
Calls / Alarms / Notifications true / true / true
AlarmEvery / AlarmCooldown / AlarmRepeat 1500 / 20000 / 120000 ms
NotificationRadius / NotificationCooldown 8.0 / 5000
ServerTick / ClientTick 300 / 250 ms

Messages, mail and content#

Key Default
Config.Messages.MaxLength 1000 characters
Config.Messages.EditWindow / DeleteWindow 900 / 3600 s
Config.Messages.AllowDelete true
Config.Messages.PageSize / MaxGroupMembers 30 / 32
Config.Messages.SystemNumber '900100'
Config.Mail.Domain / MaxLength / MaxRecipients / MaxAttachments rrx.net / 4000 / 10 / 6
Config.Notes.Max / MaxLength 300 / 20000
Config.Calendar.Max 300
Config.VoiceMemos.Max 200
Config.Maps.MaxPlaces 100
Config.Contacts.ShareRange 5.0 m
Config.Filter.Enabled / Words / Mask true / {} / '***'
Config.Filter.ReservedNames names that cannot be used as usernames (admin, staff, police, and so on)

Uploads, Face Unlock and rate limits#

Key Default What it does
Config.Uploader.Resource 'rarx_uploader' Upload resource used as a fallback (see Uploads).
Config.Uploader.MaxImageChars / MaxVideoChars / MaxAudioChars 10000000 / 10000000 / 4000000 Maximum base64 characters (about 7.5 / 7.5 / 3 MB).
Config.Uploader.PerMinute 8 Uploads per minute.
Config.Uploader.TicketSeconds 120 Validity of an upload authorisation.
Config.Uploader.MaxPhotos / MaxAlbums / TrashDays 500 / 50 / 30 Gallery limits.
Config.Camera.MaxVideoSeconds 60 (5-600) Seconds per camera video. Quality drops automatically to fit MaxVideoChars.
Config.FaceId.BlockCovered true Face Unlock fails if the character wears a mask or bandana and asks for the passcode.
Config.FaceId.AllowedMasks {} Mask numbers that do not cover the face.
Config.FaceId.CoveringHelmets {} Helmets (prop 0) that do cover the face.
Config.FaceId.Fingerprint { ifruitduo = true } Models with fingerprint unlock, not affected by masks.
Config.RpcLimit.PerSecond / Burst 25 / 60 Requests per second and maximum burst per player. Above that the phone answers err_too_fast. PerSecond = 0 disables it.

Battery#

Key Default
Config.Battery.Enabled false (the admin panel can enable it)
Config.Battery.DrainSeconds / DrainSecondsIdle 55 / 100
Config.Battery.ChargePerTick / ChargeMinutes 5 / 20

Social and entertainment#

Key Default
Config.RRX.* (Lenz) Enabled true, UsernameMin 3, UsernameMax 20, MaxCaption 2200, MaxComment 500, MaxMediaPerPost 10, StoryHours 24, FeedPageSize 12, CostToVerify false
Config.RRX.Live.* Enabled true, Fps 6, Width 480, Quality 0.65, MaxConcurrent 3, MaxViewers 20, ChatLines 60
Config.Fans.* (Privé) Commission 0.20, MinPrice 0, MaxPrice 50000, MinTip 10, MaxTip 100000, PageSize 20, ImageHosts, MaxImageBytes 8 MB, CommissionAccount nil
Config.Dating.* (Flechazo) DailyLikes 20, MaxPhotos 6, VipPrice 5000, VipDays 30, VipLabel 'FLECHAZO VIP', Genders
Config.DarkChat.* Enabled true, CodeLength 6, MaxMembers 24, MaxRooms 8, InviteRadius 3.0, BurnOptions { 0, 5, 30, 60, 1440 }
Config.News.* Publishers (jobs/businesses allowed to publish), MaxPerDay 6, MaxLength 8000
Config.Ads.* Days 7, MaxPerPhone 5, Cost 0, MaxPhotos 6, MaxTags 5, TagLength 20, PageSize 24, RenewHours 24, MaxSaved 200, Categories
Config.Music.AllowCustomUrl true

Browser#

Key Default What it does
Config.Browser.Enabled true Browser app.
Config.Browser.Home '' Home page.
Config.Browser.Sites / Bookmarks {} Built-in sites and default bookmarks.
Config.Browser.CX prefilled ID Google Programmable Search Engine ID. Replace with your own.
Config.Browser.SafeSearch true Safe search.
Config.Browser.SearchEngine Google search URL Search URL prefix.
Config.Browser.BlockedDomains / BlockedWords adult sites / adult terms Blocked domains and search words.

Money, jobs and transport#

Key Default
Config.Bank.MaxTransfer / MaxDaily / MaxWeekly 500000 / 2000000 / 8000000
Config.Bank.Offline true (allow transfers to offline players)
Config.Bills.MaxAmount / Cooldown / FinesToIssuer 1000000 / 5 s / false
Config.Bills.Issuers invoice = { anyJob = true }, fine = { jobs = { 'police', 'sheriff' } }
Config.Bills.Accounts {}
Config.Crypto.* Mode 'both' (real, custom, both), Currency 'usd', Refresh 300, Fee 0.02, MaxPerTrade 500000, MinTrade 1, MaxDailyBuy/MaxDailySell 2000000, Slippage 0.03, MaxStale 1800, MaxJump 0.5, Transfer true, ApiKey ''
Config.Crypto.Coins / Names / Symbols / Colors six real coins with in-game names, symbols and colours
Config.Crypto.Custom / CustomTick one custom coin (RRX Coin) / 60 s
Config.Market.* MaxItems 6, MaxStock 50, Commission 0.05, Blocked, CommissionAccount ''
Config.BlackMarket.* Days 3, MaxPerPhone 6, MaxItems 6, MaxStock 50, Commission 0.1, DropRadius 5.0, DropMinutes 60, PickupMinutes 1440, Blocked, CommissionAccount ''
Config.Rides.* MinDistance 100, DriverCut 0.85, Timeout 5, StuckMinutes 30, CheckRadius false
Config.Rides.Taxi base 150, perKm 45, employer = { businesses = { 'taxi' } }
Config.Rides.Go base 300, perKm 90, employer false
Config.Services.* Cooldown 60 s, AlertMinutes 30, MaxMessage 300, List (police, ambulance, mechanic)
Config.AppRules.Unemployed / NoGang 'unemployed' / 'none'

Valet#

Key Default
Enabled / Price true / 0
MinDistance / Distance 70.0 / 140.0
TicketSeconds / Cooldown 60 / 120
PedModel / DrivingStyle / Speed 's_m_y_valet_01' / 786603 / 18.0
ArriveDistance / StuckSeconds / MaxSeconds / TeleportDistance 12.0 / 25 / 150 / 30.0
AllowCancel / RefundOnCancel true / false
AllowOutside / OutsideMinDistance false / 250.0
Garage resource = 'rarx_garages' with its take-out and store callbacks

Wallpapers, accents, sounds and stickers#

Key Format Notes
Config.Wallpapers { id, label, url, light? } url relative to ui/ or https://. light = true if the wallpaper is bright (dark text). Entries without id, label or url are ignored with a warning.
Config.Accents { id, label, acc = '#RRGGBB', rgb = 'r, g, b', soft?, pale?, deep? } Colours players can pick.
Config.Sounds.Ringtones { id, label, file } file in ui/sounds/.
Config.Sounds.Alerts { id, label, file } file = false = silent.
Config.Sounds.Ringback / Hangup { sound, set, loops? } Native GTA sounds when calling and hanging up.
Config.StickerPacks { slug, title, cover, stickers = { { emoji } or { url } } } Sticker packs in Messages.
Config.Music.Stations { id, name, url = 'https://...', genre?, image? } Fixed radio stations (in addition to those from the admin panel).
config/config.lua
Config.Wallpapers = {
    { id = 'default', label = 'Cloud 8', url = 'images/wallpapers/cloud8.jpg' },
    { id = 'light',   label = 'Claro',   url = 'images/wallpapers/light.svg', light = true },
    -- add your own: a path inside ui/ or an https:// URL
    { id = 'city',    label = 'City',    url = 'https://cdn.example.com/city.jpg' },
}

Admin and moderation#

Key Default What it does
Config.Admin.Command 'telefonoadmin' Admin panel command (see Config.Keys.AdminCommand).
Config.Admin.Ace 'rarxphone.admin' ACE permission for admins.
Config.Admin.Export { resource = 'rarx_admin', method = 'CheckAdmin' } Export used to check admin rights.
Config.Admin.Licenses {} Licenses always treated as admins.
Config.Moderation.BanApps rrx, birdy, fans, darkchat, dating, news, ads, blackmarket Apps affected by a phone ban.
Config.Moderation.ReadableWhileBanned {} Apps that stay readable while banned.
Config.Logs.Webhook / Name / What '' / 'RARX' / per type Legacy general logging. Leave the webhook empty and use config/logs.lua.

Database#

Key Default What it does
Config.Database.AutoInstall true Creates missing tables on start and applies pending migrations from sql/migrations/. false disables it (you must import the SQL manually; the console tells you what is missing).

The convar set rarx_phone_auto_sql 0 also disables it, and set rarx_phone_migrate 1 forces migrations even when it is false.

Integrations (config/integraciones.lua)#

Banking#

Key Default What it does
resource 'rarx_banking' Banking resource.
accounts 'GetAccountsInfoByCitizenId' Export that lists a character's accounts.
charge 'PayFromDefaultAcc' Export that charges the default account.
deposit 'ReceiveToDefaultAcc' Export that pays into the default account.

Garage#

Key Default What it does
resource 'rarx_garages' Garage resource (also used by valet).
table 'player_vehicles' Owned vehicles table.
columns owner = 'citizenid', plate, fakeplate, model = 'vehicle', label = 'vehicle_label', mods, garage, state, fuel, engine, body, depotPrice = 'depotprice' Column name for each field.
states { [0] = 'out', [1] = 'stored', [2] = 'impounded' } Value of the state column mapped to the phone state.
ByFramework.esx table = 'owned_vehicles', owner = 'owner', model = 'vehicle', garage = 'parking', state = 'stored', states = { [0] = 'out', [1] = 'stored' } Profile per framework.

If the detected framework (or the one forced in Config.Framework) has a profile and the garage still uses the Qbox/QBCore values (player_vehicles + citizenid), the profile is used. If you changed table or columns.owner, your values are respected.

Housing#

Key Default
resource 'rarx_housing'
ownedHouses / getHouse / hasKey 'getOwnedHouses' / 'getHouse' / 'hasKey'
table 'rarx_housing'
columns id, owner, name, data, positions, holders

Resource requirements#

  • ox_lib and oxmysql: required.
  • Optional (features that depend on them switch off on their own if missing): rarx_banking, rarx_garages, rarx_housing, rarx_inventory / ox_inventory, rarx_uploader, rarx_business, rarx_map (map tiles), pma-voice, qbx_vehiclekeys.

Widgets (config/widgets.lua)#

Widgets.Catalogo lists the widgets players can add. Each entry is { id, label, fuente }, where fuente = 'propio' means the phone fills it and fuente = 'fuera' means another resource fills it with SetWidgetData (hidden when Config.Features.ExternalWidgets = false).

Shipped widgets: servidor (server status), weather (clock and weather), bank, trabajo (job and shift, external), emergencias (emergency call), multas (fines and invoices), garaje (garage), negocio (business, external), facciones (factions on duty), ruta (GPS route), radio (external), anuncios (ads), battery, activity (pending items). config/extra/atajos.lua adds atajos (shortcuts) and salud (health).

lb-phone compatibility (config/compat.lua)#

rarx_phone provides lb-phone, so resources written for lb-phone keep working.

Key Default What it does
LbExports true Expose the lb-phone export names.
LbEvents true Also fire the lb-phone event names.
ResetCommand 'resetphonesecurity' Admin command /resetphonesecurity <player id>: removes PIN and face unlock from that player's phone.
VerifyCommand 'toggleverified' Admin command /toggleverified <app> <username> [1/0/2]: verifies a social account (2 = gold, Birdy only).
PasswordCommand 'changepassword' Admin command /changepassword <app> <username> <password> (set in config/extra/cuentas.lua).
EmergencyApp / EmergencyTitle / EmergencyContent 'settings' / 'Alerta de emergencia' / 'Aviso de emergencia.' Defaults for emergency alerts sent through the lb-phone API.
MailSender / MailSubject / MailMaxActions 'Sistema' / 'Aviso del sistema' / 4 Defaults for mails sent through the lb-phone API.
AppNames lb-phone app name to rarx_phone app id For example twitter to birdy, instagram to rrx, garage to vehicles.
LbChecks lb-phone check name to rarx_phone action For example postBirdy to birdy:post, buyCrypto to crypto:buy.

Set any command to '' (or false) to not register it. All three commands require phone admin rights (or the server console).

Coverage (config/cobertura.lua)#

Config.Coverage simulates cell towers. Far from towers, in tunnels or in dead spots, players can lose signal and cannot call or send messages.

Bars (0-4) are calculated on the client every Interval ms, only if the player moved more than MoveDistance metres (and at least every 5 checks even when standing still). The status bar of every model shows this value.

Calculation order:

  1. Config.Features.Coverage = false: always 4.
  2. Admin panel zones: mode on = signal only inside the zones; off = no signal inside the zones; none or no zones = no effect. If the zones say "no signal", it is 0 bars regardless.
  3. Towers: 2D distance to the nearest tower in TowerList, using Range. With Towers = false (or an empty list) it stays at 4.
  4. Client modifiers: inside an interior, subtract Interior bars; underground (not in an interior and with ground more than Underground.Depth metres above), subtract Underground.Bars.
  5. MinBars raises the result to that minimum.
  6. Hard limits that beat MinBars: BelowZ (below that height, 0 bars) and DeadSpots.
Key Default What it does
Towers true Use the towers.
TowerList 110 towers across the map List of { x, y, z } (vector3 also accepted).
Range { [4] = 250.0, [3] = 500.0, [2] = 750.0, [1] = 1500.0 } Maximum distance for each number of bars. Farther = 0.
MinBars 0 Minimum bars.
Interval / MoveDistance 3000 ms / 5.0 m How often to check and how far to move before recalculating.
Interior 0 Bars lost inside an interior.
Underground { Enabled = false, Depth = 8.0, Bars = 2 } Tunnel and underground detection.
BelowZ nil Height below which there is no signal.
DeadSpots {} Spheres { x, y, z, radius, bars }: inside, at most bars. Without z it is a cylinder.
Block calls:start, calls:invite, messages:send, messages:sendMoney, contacts:sendCard Actions the server rejects with err_no_signal at 0 bars. Emergency numbers always go through.
Debug false Draws towers and their ranges in-game (for setup only).
config/cobertura.lua
Config.Coverage = {
    Towers = true,
    MinBars = 1,       -- never fully lose signal by distance
    Interior = 1,      -- lose one bar inside interiors
    Underground = { Enabled = true, Depth = 8.0, Bars = 2 },
    DeadSpots = {
        { x = 1000.0, y = -2000.0, z = 30.0, radius = 80.0, bars = 0 },
    },
    -- ...
}

The server recalculates the bars for every blocked action using the ped position on the server (towers, zones, DeadSpots, BelowZ) and keeps the minimum of that and what the client reported (the client can only lower it: interiors and tunnels). Players without signal cannot be called (err_call_unreachable, as with airplane mode); messages sent to them are still delivered. Everything else (notes, gallery, map and other apps) works without signal.

Exports: client exports.rarx_phone:SetServiceBars(n | false) (also exports['lb-phone']:SetServiceBars) forces the displayed bars (the server still calculates its own, so forcing 4 does not allow calls in a dead zone; forcing 0 does cut them) and GetServiceBars(); server exports.rarx_phone:GetServiceBars(src).

AirShare (config/airshare.lua)#

Share with the player next to you (AirShare on iFruitOS, nearby share on Andromeda). The share button appears in Gallery (photos and videos, several at once), Notes, Voice Memos, Map (saved place, marked point or your location) and Contacts (a contact or your own card). A sheet lists nearby people (contact name if saved, otherwise their phone name) and "Share with apps" (Messages) below. The receiver gets a card to accept or decline; if their phone is closed they get an outside alert and the card appears when they open it (until it expires). Accepted items are saved in their Gallery, Notes, Voice Memos, Map places or Contacts.

Key Default What it does
Range 7.5 m Maximum distance (1-50), measured on the server.
Expire 60 s Time to accept (10-600).
Cooldown 2500 ms Minimum time between sends from the same player.
MaxPending 3 Maximum pending sends for one receiver.
MaxPhotos 10 Photos per send (1-50).
Types all true photos, note, memo, place, contact: set false to disable a type.
config/airshare.lua
Config.AirShare = {
    Range = 7.5,
    Expire = 60,
    Cooldown = 2500,
    MaxPending = 3,
    MaxPhotos = 10,
    Types = { photos = true, note = true, memo = true, place = true, contact = true },
}

Security: distance and routing bucket are checked with server coordinates; the receiver must have the phone on; content is loaded from the sender's own data by id, never from the client; URLs are re-checked against allowed hosts; a contact can only be shared if it is your number or in your contacts; if the receiver has blocked you, the send stays pending without notifying them. The receiver's limits (Config.Notes.Max, Config.VoiceMemos.Max, Config.Maps.MaxPlaces, full gallery) are respected. Pending sends live in memory and are cleared when they expire, are answered or cancelled, or either player disconnects.

Music (config/music.lua)#

Key Default What it does
Config.Music.Songs {} Songs in the Music library: { title, url = 'https://...', artist?, album?, cover?, genre?, duration?, id? }. Without id, one is generated from artist and title; if you change those, players' playlists lose the song.
Config.Music.Albums {} Optional cover and year per album: { title, artist?, cover?, year? }. Songs without cover use the album's.
Config.Music.Artists {} Optional artist photo: { name, image? }.
Config.Music.MaxPlaylists / MaxPlaylistSongs 50 / 200 Playlists per character and songs per playlist.
Config.Music.MaxSongs / MaxImport 300 / 100 Saved songs per character and songs per import.
Config.Music.AllowYoutube / Oembed true / true Allow YouTube links and fetch title/cover metadata.
Config.Music.Hosts nil Allowed audio hosts.
Config.Music.SaveCooldown / ImportCooldown 1000 / 30000 ms Rate limits.
config/music.lua
Config.Music.Songs = {
    { title = 'Night Drive', artist = 'Example Artist', album = 'Example Album',
      url = 'https://cdn.example.com/night-drive.mp3', cover = 'https://cdn.example.com/cover.jpg' },
}

Config.Music.Albums = {
    { title = 'Example Album', artist = 'Example Artist', cover = 'https://cdn.example.com/cover.jpg', year = 2026 },
}

GIFs in Messages (config/gifs.lua)#

Server-only file: the API key never reaches the client. The interface asks the server for GIFs and the server makes the HTTP request with the key.

Key Default What it does
Provider 'tenor' 'tenor' (Google API v2), 'giphy' or 'none'.
ApiKey '' API key. Prefer leaving it empty and using the convar.
ApiKeyConvar 'rarxphone_gifs_key' Convar read when ApiKey is empty.
ClientKey 'rarx_phone' Tenor client_key (only identifies the integration).
ContentFilter 'medium' 'off', 'low', 'medium', 'high' (mapped to Giphy ratings r, pg-13, pg, g).
Locale 'es_ES' Search language (Giphy uses the first two letters).
Limit 24 Results per page (4-50).
CacheSeconds / CacheMax 600 / 200 In-memory search cache (0 = no cache) and maximum cached searches.
RateLimitMs 700 Minimum wait between requests from one player.
MaxPerMinute 120 API requests per minute server-wide (cached results do not count).
Timeout 6000 Milliseconds before the request is considered failed.
Hosts Tenor and Giphy media hosts Allowed image hosts for gif messages (exact names, no wildcards).
server.cfg
set rarxphone_gifs_key "YOUR_GIF_API_KEY"
  • Without a provider or key, the GIF button does not appear in Messages.
  • The server only returns results from Hosts, and the gif message type is checked against the general media host allowlist or Config.Gifs.Hosts. The GIF host list only applies to the gif type: photos, videos or voice notes with Tenor/Giphy links are still rejected.
  • Keys: Tenor from Google Cloud Console ("Tenor API", free); Giphy from developers.giphy.com (the beta key has an hourly limit, so raise CacheSeconds).

Logs and Discord channels (config/logs.lua)#

config/logs.lua is loaded only on the server, so webhooks and keys never reach the client. It has its own validator that prints warnings the same way ([rarx_phone] config: Config.Logs...).

As shipped, nothing is sent (no webhooks). Filling Default is enough to get every log in one channel.

Options#

Key Default What it does
Enabled true Master switch for logs (does not affect Feeds).
Service 'discord' 'discord' (webhooks), 'ox_lib' (lib.logger, needs set ox:logger and its key), 'fivemanage' (FiveManage logs API) or 'none'.
Default '' General webhook, used by every category without its own.
Name / Avatar 'RARX' / '' Sender name and image (https) in Discord.
IncludeIdentifiers true Adds license, Discord (<@id>), Steam (with profile link), FiveM. The IP is never included.
IncludeContent / ContentMax true / 500 Include written text (messages, mails, posts) and truncate it (0-1800).
Dataset '' FiveManage dataset (X-Fivemanage-Dataset header).
Categories.<cat> { Enabled = true, Webhook = '' } Enable/disable each category and give it its own webhook. calls = false or calls = 'https://...' also work.
Colors.<cat> see file Embed colour per category ('#RRGGBB' or number); warning and error for logs with that level.
RateLimit Requests 5, Window 2000, QueueMax 200, Retries 3 Requests per webhook per window (ms), queue size per webhook and retries on 5xx or network errors.
Feeds see below Public feed channels.
config/logs.lua
Config.Logs.Service = 'discord'
Config.Logs.Default = 'YOUR_WEBHOOK_URL'

Config.Logs.Categories = {
    money = { Enabled = true, Webhook = 'YOUR_MONEY_WEBHOOK_URL' },
    darkchat = { Enabled = false, Webhook = '' },
    -- other categories use Default
}

Webhook selection order for a category: category convar, Categories.<cat>.Webhook, rarx_phone_logs_webhook convar, Default, legacy Config.Logs.Webhook.

Categories#

Category What is logged
calls End of each call (target, status, duration, video, hidden, emergency), voicemails (with audio link) and call recordings.
messages Every message sent (text, photo, audio, location, contact, money; with attachments) and groups created.
mail Mail accounts created and mails sent (recipients, subject, body, attachments).
social Lenz (account, post, story, comment, DM, live), Privé (post, message), Birdy (post and reply) and news published.
darkchat Aliases, rooms created/closed, joins, invites and messages (with the alias and the real player).
uploads Files uploaded (type, size, link), authorised direct uploads and photos/videos saved to Gallery.
money Transfers, money via Messages, invoices and fines issued and paid, crypto (buy, sell, send), Privé (unlocks and tips).
admin Admin panel changes, moderation, Birdy (reports, deletions, verification) and valet.
market Ads published and purchases; black market (listings, purchases, cancelled deals).
dating Profile saved, new matches, messages and VIP purchased.
services Service alerts (police, EMS, ...), Taxi/GO rides.
phones Number assigned to a new character, number requests and approvals, phones bought and lines recovered, lines reassigned by an admin.

Each Discord log is an embed with the action title, player (name and ID), character, CID, number, target, amount, action-specific fields, content in a code block, media links (the first image is shown), identifiers, category colour and time.

Discord limits and safety#

  • Requests go through a queue per webhook with a sliding window (5 every 2 s by default). Up to 10 embeds are grouped per message (max 6000 characters).
  • On 429, the retry_after from Discord is honoured and the same batch is resent first.
  • 5xx or network errors: retried with increasing delay (RateLimit.Retries times). 401/403/404 (deleted webhook): that webhook is skipped until restart and a warning is printed once.
  • If the queue fills up, the oldest logs are dropped with a warning.
  • No pings: allowed_mentions is empty and @everyone, @here and <@...> in player text are neutralised.
  • The console never prints webhook URLs or keys.

Feed channels#

Config.Logs.Feeds copies public posts to Discord as a feed:

Channel What it posts
rrx Lenz posts from non-private accounts (text, author with avatar, image).
birdy Birdy posts (not replies) from non-protected accounts. If you already use Config.Birdy.Webhook or the rarx_phone_birdy_webhook convar, leave this empty to avoid double posting.
ads Ads (title, text, price, category, phone, image).
news News (headline, text, category, author, image).

Each channel is { Enabled, Webhook, Name, Avatar, Color }. Feeds.Enabled = false turns them all off. Feeds work even if Logs.Enabled is false or Service is not discord.

Testing#

In the server console: rarxphone_logs shows the service, active categories, channels and queue state; rarxphone_logs test sends a test log to every active category and channel.

Extra modules (config/extra/)#

Every .lua file in config/extra/ is loaded automatically on both client and server.

Software update check (actualizacion.lua)#

Key Default What it does
Config.Update.Url '' URL of a JSON file { "version": "2.1.0", "date": "2026-11-20", "notes": { "es": "...", "en": "..." }, "url": "https://..." }. Empty = no check.
Config.Update.CheckMinutes 360 How often the server checks.
Config.Update.Console true Print a notice in the console.

The server checks on start and every CheckMinutes, and shows the result in Settings > General > Software Update (only admins see the download link). The installed version is the one in fxmanifest.lua.

Shortcuts and Health (atajos.lua)#

Key Default What it does
Config.Atajos.MaxAtajos / MaxAutomatizaciones / MaxAcciones 40 / 20 / 12 Shortcuts, automations, and actions per shortcut.
Config.Atajos.RadioLugar / RadioMinimo / RadioMaximo 60.0 / 20.0 / 400.0 Default, minimum and maximum radius of location triggers (m).
Config.Atajos.Cada / CadaReposo / CadaServicio 1000 / 5000 / 5000 ms Automation check intervals.
Config.Salud.Activa true Health app tracking.
Config.Salud.Cada / EnvioCada 1000 ms / 60 s Sampling and save interval.
Config.Salud.ZancadaAndando / ZancadaCorriendo 0.75 / 1.1 Stride length (m) walking and running, used to count steps.
Config.Salud.MetaPasos 6000 Daily step goal.
Config.Salud.Herido / Critico 35 / 15 Health thresholds for injured / critical.
Config.Salud.AvisoCada 120 s Minimum time between health alerts.
Config.Salud.Dias 7 Days of history.

Birdy (birdy.lua)#

Key Default
Config.Birdy.Promote Enabled true, Packages (2500 for 100 views, 6000 for 300, 15000 for 1000), MaxActivePerAccount 3, ViewCooldownMinutes 30, EveryPosts 6, AllowCompanyAccounts true, DepositTo '', BankLabel 'Birdy Ads'
Config.Birdy.DMs Enabled true, MaxLength 1000, PageSize 30, RespectPhoneBlocks true
Config.Birdy.Bells Enabled true, MaxPerAccount 200
Config.Birdy.Push post = true, dm = true

Promoted posts are inserted every EveryPosts posts in the feed.

Camera (camara.lua)#

Key Default Range
Config.Camera.WideAngle true
Config.Camera.MaxZoom 4 1-10
Config.Camera.Fov.Wide / Normal / Tele 100.0 / 70.0 / 20.0 70-130 / 20-100 / 5-70
Config.Camera.Landscape.Enabled true
Config.Camera.Landscape.PropOffset / PropRotation vector3(0.0, 0.0, 0.0) / vector3(0.0, 90.0, 0.0)
Config.Camera.Roll.Enabled / Speed / Max true / 60.0 / 45.0 1-720 / 1-180
Config.Camera.Freeze.Enabled / MaxDistance / MaxSeconds true / 10.0 / 60 1-500 / 0-3600
Config.Camera.Sensitivity / Smoothing 1.0 / 18.0 0.1-5 / 0-60
Config.Camera.MaxLookUp / MaxLookDown 70.0 / 70.0 0-89
Config.Camera.Walkable / AllowRunning true / false
Config.Camera.Vehicle.Enabled / MaxTurn / SelfieArm true / 120.0 / 0.38 0-180 / 0.15-1.5
Config.Camera.Keys.RollLeft / RollRight / Freeze / Landscape 'Z' / 'C' / 'X' / false

Car mode (coche.lua)#

Key Default What it does
Config.Car.Enabled true In-car phone screen.
Config.Car.AllowLocked true Allow it when the phone is locked.
Config.Car.DefaultMode 'ask' 'auto', 'ask' or 'never'.
Config.Car.Passenger true Also for passengers.
Config.Car.Position / Scale / OffsetX / OffsetY 'bottom' / 1.0 / 0 / 0 On-screen placement.
Config.Car.OfferSeconds 12 How long the offer prompt stays.
Config.Car.RouteEvery 4000 ms Route refresh interval.
Config.Car.RadioOff true Turn off the vehicle radio.
Config.Car.BlockedClasses { 13, 14, 15, 16, 21 } Vehicle classes where it is not offered (cycles, boats, helicopters, planes, trains).
Config.Car.QuickReplies {} Quick replies.
Config.Car.Keys Toggle 'F7', Next 'PAGEUP', Prev 'PAGEDOWN', PlayPause 'END', Screen 'INSERT' Keys.

Shared music and walkie-talkie (compartir.lua)#

Config.Compartir.Musica (play music out loud for nearby players and in vehicles):

Key Default
Enabled / Altavoz / AltavozPorDefecto true / true / false (speaker allowed / speaker on by default)
Radius / Hysteresis 15.0 (2-200) / 3.0
MaxVolume / VolumenMinimo / ZonaPlena / Rolloff 1.0 / 0.5 / 0.3 (0-0.9, full-volume share of the radius) / 1.4
VehicleMuffle / VehicleVolume / SoloDentroDelCoche 0.35 / 0.8 / false (only inside the car)
CooldownInicio / CooldownSync / InicioPorMinuto 1500 / 300 ms / 10 starts per minute
UnEmisorPorZona 30.0 (one speaker per this radius)
SoloCatalogo / Hosts false (only library songs) / nil
Coche / Cerca true / true (share in car / nearby)
ServerTick / ClientTick / SinLatidoMs 500 / 250 / 20000 ms
ZonasBloqueadas {} (zones where it is not allowed)

Config.Compartir.Walkie: Enabled true, Tecla 'J' (push-to-talk key), InvitacionSegundos 30, MaxHablaSegundos 30, MaxMinutos 0 (0 = no session limit), Volumen 0.9.

Mail and breaking news (correo.lua)#

Key Default
Config.Mail.UndoSeconds 8 (0-60)
Config.Mail.Drafts Enabled true, Max 50
Config.Mail.Schedule Enabled true, Clock 'game' ('game', 'real' or 'both'), MsPerGameMinute 2000, MinMinutes 1, MaxHours 72, MaxPending 10
Config.Mail.AttachmentTypes note, audio, location all true
Config.Mail.NoteMaxLength 4000
Config.News.Breaking Enabled true, Publishers nil, MaxPerHour 2, MaxPerHourGlobal 6, Notify true, IgnoreDoNotDisturb true, HighlightMinutes 120
Config.News.ShareToBirdy true

App accounts (cuentas.lua)#

Password-protected accounts for social apps.

Key Default
Config.Cuentas.Enabled true
Config.Cuentas.Apps rrx, birdy, mail, darkchat
Config.Cuentas.MinLength / MaxLength 4 / 64 (password length)
Config.Cuentas.MaxAttempts / LockSeconds 5 / 300
Config.Cuentas.AccountMaxAttempts 15
Config.Cuentas.MaxSessionsPerCharacter 5
Config.Cuentas.Orgs Enabled true, Apps { rrx, birdy }, MaxPerCharacter 3, MaxMembers 25 (shared organisation accounts)
Config.Compat.PasswordCommand 'changepassword'
Key Default
Config.Gallery.SharedAlbums true
Config.Gallery.SharedMaxAlbums / SharedMaxMembers 20 / 20
Config.Gallery.ImportUrl true (import images from an https:// URL)
Config.Gallery.ImportHosts nil (allowed hosts for imports)

Garage and company (garaje.lua)#

Key Default What it does
Config.Garage.RemoteLock / LockDistance / LockCooldown true / 40.0 / 1500 Lock/unlock from the phone.
Config.Garage.KeySystems qbx_vehiclekeys, rarx_garages, qb-vehiclekeys, wasabi_carlock, MrNewbVehicleKeys, Renewed-Vehiclekeys, qs-vehiclekeys, vehicles_keys, cd_garage Key resources checked, in order. onlyGrant = true means it can only grant access, never deny it.
Config.Garage.OwnerAlwaysHasKeys false Owners always count as having keys.
Config.Garage.LocateAlarm Enabled true, Seconds 10, Cooldown 15000, Radius 150.0, Horn true, Lights true Locate-vehicle alarm.
Config.Garage.Photos Enabled true, Cooldown 3000 Vehicle photos.
Config.Garage.ImpoundFee 300 Impound fee.
Config.Garage.Impound garages true, history true, police true, dataColumn 'impound_data' Impound features.
Config.Company.Enabled true Company/job management.
Config.Company.Accounts police = 'BPOLICE', ambulance = 'BEMS' Job to bank account.
Config.Company.AccountPrefix / OnlyMappedAccounts '' / true Account name for unmapped jobs is prefix + job; with OnlyMappedAccounts only mapped jobs get an account.
Config.Company.MoneyAccount / MaxAmount 'bank' / 10000000
Config.Company.HireDistance false Maximum distance to hire (false = any).
Config.Company.QuickReplies / MaxReply five Spanish replies / 200 Quick replies for company messages.

Map points of interest (mapa.lua)#

Config.MapPois.Enabled = true. Config.MapPois.Categories defines categories (police, medical, mechanic, gas, shop, food, bank, gov) as { id, icon, color, label } (label can be per language). Config.MapPois.Points lists places as { name, category, x, y, icon? }.

config/extra/mapa.lua
Config.MapPois.Points = {
    { name = 'Mission Row Police Station', category = 'police', x = 428.2, y = -981.5 },
    { name = 'International Airport', category = 'gov', x = -1037.0, y = -2737.0, icon = 'plane' },
}

Find Device, SOS, location sharing and low power (sistema2.lua)#

Key Default
Config.Sistema2.FindMy Enabled true, Tick 15, ScanEvery 60, SaveEvery 60, SaveDistance 25.0, RingSeconds 30, RingSound 'Ringtone6.mp3', RingVolume 1.0, RingRadius 25.0, RingCooldown 15, LostMessageMax 160, InventoryHooks true, PinAttempts 5, PinWait 120
Config.Sistema2.Sos Enabled true, Number '911', Services { 'police', 'ambulance' }, LiveMinutes 10, LiveEvery 5, Cooldown 60
Config.Sistema2.Live Enabled true, Every 5, TomorrowHour 8, MaxActive 5, MaxTargets 32 (live location sharing)
Config.Sistema2.Battery LowPowerFactor 1.6, Warnings { 20, 10 } (low battery warnings at these percentages)

Social extras (social.lua)#

Key Default
Config.RRX.Live.CoHost / InviteSeconds true / 60
Config.RRX.Stories CloseFriends true, MaxCloseFriends 150, Highlights true, MaxHighlights 12, MaxHighlightItems 40
Config.Dating.Rewind Enabled true, VipOnly true, PerDay 0
Config.Dating.SuperLike Enabled true, VipOnly true, PerDay 3
Config.DarkChat.RoomPasswords true
Config.DarkChat.AutoRooms {}

Voice (tecnico.lua)#

System Calls Speaker Voice filters and muting nearby players
pma-voice server setPlayerCall yes, adds nearby players to the channel yes (Mumble submix)
mumble-voip client addPlayerToCall / removePlayerFromCall no yes (Mumble submix)
saltychat server AddPlayerToCall / RemovePlayerFromCall yes, SetPhoneSpeaker no
tokovoip_script client addPlayerToRadio / removePlayerFromRadio no no
config/extra/tecnico.lua
-- Change these only if your voice resource uses a different name
Config.Calls.VoiceResources = {
    pma = 'pma-voice',
    mumble = 'mumble-voip',
    salty = 'saltychat',
    toko = 'tokovoip_script',
}

The phone's call volume setting only applies with pma-voice. The console command rarxphone_voz <id> prints the detected system.

Uploads (tecnico.lua)#

Config.Uploader.Method How it uploads Key
'fivemanage' (default) The interface asks the server for a signed URL and uploads directly to FiveManage; on failure the server uploads via Config.Uploader.Resource (if started) or directly to FiveManage. convar rarx_phone_fivemanage_key (or rarx_uploader_key, fivemanage:key)
'resource' Always through the server, with the UploadMedia export of Config.Uploader.Resource. that resource's key
'custom' Always through the server (proxy): the client sends the file to the server, which POSTs it to Config.Uploader.Custom.Url. in a convar, never in the file

Config.Uploader.Custom:

Field Default What it is
Url '' https://... endpoint that receives the POST.
Field / Fields 'file' / nil File field name. Fields = { image = 'image', video = 'video', audio = 'audio' } changes it per type.
Body 'multipart' 'multipart' (binary form-data) or 'base64json' (JSON { [Field] = base64, filename, mime }).
Headers { Authorization = 'convar:rarx_phone_upload_key' } Headers. A 'convar:NAME' value is read on the server with GetConvar.
ResponsePath 'url' Path to the URL in the JSON response: 'data.url', 'files[0].link', and so on.
Extra nil Extra text fields added to the body.
Timeout 45 Seconds.
MediaHosts {} Hosts added to the media allowlist (the Url host is added automatically).
config/extra/tecnico.lua
Config.Uploader.Method = 'custom'
Config.Uploader.Custom = {
    Url = 'https://upload.example.com/api/upload',
    Field = 'file',
    Body = 'multipart',
    Headers = {
        -- never put the key in plain text: config files are downloaded by every client
        Authorization = 'convar:rarx_phone_upload_key',
    },
    ResponsePath = 'data.url',
    Timeout = 45,
    MediaHosts = {},
}

Service numbers and transfer (tecnico.lua)#

Config.ServiceNumbers = { Enabled = true, Speech = true, AnswerDelay = 1200, MaxDuration = 600 }. Config.Transfer.Enabled = true enables Settings > General > "Transfer to another phone".

Utilities (utilidades.lua)#

Key Default
Config.Browser.MaxTabs / HistoryMax 8 / 200
Config.WorldClock.Enabled true
Config.WorldClock.Base 'America/Los_Angeles' (base time zone for the world clock)
Config.WorldClock.Cities New York, London, Madrid, Tokyo, Sydney ({ name, zone }, name can be per language)
Config.StoreInfo.Developer 'iFruit Inc.'
Config.StoreInfo.Apps age ratings and developer per app (darkchat/blackmarket 18+, fans 18+, dating/crypto 17+)

Convars#

Set these in server.cfg with set (never setr, so they stay on the server). Convars take priority over the config files.

Convar What it does
rarx_phone_debug 1 = debug output in the console.
rarx_phone_auto_sql 0 = disable automatic database install.
rarx_phone_migrate 1 = force migrations even with AutoInstall = false.
rarx_phone_preview 1 = enable preview mode.
rarx_phone_fivemanage_key FiveManage key for uploads (falls back to rarx_uploader_key, then fivemanage:key).
rarx_phone_upload_key Key for custom uploads (read through convar: headers).
rarx_phone_turn_token_id / rarx_phone_turn_api_token Cloudflare TURN credentials for WebRTC.
rarxphone_gifs_key GIF provider API key.
rarx_phone_logs_webhook General log webhook (like Config.Logs.Default).
rarx_phone_logs_webhook_<category> Webhook for one category, for example rarx_phone_logs_webhook_money.
rarx_phone_feed_<channel> Webhook for a feed channel, for example rarx_phone_feed_birdy.
rarx_phone_fivemanage_logs_key FiveManage key for logs (falls back to fivemanage:key). Never printed.
rarx_phone_birdy_webhook Birdy webhook.
server.cfg
set rarx_phone_fivemanage_key "YOUR_FIVEMANAGE_KEY"
set rarx_phone_logs_webhook "YOUR_WEBHOOK_URL"
set rarx_phone_turn_token_id "YOUR_TURN_TOKEN_ID"
set rarx_phone_turn_api_token "YOUR_TURN_API_TOKEN"
set rarxphone_gifs_key "YOUR_GIF_API_KEY"

Languages#

Translations live in locales/<code>.json. Shipped languages: es, en, fr, de, pt, pt-BR, it, nl, pl, tr, ar.

  • Config.Languages lists which languages players can pick; each needs its JSON file.
  • Config.DefaultLanguage must be one of them (otherwise the first in the list is used).
  • Config.DateLocales sets the date format per language.
  • To change individual texts without editing the JSON files, use Config.Locale.Overrides.

Validated values reference#

Values checked on start. Anything missing or invalid falls back to the default shown.

Key Type Default Allowed
Config.Ads.Cost number 0 0 - 1e12
Config.Ads.Days number 7 0.01 - 3650
Config.Ads.MaxPerPhone integer 5 1 - 10000
Config.Ads.MaxPhotos integer 6 1 - 20
Config.Ads.MaxTags / TagLength integer 5 / 20 0 - 20 / 2 - 40
Config.Ads.PageSize integer 24 6 - 60
Config.Ads.RenewHours / MaxSaved number / integer 24 / 200 0 - 8760 / 1 - 10000
Config.Alarms.Max integer 10 1 - 1000
Config.Alarms.RingSeconds number 30 1 - 3600
Config.Bank.MaxTransfer / MaxDaily / MaxWeekly number 500000 / 2000000 / 8000000 0 - 1e15
Config.Battery.DrainSeconds / DrainSecondsIdle number 55 / 100 1 - 86400
Config.Battery.ChargePerTick / ChargeMinutes number 5 / 20 1 - 100 / 1 - 1440
Config.Bills.MaxAmount / Cooldown number 1000000 / 5 0 - 1e15 / 0 - 86400
Config.BlackMarket.Days number 3 0.01 - 3650
Config.BlackMarket.MaxPerPhone / MaxItems / MaxStock integer 6 / 6 / 50 1 - 1000 / 1 - 100 / 1 - 1000000
Config.BlackMarket.Commission number 0.1 0 - 1
Config.BlackMarket.DropRadius / DropMinutes / PickupMinutes number 5.0 / 60 / 1440 0 - 1000 / 0 - 525600 / 0 - 525600
Config.Calendar.Max integer 300 1 - 100000
Config.Calls.RingTimeout / MaxDuration number 30 / 3600 5 - 600 / 30 - 86400
Config.Calls.MaxParticipants integer 5 2 - 32
Config.Calls.SpeakerRadius number 3.0 0 - 100
Config.Calls.Video.Fps / Width / Quality number 20 / 540 / 0.7 1 - 60 / 64 - 1920 / 0.05 - 1
Config.Calls.Video.KBPorSegundo / MaxConcurrent number 1024 / 8 8 - 100000 / 0 - 1000
Config.Calls.Voice text 'auto' auto, pma-voice, pma, mumble-voip, mumble, saltychat, salty, tokovoip, tokovoip_script, toko, none
Config.Camera.MaxVideoSeconds integer 60 5 - 600
Config.Contacts.ShareRange number 5.0 0 - 1000
Config.Crypto.Mode text 'both' real, custom, both
Config.Crypto.Refresh / CustomTick number 300 / 60 10 - 86400 / 1 - 86400
Config.Crypto.Fee / Slippage number 0.02 / 0.03 0 - 1
Config.Crypto.MaxPerTrade / MinTrade number 500000 / 1 0 - 1e15
Config.Crypto.MaxDailyBuy / MaxDailySell number 2000000 0 - 1e15
Config.Crypto.MaxStale / MaxJump number 1800 / 0.5 10 - 31536000 / 0 - 100
Config.DarkChat.CodeLength / MaxMembers / MaxRooms integer 6 / 24 / 8 3 - 32 / 2 - 1000 / 1 - 1000
Config.DarkChat.InviteRadius number 3.0 0 - 100
Config.Dating.DailyLikes / MaxPhotos integer 20 / 6 0 - 100000 / 1 - 50
Config.Dating.VipPrice / VipDays number 5000 / 30 0 - 1e12 / 1 - 3650
Config.Fans.Commission number 0.2 0 - 1
Config.Fans.MinPrice / MaxPrice number 0 / 50000 0 - 1e12
Config.Fans.MinTip / MaxTip number 10 / 100000 0 - 1e12
Config.Fans.PageSize / MaxImageBytes integer 20 / 8388608 1 - 500 / 1024 - 1e10
Config.Framework text 'auto' auto, qbx, qbx_core, qb, qb-core, esx, es_extended
Config.Gallery.SharedMaxAlbums / SharedMaxMembers integer 20 / 20 0 - 1000 / 1 - 200
Config.Garage.LockDistance / LockCooldown / ImpoundFee number 40.0 / 1500 / 300 1 - 10000 / 0 - 600000 / 0 - 1e12
Config.Mail.MaxLength / MaxRecipients / MaxAttachments integer 4000 / 10 / 6 1 - 1000000 / 1 - 1000 / 0 - 100
Config.Mail.UndoSeconds / NoteMaxLength / Drafts.Max integer 8 / 4000 / 50 0 - 60 / 100 - 100000 / 1 - 10000
Config.Maps.MaxPlaces integer 100 1 - 100000
Config.Market.MaxItems / MaxStock integer 6 / 50 1 - 100 / 1 - 1000000
Config.Market.Commission number 0.05 0 - 1
Config.Messages.MaxLength / PageSize / MaxGroupMembers integer 1000 / 30 / 32 1 - 100000 / 5 - 500 / 2 - 1000
Config.Messages.EditWindow / DeleteWindow number 900 / 3600 0 - 31536000
Config.Music.MaxPlaylists / MaxPlaylistSongs integer 50 / 200 1 - 1000 / 1 - 5000
Config.Music.MaxSongs / MaxImport integer 300 / 100 0 - 5000 / 1 - 200
Config.News.MaxPerDay / MaxLength integer 6 / 8000 0 - 100000 / 1 - 10000000
Config.Notes.Max / MaxLength integer 300 / 20000 1 - 100000 / 1 - 10000000
Config.Notifications.Seconds / Max / WakeEvery number 6 / 3 / 20 1 - 120 / 1 - 20 / 0 - 86400
Config.Notifications.Side text 'right' left, right
Config.Numbers.Price / Recovery.Price / Shop.PhonePrice number 25000 / 5000 / 1500 0 - 1e12
Config.PhoneNumber.Length integer 7 1 - 12
Config.Recovery.Range number 3.0 0.1 - 100
Config.Rides.MinDistance / DriverCut number 100 / 0.85 0 - 100000 / 0 - 1
Config.Rides.Timeout / StuckMinutes number 5 / 30 0 - 1440 / 1 - 10080
Config.RpcLimit.PerSecond / Burst number 25 / 60 0 - 1000 / 1 - 10000
Config.RRX.UsernameMin / UsernameMax integer 3 / 20 1 - 64
Config.RRX.MaxCaption / MaxComment / MaxMediaPerPost integer 2200 / 500 / 10 1 - 100000 / 1 - 100000 / 1 - 50
Config.RRX.StoryHours / FeedPageSize number 24 / 12 1 - 8760 / 1 - 200
Config.RRX.Live.Fps / Width / Quality number 6 / 480 / 0.65 1 - 60 / 64 - 1920 / 0.05 - 1
Config.RRX.Live.MaxConcurrent / MaxViewers / ChatLines integer 3 / 20 / 60 0 - 1000 / 1 - 10000 / 1 - 1000
Config.Ringer3D.Radius / MaxVolume / Rolloff number 12.0 / 0.6 / 1.6 0 - 200 / 0 - 1 / 0.01 - 10
Config.Ringer3D.ServerTick / ClientTick number 300 / 250 50 - 10000
Config.ServerNotifications.Cooldown number 1500 0 - 3600000
Config.Services.Cooldown / AlertMinutes / MaxMessage number 60 / 30 / 300 0 - 86400 / 1 - 10080 / 1 - 100000
Config.Storage.Capacity / Slack number 0 / 120 0 - 1000000
Config.Uploader.MaxImageChars / MaxVideoChars / MaxAudioChars integer 10000000 / 10000000 / 4000000 1000 - 1000000000
Config.Uploader.PerMinute / MaxPhotos / MaxAlbums integer 8 / 500 / 50 1 - 1000 / 1 - 1000000 / 1 - 10000
Config.Uploader.TicketSeconds / TrashDays number 120 / 30 5 - 86400 / 0 - 3650
Config.Valet.Price / Distance / TicketSeconds number 0 / 140.0 / 60 0 - 1e12 / 0 - 100000 / 1 - 86400
Config.VoiceMemos.Max integer 200 1 - 100000
Config.Voicemail.Window / MaxSeconds number 120 / 30 0 - 86400 / 1 - 600
Config.WebRTC.TurnTtl / Timeout / MaxKbit number 86400 / 6 / 2500 60 - 31536000 / 1 - 120 / 16 - 100000

Lists that must not be empty: Config.Item.Names, Config.PhoneNumber.Prefixes, Config.Languages. The validator also warns when a prefix length plus Config.PhoneNumber.Length does not match the digits in Config.PhoneNumber.Format, when UsernameMin is greater than UsernameMax, and when a Privé minimum is greater than its maximum.