Tommy's Radio
A realistic P25 radio system for FiveM with a custom voice server, dispatch panel, and GPS tracking.
A real radio system, not a voice-chat filter.
Other FiveM radio scripts layer channel routing and a static filter on top of pma-voice. Tommy's Radio runs its own voice server and encodes speech with the same P25 IMBE vocoder used in real Motorola APX and Harris XL-185 handhelds — the characteristic digital-radio sound is the codec, not an effect.
Everything a comms stack needs ships in one resource: conventional and trunked channels, a dispatch panel (web and native desktop), 3D proximity audio, GPS tracking, and a live admin panel that retunes every client without a restart. One port, one config file, no external services.
Quick Start
Try the Demo Server
Connect to fivem.timmygstudios.com to try it out. Dispatch panel: https://dispatch.timmygstudios.com/ (code: 141)
Installation Summary
- Extract the resource to your server's
resourcesfolder - Configure
config.lua— setserverPort,authToken,dispatchNacId - Open the port in your firewall or hosting panel
- Add
start radiotoserver.cfg - Restart your server
Features
The codec real radios use
WebAssembly build of op25's IMBE encoder — the codec in Motorola APX and Harris XL-185 handhelds. The sender encodes once; every listener (in-game, dispatch, 3D bystander) decodes locally. Every operator on the channel hears the same compression, and the bitrate lands ~3.7× smaller than Opus.
Its own voice server
Runs on a port you pick, separate from FiveM and from your voice stack. Not layered on pma-voice, not piggybacking on a third-party service. Clients and the dispatch panel speak to it directly. One auth token, one config file.
A dispatch panel that dispatches
Web interface plus a native Windows desktop app with global PTT and auto-updates. Dispatchers transmit to any channel, patch frequencies together, custom alerts with tone picks, and assign callsigns. Same vocoder as the in-game radios — audio is consistent either direction.
Conventional and trunked channels
Conventional is a shared frequency — everyone connected hears everyone else. Trunked auto-assigns units to sub-frequencies by location: four units on the same channel spread across the map don't stomp each other's transmissions, and dispatch still reaches all of them on the control frequency. Patching bridges any two or more channels on the fly. A floating channel list HUD shows who's on with you — callsigns, TX state, dispatcher badges, patch- and trunked-aware.


Radio in 3D space
Players near a talker hear their radio at their position — voice, tones, siren loop, helicopter rotor, and gunshots fired during a transmission. The earbuds toggle gates your outgoing broadcast. Walk away from your car and the vehicle takes over as the audio source at extended range.
Tune every knob, live
In-game admin panel for the analog FX chain (highpass, lowpass, compression, drive, distortion mode, mid-boost), the P25 toggle, signal degradation, bonking behaviour, 3D audio ranges, GPS rate, and default radio layouts per vehicle type. Changes broadcast to every connected client instantly — no restart.
Built to be customised
Radio models are HTML/CSS folders — drop one in and it appears in the Style picker on next open. Previewable in a browser, no build step. Per-vehicle-model dashboard prop placement with a Three.js gizmo editor. Per-tone WAV overrides and per-channel-type tone variants (conventional, trunked, patched). A complete Lua export surface and HTTP API for anything the UI doesn't cover.
Pages
Installation
Step-by-step setup, port configuration, and getting your server running.
Configuration
config.lua reference, admin panel settings, zones, channels, alerts, and tones.
Framework Integration
NAC ID system, QBCore, ESX, and Qbox setup with example configs.
Radio Usage
Controls, settings, commands, prop editor, and custom layouts.
Dispatch Panel
Desktop app setup, Discord auth, panel features, and operations.
API Reference
Server and client Lua exports for scripting integrations.
Web API
REST endpoints and Socket.IO events for external integrations.
Troubleshooting
Common problems and solutions for ports, audio, connections, and more.
