Eureka Phone: Duo
Server settings
Every setting is a server convar. The ones you will actually touch, grouped by what they change, plus the page's client settings and staff moderation.
The core reads its settings from convars at start. An invalid value prints one CONFIG_INVALID line per problem followed by DISABLED, and the phone registers nothing until it is fixed and the resource restarted. The full table, with every value range, is in the archive's docs/runbooks/configuration.md; this page lists what most servers change.
Set every value with set. setr lets clients read it and sets publishes it in the server list. Secrets (database passwords, object store keys) belong only in set convars in an untracked server.cfg, never in config/shared.lua or any client.lua, which clients download.
Required
| Convar | Values | Notes |
|---|---|---|
duo_framework |
qbox, qbcore, esx, standalone |
Where character identity comes from. No default. |
duo_inventory |
ox_inventory |
How phone possession is proven. Define phone items with stack = false. |
mysql_connection_string |
oxmysql URL | The runtime account from Installation. |
Phone, numbers and limits
| Convar | Default | Notes |
|---|---|---|
duo_phone_items |
phone |
Inventory items that count as a phone. List the item of every installed page: the Duo's is phone; with the iPhone-style page too, "phone,iphone". |
duo_line_slots |
2 |
SIM slots per phone (1 to 8). |
duo_number_prefix |
unset | Every new number starts with it, for example 555. |
duo_number_length |
7 |
Total digits, prefix included. Existing numbers never change. |
duo_reserved_numbers |
unset | Numbers never given to players, such as your service numbers. |
duo_max_contacts |
200 |
Contacts one character may keep. |
duo_rate_limit_per_minute |
20 |
Requests per player per minute, per action. |
duo_adapter_verification |
required |
warn lets an unverified framework or inventory version run with a warning. Staging only. |
Calls and voice
| Convar | Default | Notes |
|---|---|---|
duo_voice |
pma |
none turns calls off. Messaging never depends on voice. |
duo_voice_resource |
pma-voice |
Set it if pma-voice runs under another folder name. |
duo_call_ring_seconds |
30 |
How long a call rings before it is missed. |
duo_call_reconnect_seconds |
30 |
How long a disconnected participant may rejoin; 0 ends their part at once. |
duo_call_channel_min / duo_call_channel_max |
1000000 / 1999999 |
The pma-voice channel range calls use. |
Media (photos, attachments, AirDrop files)
Off by default. Turning it on needs an S3-compatible bucket; keep the bucket private, reads use signed URLs.
set duo_media_provider "s3"
set duo_media_s3_endpoint "https://<account>.r2.cloudflarestorage.com"
set duo_media_s3_region "auto" # us-east-1 on AWS
set duo_media_s3_bucket "eureka-duo-media"
set duo_media_s3_access_key "<access key ID>"
set duo_media_s3_secret_key "<secret access key>"
set duo_media_s3_path_style "true" # false puts the bucket in the host nameAdd a CORS rule on the bucket for the origin https://cfx-nui-eureka_duo (and https://cfx-nui-<resource> for every other phone page you run) allowing GET and PUT with the headers Content-Type and x-amz-checksum-sha256. Storage per character is duo_media_quota_bytes (256 MiB by default); the largest image is duo_media_image_max_bytes (8 MiB).
Apps
| Convar | Default | Notes |
|---|---|---|
duo_apps |
all optional apps except DarkChat, rides and location | Comma-separated app IDs, or none. The system apps (phone, messages, contacts, settings) are always on. See Apps and what they need. |
duo_app_items |
unset | Apps gated by an inventory item, as app:item, for example darkchat:burner_laptop. |
duo_mail_domain |
duo.mail |
The domain of in-game mail addresses. |
duo_wallet, duo_crypto, duo_billing |
off |
Each needs a money adapter verified on your framework; otherwise the app shows itself unavailable. |
duo_garage, duo_keys, duo_housing, duo_valet |
unset / off |
Name the installed resource (qb_garages, qbx_vehicles, qb_vehiclekeys, qb_houses, qbx_properties). Each adapter runs only on a version a live test verified. |
duo_emergency_location, duo_crews_pings |
off |
Live positions in 911 reports and crew pings. Need OneSync. |
duo_onboarding |
true |
Setup on a phone with a new holder: language, passcode, Face Pass, Eureka ID. |
duo_languages |
en |
Languages the setup offers, for example en,fr. |
duo_airdrop |
true |
Needs OneSync; files also need media. |
Services directory, 911 and job listings
Three server-only files in eureka_phone/config/ ship empty and are validated at start:
services.lua:Duo.ServiceDirectory, the official businesses in the services app ({ id, name, category, number?, jobs?, requests? }). Players advertise their own in the Yellow Pages.emergency.lua:Duo.EmergencyServices, the services a 911 report can go to ({ id, label, jobs }), answered by on-duty holders of those jobs.jobs.lua:Duo.JobListings, the job center's listings ({ id, job, title, description?, open? }). Accepting an application hires nobody; hire in game through your job resource.
The Duo page settings
The file is eureka_duo/config/client.lua. Downloaded by every client, so it holds no secret and grants nothing; the server checks every request again.
| Setting | Default | Notes |
|---|---|---|
models |
{ 'phone' } |
The phone items this page shows. Must also be in duo_phone_items. |
keys.fold |
F2, "Phone: fold or unfold" |
The Duo's own key. Players rebind it in the game's key bindings; a saved binding wins. |
timeouts |
open 13 s, sync 10 s, default 6 s | How long the bridge waits for the server. Keep each below the page's own timeouts. |
maxPending |
32 |
Requests in flight per player. |
maxPayloadBytes |
262144 |
Largest request. Keep it above twice duo_notes_max_bytes and duo_mail_max_bytes. |
keepInput |
false |
true keeps game input while the phone is open, except while typing. |
The key that opens the phone belongs to the core: phoneKey in eureka_phone/config/client.lua (F1, "Phone: open or close"). A change there needs restart eureka_phone, then ensure eureka_duo.
Staff moderation: duo_mod
One restricted server command moderates the social apps, listings, dating, DarkChat, crews, 911 and news. Grant it to a staff group by ACE; there is no network event, export or phone screen for it.
add_ace group.admin command.duo_mod allowThe console and RCON can always run it. The archive's docs/runbooks/configuration.md lists every subcommand.
Last updated October 2, 2026