> For the complete documentation index, see [llms.txt](https://mango-5m.gitbook.io/mango5m-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mango-5m.gitbook.io/mango5m-docs/resources/mango-radio/configuration/controls-and-keybinds.md).

# Controls and Keybinds

Keys, the tap-versus-hold threshold, and how the mouse skim feels.

## Keys

```lua
Config.Keybind = 'Q'                      -- carousel: tap to skip, hold to browse
Config.RadioMenu.key = 'G'                -- station browser: press to open, again to close
Config.MediaPlayer.skip.key = 'PAGEUP'    -- skip the track on the server station
```

All three are registered through FiveM's key mapping, so every player can rebind them under **Settings → Key Bindings → FiveM** without touching your config.

{% hint style="warning" %}
FiveM caches the first default a player receives. Changing these values later only affects brand-new players — existing ones keep their cached binding until they rebind.
{% endhint %}

## Tap versus hold

```lua
Config.HoldTime  = 250   -- ms before a press counts as "hold"
Config.TapCooldown = 250 -- ms minimum between taps
```

A press shorter than `HoldTime` is a **tap** and skips one station. Anything longer opens the carousel for browsing. `TapCooldown` stops a mashed key from flying through five stations at once.

## How long the flash stays

```lua
Config.TapDisplayTime = 1600          -- after a tap
Config.TrackChangeDisplayTime = 3000  -- when the song changes by itself
```

The second one is the "now playing" flash: when the station you are already on moves to a new song, the carousel appears briefly to tell you what it is. Set it to `0` to disable that entirely.

## Who can change the station

```lua
Config.DriverOnly = false          -- carousel
Config.RadioMenu.onlyDriver = false -- station browser
```

Both default to off, matching single-player behaviour where any occupant can change the station. Set either to `true` to lock it to the driver.

## Skipping the server station

```lua
Config.MediaPlayer.skip = {
    enabled         = true,
    key             = 'PAGEUP',
    cooldown        = 0,
    resyncOnReenter = true,
}
```

This key only does anything while you are tuned to the [Media Player](/mango5m-docs/resources/mango-radio/media-player.md) station, in a vehicle, with the engine running. It is deliberately live while the station browser is open as well, so you can skip without closing the panel.

The skip is **local**, exactly like vanilla self radio: it moves that player onto their own run through the playlist and leaves everyone else on the broadcast.

| Setting           | Default  | Does                                                    |
| ----------------- | -------- | ------------------------------------------------------- |
| `enabled`         | true     | Turns skipping on or off entirely                       |
| `key`             | `PAGEUP` | The default binding — players can rebind it             |
| `cooldown`        | 0        | Seconds before the same player can skip again, 0 = none |
| `resyncOnReenter` | true     | Getting back in a vehicle rejoins the broadcast         |

`resyncOnReenter` is what stops a server drifting apart over a session. On `true`, a player who has skipped is put back on the scheduled station the next time they get into a vehicle, so everyone lines up again on their own. Set it to `false` and they keep their own track between vehicles until they tune away and back.

Why the skip is local, and what happens to their track when they leave the car, is covered in [How It Works](/mango5m-docs/resources/mango-radio/media-player/how-it-works.md).

## The mouse skim

```lua
Config.Mouse = {
    Sensitivity = 130,   -- pixels of travel per station
    Reverse     = false, -- flip the skim direction
    EdgeScroll  = true,  -- keep scrolling at the screen edge
    EdgeSpeed   = 6.0,   -- stations per second at full deflection
    EdgeZone    = 0.12,  -- fraction of screen width that counts as "edge"
}
```

`Sensitivity` is how far the mouse travels to move one station — **lower is more sensitive**.

`EdgeScroll` solves a real problem with long station lists: the skim is based on cursor position, so without it you physically run out of screen before you run out of stations. With it on, parking the cursor in the outer 12% keeps scrolling at up to six stations a second, and moving back inward picks up smoothly from there.

## In the station browser

With `keyboardNav = true` (the default) the browser has **no cursor at all** and is driven by:

| Key     | Does                                              |
| ------- | ------------------------------------------------- |
| `↑` `↓` | Move the highlight — hold to scroll, accelerating |
| `↵`     | Tune to the highlighted station                   |
| `Q` `E` | Previous / next station (arrows work too)         |
| `TAB`   | All Stations → Favourites → power button          |
| `SPACE` | Pause / resume                                    |
| `F`     | Favourite the highlighted station                 |

Holding `↑` or `↓` repeats, ramping from about seven steps a second up to twenty-two, so long lists are quick to cross.

{% hint style="info" %}
`Config.RadioMenu.showTransportKeys = true` prints the `Q` / `SPACE` / `E` chips under the transport buttons. It is off by default to keep that row clean, since the footer legend already covers the important ones.
{% endhint %}
