Skip to content

Tommy's Radio

A real P25 radio system for FiveM — its own voice server, conventional and trunked channels, a dispatch panel, 911 calls, 3D audio, and station alerting.

Most FiveM radio scripts add channel routing and an audio filter on top of pma-voice. Tommy's Radio runs its own voice server and encodes speech with P25 IMBE — the same vocoder real public-safety handhelds use. The radio sound is the codec, not an effect painted over your voice.

Channels, trunking, codeplugs, a dispatch panel, 911 calls, 3D audio, station alerting, and GPS all ship in one resource. One port, one config file, nothing external to sign up for.

P25 IMBE
the vocoder real public-safety radios use
3.7×
less bandwidth than Opus
6
frameworks auto-detected, or run standalone
10
radio models included
0
restarts to change a setting

Requirements

RequirementDetail
FiveMArtifact 4752 or newer. Run version in your server console
tLibv0.6+, free — download. No other deps
A portOne free TCP port, default 7777, reachable from the internet. Not FiveM's 30120
FrameworkOptional. ESX, QBCore, QBX, ND_Core, ox_core, and nat2k15 auto-detect; standalone works
VoiceRuns alongside pma-voice or Mumble. It does not replace your proximity voice

Opening the port is the step that goes wrong most often, so it has its own section in the installation guide.


Try it first

All three are live right now, on the same server, and none of them need a purchase.

The dispatch panel

The real panel, running against that server. Talk to the players on it from your browser.

Access code

Open the panel

The admin panel

Every setting a server owner touches — zones, channels, codeplugs, audio, alerts, speakers, towers. Change one and it reaches every connected client instantly.

Or just get in the game

Press F8 in FiveM, paste the line below, and press enter. Once you spawn in, press F6 to open a radio and key up on a channel with the dispatchers above.

Connect in FiveM

Install in five steps

  1. Extract the resource into your server's resources folder
  2. Configure config/config.luaserverAddress, serverPort, authToken, adminPassword, dispatchNacId
  3. Open the port in your firewall or hosting panel
  4. Add ensure tRadio to server.cfg, below ensure tLib
  5. Restart — the startup banner's Status row should read Server started successfully

A new install is not empty. Three zones, twelve channels, a working codeplug, four alerts, and job mappings for police, sheriff, ambulance, and fire ship preconfigured, so a patrol officer can key up the moment the port is open.


Features

Radio that sounds like radio

A WebAssembly build of op25's IMBE encoder — the same codec real public-safety handhelds run. The sender encodes once; every listener decodes locally, whether they are in game, on the dispatch panel, or a bystander standing nearby. Bitrate is roughly 3.7× smaller than Opus.

The voice server runs on a port you pick, completely separate from FiveM and your existing voice stack. Not layered on pma-voice, not piggybacking on a third-party service.

P25 is set per channel, so a digital dispatch channel and an analog tac channel live on the same radio — and an analog FX chain (highpass, lowpass, compression, drive, mid-boost) sits on top of either.

Conventional and trunked channels

Conventional is one shared frequency: everyone connected hears everyone else. Trunked auto-assigns units to sub-frequencies by location, so four units spread across the map stop stepping on each other — and dispatch still reaches all of them on the control frequency.

Patching bridges two or more channels on the fly, and patches survive a restart. A floating channel list shows who is on with you, callsigns, who is transmitting, dispatcher badges, and patch or trunked state. Channels flagged secure show a lock.

Codeplugs — one radio per department

The same idea real agencies program into their fleets. A codeplug is a radio personality: which channels a unit can transmit on, which it can only scan, which radio models it may carry, what its emergency button does, and whose GPS blips it can see.

Map jobs to codeplugs in one table, optionally per rank, so a sergeant's radio carries channels a patrol officer's does not:

['police'] = { [0] = 'leo', [3] = 'leo-supervisor', [8] = 'leo-command' }

Each codeplug carries named scan lists with priorities, per-context default radio models (on foot, vehicle, boat, aircraft, and per-spawncode overrides), supervisor rights, and cross-agency GPS visibility — so fire can see EMS but not undercover units. Unmapped jobs get no radio at all, by default.

A dispatch panel that dispatches

A browser panel plus a native Windows app with global push-to-talk and auto-updates. Dispatchers transmit to any channel, patch frequencies, arm announcement groups that broadcast to many channels at once, trigger alerts with tone picks, answer 911 calls, replay buffered transmissions from the log, and assign callsigns. Same vocoder as the in-game radios, so audio is consistent either direction.

Speakers you can place, tones you can drop

Stand where you want a speaker, run /_tradio_coords, and paste the position into Admin Panel → Speakers with a radius, an optional prop model, and a group name. A dispatcher then picks a tone, presses a speaker or a whole group, and it plays at those coordinates in 3D — station alerting, tone-outs, PA stingers.

Everyone inside the radius hears it from the speaker, positioned. Nobody outside hears anything.

A working 911 line

Experimental

The 911 system works end to end, but it is still settling. It can be switched off entirely in Admin Panel → Settings → General, and nothing else in tRadio depends on it.

Players dial /911 — or 911 on their LB Phone — and land in a queue on the dispatch panel with their phone number, unit ID, location, and message. Dispatchers accept, talk, and hang up like a real call.

Callers speak hands-free over voice activation with a phone-to-ear animation, and press ESC to hang up. No radio, codeplug, or channel access is needed to call. If no dispatcher is online, a configurable fallback broadcasts the call to on-duty units instead. Full detail in Usage.

Radio in 3D space

Players near a talker hear their radio at their position — voice, tones, the siren loop behind them, helicopter rotor, and gunshots fired during a transmission. The earbuds toggle gates your outgoing broadcast, and wearing a configured earpiece item enables it automatically. See 3D audio.

A radio that's really in the dash

Not a screenshot taped to the dashboard. It is a streamed prop with a live display — zone, channel, signal bars, status LEDs — rendering the same thing the player's own radio shows. Walk away from the car and it takes over as the audio source at extended range.

Placement is per vehicle model and done in game: sit in the car, open /tradio → Style → 3D Prop Editor, and drag it into place with a Three.js gizmo. Save, and it applies to every client immediately. Codeplugs can override the model for a specific vehicle spawncode, or a spawncode and livery combination.

Drag the arrows to move, the rings to rotate, then save to push it to every client.

Coverage you can plan — and lose

Signal towers go in at coordinates you pick, and strength falls off with distance from the nearest one. Turn on degradation and a weak signal audibly chews up the audio, so the edge of the county sounds like the edge of the county. Tune the falloff curve and severity, or flip Always Full Signal to keep your tower layout without the consequences.

Geo zones go the other way. Give a centre coordinate and a radius — the mall, the airport, a prison — with optional floor and ceiling heights for stacked interiors. A unit walking in switches to that area's channel automatically and reverts on the way out. Players opt in per zone, so nobody gets yanked off dispatch unexpectedly.

Tune every knob, live

The admin panel covers the analog FX chain, signal coverage, half-duplex "bonking" behaviour, 3D audio ranges, GPS blip rate, man-down timers, 911 cooldowns, keybind defaults, and default radio layouts per vehicle type. Changes broadcast to every connected client instantly — no restart, no file editing.

Details that sell the illusion

Battery drains on foot and charges in any vehicle, chirping a warning under 50% and cutting out at zero. Man-down monitoring escalates from a warning tone to a full emergency broadcast if a unit stays down. Keying up over another transmission earns a bonk tone, with a double-tap override when it is urgent. Spoken announcements read the zone and channel aloud as you switch.

Every one of these is a toggle, and every player-facing string is translatable.

Built to be customised

Radio models are HTML and CSS folders in layouts/ — ten ship, and marketplace installs appear in the Style picker on next open. Twenty-five tone slots remap globally or per radio model, with variants for conventional, trunked, and patched channels.

A complete Lua export surface, a REST API, and a Socket.IO event stream cover anything the UI does not.

Make the dispatch panel yours

Five themes ship built in. Beyond that the panel has a real theming SDK, in four tiers. Recolour it with design tokens. Restyle it with CSS. Replace individual components — a channel card, a unit row, a 911 card — while the panel keeps every feature gate and accessibility guard around them. Or rebuild the console from scratch with a declarative template.

None of those tiers require JavaScript, so they publish to the marketplace without a review queue. A worked dispatch-console rebuild ships as a reference. See dispatch panel theming.

One click, no code, no restart

Radio UIs, dispatch themes, and tones publish to the tMarketplace. Find one, press install in Admin Panel → Marketplace, and it shows up in every player's style picker the next time they open the radio. No file transfer, no restart tRadio, no editing anything.

Live today: extra handhelds, a car radio, a tone pack, and a full dispatch-console theme. Because layouts and themes are just HTML and CSS, anyone can build one — and publishing needs no review queue.

Drive it from a Stream Deck

An official plugin turns an Elgato Stream Deck into a live radio panel — channel and zone on the key, signal bars, who is talking, panic in red, and the 911 queue count. Push to talk, step channels, scan, adjust volume, or hold one key to transmit on a specific channel without leaving your own.

It drives both the in-game radio and the dispatch panel, and needs no companion app — the plugin talks to them directly over localhost. Free with the resource, and it works with Stream Deck Mobile and OpenDeck. See Stream Deck.

Plays well with your stack

Auto-detects ESX, QBCore, Qbox, ND_Core, ox_core, and nat2k15 — job-to-codeplug mapping is one table in an open config file, and access refreshes the moment a job changes. Discord OAuth gates the dispatch and admin panels by role.

Optional integrations mirror 911 calls into ImperialCAD, hook 911 dialling into LB Phone, and surface radio status in LB Radio. Running more than one FiveM server? Satellite mode federates every server onto one shared radio network and dispatch panel.


Specifications

Compatibility

FiveM artifact4752 or newer
FrameworksStandalone, ESX, QBCore, QBX, ND_Core, ox_core, nat2k15 — auto-detected
DependenciestLib v0.6+ (free). Nothing else
VoiceRuns alongside pma-voice / Mumble, does not replace it
PortsOne free TCP port, default 7777, internet-reachable
Multi-serverSatellite federation onto one shared voice server and panel

What stays open

ProtectionFiveM Asset Escrow
Editable, unencryptedconfig.lua, cl_functions.lua, sv_functions.lua, locales.json, layouts/, data.json
Framework hooksAll of them, in sv_functions.lua and cl_functions.lua
Extension pointsLua exports, REST API, Socket.IO events, theme SDK

What is included

Radio models10, plus marketplace installs
Tone slots25, remappable globally or per model
Dispatch themes5 built in, more from the marketplace
Dispatch appBrowser panel + Windows desktop app with global PTT
Stream DeckOfficial plugin, free with the resource
MarketplaceOne-click UIs, themes, and tones from the admin panel — no restart
Preconfigured3 zones, 12 channels, a working codeplug, 4 alerts

Questions people actually ask

Do I really have to open a port?

Yes. tRadio runs its own voice server inside the FiveM process, and that server needs one TCP port reachable from the internet. Most hosting panels expose extra ports on request. The installation guide covers Windows, Linux, and the common hosts, and troubleshooting covers what to do when the port looks open but the radio still will not connect.

Will it fight with pma-voice?

No. Radio PTT uses tRadio's own microphone capture on its own server, so your proximity voice keeps working exactly as it does now. The only place tRadio touches in-game voice is 911 calls, which use voice activation.

It says Escrow. Can I still configure it?

Yes. The resource is escrow-encrypted, but config/config.lua, both function-hook files, config/locales.json, layouts/, and data.json ship unencrypted and stay yours. Framework integration is a Lua function you write. Nearly everything else is a setting in the admin panel, applied live.

What survives an update?

Six items: config/config.lua, config/cl_functions.lua, config/sv_functions.lua, config/locales.json, data.json, and layouts/. Everything else is replaced. Release notes call out any new config.lua key, since new keys are not merged into your file automatically — see updating.

What is still rough?

The 911 system works end to end but is still settling, and can be switched off from the admin panel without affecting anything else. Transmission playback and the LB Phone / LB Radio integrations are also marked experimental. Trunked channels cannot be patched.


Pages

Installation

Step-by-step setup, port configuration, and getting your server running.

Configuration

config.lua reference, zones, channels, codeplugs, access control, speakers, towers, admin panel settings, and framework integration.

Usage

In-game controls and settings, the dispatch panel, 911 calls, radio models, animations, and the Stream Deck plugin.

API Reference

Lua exports, REST endpoints, Socket.IO events, and the full dispatch panel theming reference.

Troubleshooting

Common problems and fixes for connection, audio, codeplug access, and P25 quality.