The in-game radio
Press F6 to open the radio, B to transmit. Both are the shipped defaults and both are rebindable by each player in FiveM → Settings → Key Bindings → FiveM, or server-wide in Admin Panel → Settings → Controls.
On-radio buttons
The radio is a four-page device driven by the three soft buttons under the display. What each button does depends on the page.
| Page | Buttons | What they do |
|---|---|---|
| Main | ZN · CH · ST | Open the zone list, the channel list, or the settings menu |
| Zones | SEL | Select the previewed zone |
| Channels | CON · DSC · SCN | Connect, disconnect, or add the previewed channel to your scan list |
| Settings | varies | TGL toggles, UP/DWN adjust, <-/-> cycle choices |
On the Channels page the third button changes with context:
SCNnormally — toggle scanning on the previewed channelSGNon the channel you are connected to, if you are a supervisor — fire the first configured alertCT/TKon a connected trunked channel, if you are a supervisor — switch between the control frequency and a trunked sub-frequency
Supervisor means the tlib.admin ACE or a codeplug with Supervisor Access enabled.
The connected channel shows [CON] after its name; a scanned one shows [SCN]. During a transmission the display shows TX: for your own, RX: for another unit on your channel, and SC: for one on a scanned channel, followed by the caller's callsign, name, and agency.
The ST settings menu
ST on the main page cycles through per-player settings on the radio itself. Options appear only when relevant.
| Option | Buttons | Notes |
|---|---|---|
| GPS | TGL | Your blip's visibility. Hidden if the codeplug disables GPS |
| Earbuds | TGL | Only shown when 3D audio is enabled server-side |
| VC Vol | DWN / UP | Voice volume |
| SFX Vol | DWN / UP | Tone volume |
| 3D Vol | DWN / UP | Only shown when 3D audio is enabled |
| Style | <- / -> | Radio model, from your codeplug's allowed models |
| DISP | <- / -> | Auto, Light, or Dark |
| Move | CHG / RST | Reposition the radio, or reset its position |
| MIC | <- / -> | Microphone device |
| Anim | <- / -> | Radio animation. Hidden when animations are disabled server-side |
| SCL | <- / -> / LOD | Load a scan list preset. Only shown when your codeplug defines scan lists |
The /tradio settings dialog
/tradio opens the full settings dialog — everything from the ST menu plus options that need more room. It has two tabs, and a third when your codeplug has scan lists.
Audio tab
| Option | Notes |
|---|---|
| Voice / SFX / 3D Volume | 0–100 sliders |
| Earbuds | Off, your radio leaks out spatially. On, private earpiece — nobody nearby hears it |
| Voice Announcements | Speaks the zone and channel name aloud when you switch. Codeplug-gated |
| Man Down Alarm | Broadcasts an alert if you stay down too long. Codeplug-gated |
| Auto Transmit | Auto-transmit when you hit the emergency button. Codeplug-gated |
| Tone Ducking | Lowers voice audio while a tone plays so the tone stays audible |
| Microphone | Input device, with a refresh button beside it |
| Animation | Which radio animation plays |
Style tab
| Option | Notes |
|---|---|
| Radio Style | Radio model for your current context — the model is remembered per context, so on-foot and in-vehicle can differ |
| Theme | Auto, Light, or Dark |
| GPS Blips | Codeplug-gated |
| Geo Zones | A master Geo Auto-Switch toggle plus one checkbox per zone you can reach. Both must be on for a zone to switch you. The whole section is hidden when no zone applies to you |
| Separate On-Foot Focus Layout | Use a different radio skin when the radio is open but unfocused |
| Channel List | Enable the floating channel-member overlay |
| Active Talkers Only | Show only transmitting units in that overlay |
| Move Radio / Reset Position | Drag to reposition, scroll to scale |
| Move Channel List / Reset | Same, for the overlay |
| 3D Prop Editor | Admins only — see Vehicle radio props |
Channel features
Scanning
Navigate to a channel and press SCN to add it to your scan list; press again to remove. Your connected channel always wins transmit priority, and transmitting on it mutes scan traffic until you release PTT.
If your codeplug defines scan lists, load a whole preset at once from /tradio → Scan Lists, or with the SCL option in the ST menu. Each entry carries a priority — 1 High, 2 Normal, 3 Low.
Channel list overlay
Enable it in /tradio → Style → Channel List. A floating roster of everyone on your channel, aware of patches, trunking, and scan traffic.
- Callsign badges coloured by the channel's GPS blip colour
- Dispatchers marked with a DSP badge; panicking units highlighted red
- Header badges: zone and channel name, frequency, P when patched, T when trunked, the active alert name, and PANIC during an emergency
Drag it anywhere and scroll to scale it, independently of the radio.
Emergency and panic
Press your emergency keybind or the on-radio emergency button. Your GPS blip flashes for everyone whose codeplug can see your blips, and dispatchers get a panic indicator. Depending on your codeplug, the radio may also switch to a dedicated emergency channel and auto-transmit for a set number of seconds.
Panic clears automatically after 60 seconds by default, or immediately when a dispatcher acknowledges it. A cooldown (15 s by default) prevents repeat triggering.
Man down is separate: if enabled, being down or stationary for too long plays a warning tone after 45 seconds and escalates to a full emergency broadcast 20 seconds later. Players toggle it in /tradio when their codeplug allows it.
Callsigns
With the callsign system on, a callsign replaces your character name on radio displays and the dispatch panel.
/callsign 2L-319 -- set
/callsign -- show current
/callsign clear -- remove
The command name is configurable in Admin Panel → Settings → General. Callsigns persist client-side, namespaced by your community ID — set sets tlib_community_id "your-unique-id" in server.cfg so callsigns do not bleed between your test and production servers. Dispatchers can also assign a callsign from the panel.
Battery and signal
Battery runs 0–100%. By default it charges 0.5%/s in any vehicle — driver or passenger, no dock prop needed — and drains 0.1%/s on foot, so a full charge takes about 3 minutes and a full drain about 17. At 0% the radio powers off. A chirp warns you under 50%, more often under 30%.
Signal bars (1–5) reflect your distance from the nearest signal tower. With Signal Degradation enabled, low signal audibly degrades voice quality. Both battery drain and signal behaviour are server settings; see Configuration.
3D audio
When 3D audio is enabled server-side, nearby players hear your radio coming from your position — voice, tones, sirens, helicopter, and gunshots.
- Earbuds off — your radio leaks out spatially, audible within 35 m by default
- Earbuds on — private earpiece, nothing is emitted
- Wearing a configured earpiece item switches earbuds on automatically
With Vehicle 3D Audio on, any vehicle you get into claims your radio as its source. Walk more than 3 m away and the car keeps rebroadcasting your traffic from itself, audible within 60 m by default, until it despawns or you claim another. One vehicle, one owner at a time — and you never hear your own vehicle, only other players do.
All three distances are server settings.
The dispatch panel
Open http://your-server-ip:port/ in a browser, or install the desktop app. Log in with the dispatchNacId from config.lua, or with Discord if that is enabled. Sessions last 24 hours.
Desktop app or browser
Browsers block microphone access over plain HTTP
The panel shows a Mic denied warning and voice transmission is unavailable. Use the desktop
app, which handles mic access automatically, or put an HTTPS reverse proxy in front of the radio
server. For local testing only, Chrome's
chrome://flags/#unsafely-treat-insecure-origin-as-secure also works.
The desktop app additionally gives you global push-to-talk — a browser cannot capture hotkeys while you are alt-tabbed into the game, and this is the main reason the app exists. It also supports native pop-out windows for the TX log and call queue.
Download it from Settings → Desktop App → Download inside the panel, or directly from http://your-server-ip:port/radio/dispatch/installer. On first launch enter your server URL. It auto-updates whenever the server's version changes — an Update button appears in the header.
Working the board
Transmitting — hold T (default) or the header PTT button to talk on your monitored channel. Each channel card also has its own hold-to-talk button for cross-channel transmits without leaving your current channel, and each can be given its own PTT key in Settings.
Units — drag a user between channels to move them. The menu on each user row can disconnect them, send them a direct alert, or set their callsign.
Alerts — trigger any configured alert on any channel from the channel menu, or compose a free-text broadcast with an optional tone from Broadcast Alert.
Frequency patching — bridge two or more channels so every patched unit hears the others. Create one from the Patches panel in the header: give it a label, pick at least two frequencies, and create. A P badge appears on every patched channel, and patches survive a restart. Trunked channels cannot be patched.
Announcement groups — when at least one group is configured, a GROUPS bar appears above the zone list. Click a group to arm it; your next PTT broadcasts to every channel in it at once. Click again to disarm, or give the group its own PTT key in Settings.
Transmission log — a running log of transmissions with timestamps, frequencies, and callers. Filter by All, Monitored, or Channel; replay buffered audio with Play; collapse it, or pop it out into its own window on the desktop app.
Speakers (tone board) — when speakers are configured, a Speakers button appears bottom-right. Pick a tone, then press a speaker or speaker group to play it at that world location. See Speakers.
Settings — callsign, voice and SFX volume, PTT bindings, theme, transmission log on/off, auto-collapse empty channels, and the desktop app download.
Themes
Five themes ship built in and are selectable in Settings → Theme with no install: Dark Minimal (default), Dark, Dark Blue, Basic, and Basic Dark.
More are installable from Admin Panel → Marketplace → Themes. A theme can be anything from a colour swap to a completely custom console. Building one is documented in the API Reference.
911 calls
Experimental
The 911 system works end to end, but it is still settling — expect rough edges, and expect behavior to change between releases. If you would rather not run it on a live server yet, turn it off in Admin Panel → Settings → General → 911 Calling. Everything else in tRadio is unaffected either way.
Civilians call 911 and land in a queue on the dispatch panel. When a dispatcher accepts, the caller and that dispatcher are placed on a private, temporary voice channel and simply talk. Anyone can call 911 — no radio, no codeplug, and no channel access required.
/911 -- dial with no details
/911 shots fired at the bank -- dial with a message for the dispatcher
The message is optional and capped at 200 characters. The dispatcher sees it on the call card alongside the caller's phone number, unit ID if they have a codeplug, position, and how long they have waited.
There is exactly one way to dial at a time
With LB Phone 911 Dial-In enabled, the /911
command is not registered at all — players dial 911 on their in-game phone instead. Both routes
reach the same queue. Turn it off and restart for the chat command.
What the caller experiences
- A ring-out tone plays immediately and keeps ringing until a dispatcher answers
- On answer, the radio powers on by itself and a 911 banner appears at the top of the screen
- Speech is hands-free — the call uses in-game voice activity detection, not PTT. Just talk
- Press ESC at any time to hang up, or end the call on the phone if dialled that way
What the dispatcher does. Accepted calls get the same controls as a real channel:
| Control | Effect |
|---|---|
| Accept | Puts you on a private voice channel with the caller |
| Listen | Adds the call to your scan list so you hear it alongside your channels |
| Talk | Press-and-hold cross-channel PTT on the call |
| Focus | Points your main PTT key at this call instead of your channel, for a sustained conversation |
| End | Hangs up. Available to any dispatcher, not only the one who accepted |
Like the transmission log, the queue is collapsible and can be popped out on the desktop app. The whole section disappears when 911 Calling is off.
Timeouts. An unanswered call expires after 5 minutes. After a dispatcher accepts, the caller has 20 seconds to connect. A call whose channel stays empty for 15 seconds is treated as hung up. Players are rate-limited between calls — 30 seconds by default, with a 5-second server-side backstop that always applies.
When nobody is on the panel, the call still queues and appears the moment a dispatcher logs in. The call911NoDispatcherFallback hook also fires immediately so it is not silently missed — by default it chat-broadcasts to every player with radio access. Replace it with a Discord webhook or your own alerting; see 911 hooks.
Radio models and appearance
Ten models ship. The radio picks one automatically from your context, and each context remembers its own choice.
| Context | Default model |
|---|---|
| On foot, focused | ATX-8000 |
| On foot, unfocused | ATX-8000H — only when Separate On-Foot Focus Layout is on |
| Ground vehicle | AFX-1500 |
| Watercraft | AFX-1500G |
| Air vehicle | TXDF-9100 |
The full set, by folder name — use these when picking allowed models on a codeplug:
| Model | Form factor |
|---|---|
ATX-8000 | Portable handheld — the on-foot default |
ATX-8000H | Portable handheld — unfocused on-foot variant |
ATX-8000G | Portable handheld — alternate body |
ATX-NOVA | Portable handheld — modern slim |
ARX-4000X | Portable handheld — compact |
XPR-6500 | Portable handheld — squared body |
XPR-6500S | Portable handheld — squared body, slim |
AFX-1500 | Dash-mounted — the in-vehicle default |
AFX-1500G | Dash-mounted — watercraft variant |
TXDF-9100 | Aviation radio — the in-air default |
Which models a player may pick, and which one they get first per context, is set on their codeplug under Allowed Models and Default Layouts. Codeplugs can also override the model for a specific vehicle spawncode, or a specific spawncode and livery combination.
Install more from Admin Panel → Marketplace → Layouts. Installed layouts appear immediately in every player's style picker, with no restart.
Vehicle radio props
Admins with tlib.admin can place a dashboard radio prop per vehicle model. Sit in the vehicle you want to edit, then open /tradio → Style → 3D Prop Editor.
| Input | Action |
|---|---|
| Middle mouse + drag | Orbit |
| Shift + middle mouse + drag | Pan |
| Scroll wheel | Zoom |
| W / R | Translate mode / rotate mode |
| X | Toggle world and local space |
Drag the coloured arrows to move and the rings to rotate. Save applies to every client immediately. Export Config copies the placement block for use elsewhere.
Animations
Players pick their radio animation in /tradio → Audio → Animation. Four ship, all using native GTA dictionaries with no extra resources:
| Name | PTT pose | Radio-open pose |
|---|---|---|
| None | — | — |
| Shoulder | random@arrests / generic_radio_enter | cellphone@ / cellphone_call_to_text + hand radio prop |
| Handheld | cellphone@ / cellphone_call_to_text + hand radio prop | same |
| Earpiece | cellphone@ / cellphone_call_listen_base | — |
A fifth entry, Call911, is used automatically for the caller side of a 911 call — a phone-to-ear pose with a phone prop, since a 911 caller may have no radio at all. It is not meant to be chosen manually.
Animations are suppressed automatically while the player is driving or piloting, or holding a weapon.
Adding your own
Add entries to Config.animations in config/cl_functions.lua. Each entry needs a name, an onKeyState(isKeyDown) handler for the transmitting pose, and an onRadioFocus(focused) handler for the idle holding pose. Either may be an empty function.
MakeAnimHandler(dict, anim, prop) builds a standard handler — it loads the dictionary without blocking, attaches an optional prop to the right hand, and cleans up on release. It is defined in the same file, above the animation list.
[6] = {
name = "Chest Mic",
onKeyState = MakeAnimHandler("random@arrests", "generic_radio_enter", nil),
onRadioFocus = MakeAnimHandler("cellphone@", "cellphone_call_to_text", "prop_cs_hand_radio"),
},Find prop model names at forge.plebmasters.de/objects. Index [1] is the fallback used when a player's saved choice no longer exists.
Using rpemotes. Servers running rpemotes can call an emote instead. Check ShouldSuppressAnim first — it is defined alongside MakeAnimHandler and returns true while driving or armed:
[6] = {
name = "Handheld (rpemotes)",
onKeyState = function(isKeyDown)
local ped = PlayerPedId()
if isKeyDown then
if ShouldSuppressAnim(ped) then return end
exports["rpemotes"]:EmoteCommandStart("wt4", 0)
else
exports["rpemotes"]:EmoteCancel(true)
end
end,
onRadioFocus = function(focused)
local ped = PlayerPedId()
if focused then
if ShouldSuppressAnim(ped) then return end
exports["rpemotes"]:EmoteCommandStart("wt", 0)
else
exports["rpemotes"]:EmoteCancel(true)
end
end,
},Using a custom .ycd pack. Stream the files through rpemotes, register the clip as an emote, then call it exactly as above.
- Copy the
.ycdfiles into a subfolder underrpemotes/stream/ - The
.ycdfilename is the dictionary name. Open it in OpenIV or CodeWalker to find the clip name inside - Register it in
rpemotes/client/AnimationListCustom.lua— never editAnimationList.luadirectly:
CustomDP.Emotes = {
["radiochest"] = {
"anim@cop_mic_pose_002", -- dictionary (filename without .ycd)
"chest_mic", -- clip inside the dictionary
"Radio Chest", -- label in the rpemotes menu
AnimationOptions = { onFootFlag = AnimFlag.MOVING },
},
}- Add a
Config.animationsentry that callsEmoteCommandStart("radiochest", 0) - Restart rpemotes, then tRadio
Stream Deck
The official plugin turns an Elgato Stream Deck into a live radio panel — change channels, transmit, scan, and adjust volume without touching the keyboard. It works with both the in-game radio and the dispatch panel, and needs no separate desktop app.
The free Stream Deck Mobile app and the open-source OpenDeck both work too.
Setup
Install the plugin
Elgato Stream Deck: double-click com.timmyg-studios.tradio.streamDeckPlugin. OpenDeck: plugin menu → install from file. OpenDeck also needs its Node.js plugin runtime available.
Add actions to keys
Find tRadio in the actions list and drag the actions you want onto keys, or onto dials on a Stream Deck +.
Pick a target
Each control action has a Target: Radio (in-game), Dispatch (panel), or Auto (whichever is connected). Channel actions let you pick a specific channel from a live list.
Start tRadio
Keys populate and become interactive once their source connects — radio keys need you in-game with tRadio loaded, dispatch keys need the panel open. Until then they show as offline, which is expected.
Everything runs locally: the plugin opens a WebSocket server on 127.0.0.1:21398, and the game and panel connect out to it. Nothing leaves your PC.
Actions
| Key | Shows or does |
|---|---|
| Radio Status | Zone and connected channel, talk/scan status, signal bars, and scan / trunk / patch / GPS / secure indicators. Turns red on panic; shows active alerts |
| Talk Indicator | Amber when you transmit, green when someone on your channel talks, cyan on a scanned-channel hit — with the talker's name |
| Scan Indicator | Lit while scanning; flags scanned-channel hits |
| Dispatch Activity | The dispatcher's channel and zone, how many units are keyed up, and TX/RX including cross-channel transmits |
| 911 Queue | How many calls are waiting — goes red with the count |
| Radio Control | One flexible key: PTT, next/previous channel or group, power, toggle or focus the overlay, emergency, volume up/down/mute, and dispatch accept/end 911 |
| Channel | Act on a specific channel: Connect, Toggle Transmit, Talk on Channel (hold), or Toggle Scan. Lights when that channel is active, scanned, or keyed |
| Volume dial | Rotate for Master / SFX / 3D volume, press to mute. Live level on the touchscreen |
| Channel dial | Rotate to step channels or groups, press and hold to transmit |
Cross-channel dispatch PTT
Set a Channel key to Talk on Channel, target Dispatch, and pick a channel. Holding it transmits on that channel without leaving your current one. Add one per channel for instant multi-channel dispatch.
A channel key keeps its selection through disconnects, plugin reloads, and deck restarts — the choice is stored on the key itself, and it reconnects automatically when tRadio comes back.
