# Configuration

Everything is in `config/config.lua`, with a comment on each option. Secrets (the upload token and log webhook) go in `config/keys.lua`, which only the server reads. Framework, inventory, bank, voice and housing differences live in `config/bridge/`, one file each.

## The options most servers touch

| Option | What it does |
|---|---|
| `locale` | Language file from `config/locales/` |
| `framework` | `auto` detects Qbox, QBCore, ESX, ox_core or ND_Core and falls back to standalone |
| `autoInstallApps` | Whether community apps may install themselves on every phone, or always go through the App Store first (the default) |
| `bank` | Which bank script holds company money. `auto` finds it |
| `keybind`, `command`, `walk`, `cursorKey` | How the phone opens, and whether players can move with it out |
| `item` | The phone item: which inventory, whether it's required, whether each item is its own phone |
| `numbers` | Prefixes and length of phone numbers |
| `calls` | Ring time and voice script |
| `rtc` | STUN/TURN servers for video calls and live streams. Add a TURN server if video fails for players behind strict routers |
| `map` | Leave it alone: San Andreas ships with the phone. On a server with its own map, `image` is a URL to one picture and `bounds` are the game coordinates of its edges |
| `places` | Places listed in Maps |
| `companies` | Jobs players can call or message from Services |
| `garage` | Valet and impound fees, and whether impounded vehicles can be released from the phone |
| `housing` | Which housing script is behind Home. `auto` finds it |
| `transfer` | Bringing data across from an old phone. `none` switches it off |
| `music` | Songs for Music (direct links to audio files). The app is hidden while the list is empty |
| `crypto` | Made-up coins bought with bank money |
| `mailDomain` | The part after `@` in Mail addresses |
| `licence` | The heading on the licence card in Wallet. Empty uses the language file's text |
| `debug` | Prints every request to the server console |

## Language

English (`en`, the default) and French (`fr`) ship. To add one:

1. Copy `config/locales/en.json` to `config/locales/<code>.json`, e.g. `de.json`. `"ui"` is the interface, `"server"` is messages from Lua.
2. Set `meta.name` to the language's own name and `meta.intl` to its locale code (e.g. `de-DE`). Dates and numbers follow it.
3. Translate the values, never the keys. Keep `{name}`, `{amount}` and `%s` as they are; where a line has several `%s`, they stay in the same order.

Missing strings fall back to English, so a half-done translation still works.

## Theme

`web/dist/theme.json` can be edited on a live server without rebuilding. Anything in it is laid over the built-in look; leave a key out to keep the default.

| Key | What it controls |
|---|---|
| `font` | CSS font stack: a system font or the bundled Inter |
| `iconRadius` | Icon corner radius as a fraction of size: `0.225` a rounded square, `0.5` a circle |
| `island` | `"pill"`, or `"hole"` (a punch hole that widens only for calls, recording and music) |
| `frames` | Frame colours offered in Settings: `{ "id": "#hex" }` |
| `wallpapers` | Wallpapers offered in Settings: `{ "id": "<any CSS background-image>" }` |
| `colors.light`, `colors.dark` | Colour token overrides, e.g. `{ "--blue": "#0b8a7a" }` |
| `apps` | Per-app `name`, `bg`, `fg` and `icon` (an image URL), keyed by app id |
| `defaults` | `dark`, `wallpaper`, `lockWallpaper`, `frame`, `apps`, `dock` for a fresh phone |

`themes/slate.json` is a second look made with nothing but this file. Copy it over `theme.json` to use it.

## Sounds

The ringtones, text tones and effects are in `web/dist/sounds/`. To replace one, put an `.mp3` with the same name there. Players pick ringtones and set volume, Silent Mode and Do Not Disturb in Settings; only the player holding the phone hears it.
