> For the complete documentation index, see [llms.txt](https://docs.gkshop.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.gkshop.org/tablet/configuration/apps.md).

# Apps

### Renaming apps

Use `labelLangs` for per-language names:

```json
"labelLangs": {
  "en": "Police MDT",
  "tr": "Polis MDT"
}
```

Fallback: `name` field if a locale is missing.

***

### Removing / hiding apps

| Goal                           | How                                                                        |
| ------------------------------ | -------------------------------------------------------------------------- |
| **Remove completely**          | Delete the app object from the `apps` array                                |
| **Don't pre-install on setup** | `"isDefault": false`                                                       |
| **Hide from App Store**        | `"isRemovable": false` (system app — not listed in store)                  |
| **Prevent uninstall**          | `"isRemovable": false`                                                     |
| **Hide without GKSPHONE**      | Automatic — apps with `"requiresPhone": true` are hidden when phone is off |
| **Job-only apps**              | `"requiredJob": ["police", "lspd"]` — only visible for matching jobs       |

**App Store rule:** Only apps with `isRemovable: true` appear in the App Store.

***

### Default dock (bottom bar)

Set up to **4 apps** in the dock:

```json
"dock": {
  "maxApps": 4,
  "defaultApps": ["camera", "settings", "appstore", "gallery"]
}
```

Use app `id` values, not display names.

***

### Change icons

1. Replace the PNG in `gks-tablet/html/public/img/icons/`
2. Or update the `icon` path in `config.json`:

```json
"icon": "/img/icons/settings.png"
```

Use `.png`, keep the same filename or update the path to match.

***

### Key properties

| Property        | Description                                   |
| --------------- | --------------------------------------------- |
| `id`            | Unique app ID (used in dock, install, routes) |
| `name`          | Default display name                          |
| `labelLangs`    | Localized names                               |
| `description`   | App Store description                         |
| `icon`          | Icon path                                     |
| `color`         | App icon gradient                             |
| `route`         | App route path                                |
| `isDefault`     | `true` = pre-installed on first setup         |
| `isRemovable`   | `true` = shows in App Store, can uninstall    |
| `requiresPhone` | `true` = requires GKSPHONE running            |
| `requiredJob`   | Job array — MDT apps, police/EMS only         |

***

### Example

```json
{
  "id": "gps",
  "name": "GPS",
  "labelLangs": { "en": "GPS", "tr": "GPS" },
  "description": "Navigate and find locations",
  "icon": "/img/icons/gps.png",
  "color": "linear-gradient(135deg, #11998e 0%, #38ef7d 100%)",
  "route": "/gps",
  "isDefault": false,
  "isRemovable": true
}
```

Hide GPS from new players: set `"isDefault": false` and don't install it. Remove from server entirely: delete this block from `apps`.

***

### MDT job lists

Police/EMS job names must match `config/config.lua`:

```lua
Config.Jobs = {
    Police = { 'police', 'lspd', 'bcso', ... },
    Ambulance = { 'ambulance', 'ems', 'hospital', ... }
}
```

`requiredJob` in `config.json` should use lowercase job names from these lists.

***
