Skip to content

Usage

Using Tommy's Radio — in-game controls and settings, channel features, the dispatch panel, 911 calls, radio models and animations, and the Stream Deck plugin.

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.

PageButtonsWhat they do
MainZN · CH · STOpen the zone list, the channel list, or the settings menu
ZonesSELSelect the previewed zone
ChannelsCON · DSC · SCNConnect, disconnect, or add the previewed channel to your scan list
SettingsvariesTGL toggles, UP/DWN adjust, <-/-> cycle choices

On the Channels page the third button changes with context:

  • SCN normally — toggle scanning on the previewed channel
  • SGN on the channel you are connected to, if you are a supervisor — fire the first configured alert
  • CT / TK on 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.

OptionButtonsNotes
GPSTGLYour blip's visibility. Hidden if the codeplug disables GPS
EarbudsTGLOnly shown when 3D audio is enabled server-side
VC VolDWN / UPVoice volume
SFX VolDWN / UPTone volume
3D VolDWN / UPOnly shown when 3D audio is enabled
Style<- / ->Radio model, from your codeplug's allowed models
DISP<- / ->Auto, Light, or Dark
MoveCHG / RSTReposition the radio, or reset its position
MIC<- / ->Microphone device
Anim<- / ->Radio animation. Hidden when animations are disabled server-side
SCL<- / -> / LODLoad 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

OptionNotes
Voice / SFX / 3D Volume0–100 sliders
EarbudsOff, your radio leaks out spatially. On, private earpiece — nobody nearby hears it
Voice AnnouncementsSpeaks the zone and channel name aloud when you switch. Codeplug-gated
Man Down AlarmBroadcasts an alert if you stay down too long. Codeplug-gated
Auto TransmitAuto-transmit when you hit the emergency button. Codeplug-gated
Tone DuckingLowers voice audio while a tone plays so the tone stays audible
MicrophoneInput device, with a refresh button beside it
AnimationWhich radio animation plays

Style tab

OptionNotes
Radio StyleRadio model for your current context — the model is remembered per context, so on-foot and in-vehicle can differ
ThemeAuto, Light, or Dark
GPS BlipsCodeplug-gated
Geo ZonesA 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 LayoutUse a different radio skin when the radio is open but unfocused
Channel ListEnable the floating channel-member overlay
Active Talkers OnlyShow only transmitting units in that overlay
Move Radio / Reset PositionDrag to reposition, scroll to scale
Move Channel List / ResetSame, for the overlay
3D Prop EditorAdmins 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:

ControlEffect
AcceptPuts you on a private voice channel with the caller
ListenAdds the call to your scan list so you hear it alongside your channels
TalkPress-and-hold cross-channel PTT on the call
FocusPoints your main PTT key at this call instead of your channel, for a sustained conversation
EndHangs 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.

ContextDefault model
On foot, focusedATX-8000
On foot, unfocusedATX-8000H — only when Separate On-Foot Focus Layout is on
Ground vehicleAFX-1500
WatercraftAFX-1500G
Air vehicleTXDF-9100

The full set, by folder name — use these when picking allowed models on a codeplug:

ModelForm factor
ATX-8000Portable handheld — the on-foot default
ATX-8000HPortable handheld — unfocused on-foot variant
ATX-8000GPortable handheld — alternate body
ATX-NOVAPortable handheld — modern slim
ARX-4000XPortable handheld — compact
XPR-6500Portable handheld — squared body
XPR-6500SPortable handheld — squared body, slim
AFX-1500Dash-mounted — the in-vehicle default
AFX-1500GDash-mounted — watercraft variant
TXDF-9100Aviation 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.

InputAction
Middle mouse + dragOrbit
Shift + middle mouse + dragPan
Scroll wheelZoom
W / RTranslate mode / rotate mode
XToggle 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:

NamePTT poseRadio-open pose
None
Shoulderrandom@arrests / generic_radio_entercellphone@ / cellphone_call_to_text + hand radio prop
Handheldcellphone@ / cellphone_call_to_text + hand radio propsame
Earpiececellphone@ / 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.

  1. Copy the .ycd files into a subfolder under rpemotes/stream/
  2. The .ycd filename is the dictionary name. Open it in OpenIV or CodeWalker to find the clip name inside
  3. Register it in rpemotes/client/AnimationListCustom.lua — never edit AnimationList.lua directly:
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 },
    },
}
  1. Add a Config.animations entry that calls EmoteCommandStart("radiochest", 0)
  2. 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

KeyShows or does
Radio StatusZone and connected channel, talk/scan status, signal bars, and scan / trunk / patch / GPS / secure indicators. Turns red on panic; shows active alerts
Talk IndicatorAmber when you transmit, green when someone on your channel talks, cyan on a scanned-channel hit — with the talker's name
Scan IndicatorLit while scanning; flags scanned-channel hits
Dispatch ActivityThe dispatcher's channel and zone, how many units are keyed up, and TX/RX including cross-channel transmits
911 QueueHow many calls are waiting — goes red with the count
Radio ControlOne flexible key: PTT, next/previous channel or group, power, toggle or focus the overlay, emergency, volume up/down/mute, and dispatch accept/end 911
ChannelAct on a specific channel: Connect, Toggle Transmit, Talk on Channel (hold), or Toggle Scan. Lights when that channel is active, scanned, or keyed
Volume dialRotate for Master / SFX / 3D volume, press to mute. Live level on the touchscreen
Channel dialRotate 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.