Installation
Step-by-step guide to install and configure Tommy's Radio on your FiveM server.
Prerequisites
- FiveM server, artifact 4752+
- tLib — install the release zip, not the source code (source lacks built files)
- A free port for the voice server (default
7777)
Extract Files
- Download the radio resource
- Transfer the
.zipto your server and unzip on the server — don't copy files individually - Place the extracted folder in
resources
Resource Name
The folder can be named anything — provide 'radio' in fxmanifest.lua keeps exports working regardless.
Configure Settings
Edit config.lua with your basic settings:
Config = {
serverPort = 7777, -- Port for voice server (must be unused)
authToken = "CHANGE_ME_TO_RANDOM_TEXT", -- Security key for the voice server API
dispatchNacId = "CHANGE_ME", -- Dispatch panel login password
}What are authToken and dispatchNacId?
authToken — A secret string that secures communication between clients and your voice server. Pick any random string and change it from the default before going live.
dispatchNacId — The password used to log into your dispatch panel. Anyone who knows it can access the panel.
Open Your Port
The radio voice server needs its own dedicated port, separate from FiveM and txAdmin.
Port Requirements
Your server needs three separate ports:
| Service | Default |
|---|---|
| FiveM | 30120 |
| txAdmin | 40120 |
| Radio | 7777 (configurable) |
You cannot reuse an existing port.
Web Panel Hosting (Pterodactyl / Most Providers)
- In your hosting panel, find Network, Ports, or Allocations
- Add a new port allocation (e.g.,
50978) - Update
config.lua:
Config = {
serverPort = 50978,
serverAddress = "http://YOUR_SERVER_IP:50978/",
}- Restart your entire server from the panel (not just the resource)
- Verify at portchecker.co
Port Still Closed?
Many Pterodactyl-based hosts (Gravel Host, RocketNode, VibeGames, etc.) require a support ticket to actually open the port, even after adding it in the panel.
Tell them: "I need port [YOUR_PORT] opened for a custom voice server resource."
VPS / Dedicated Server
Open the port directly, then leave serverAddress blank — the script auto-detects your IP.
Ubuntu/Debian:
sudo ufw allow 7777CentOS/RHEL:
sudo firewall-cmd --permanent --add-port=7777/tcp
sudo firewall-cmd --reloadWindows Server:
netsh advfirewall firewall add rule name="Radio Voice Server" dir=in action=allow protocol=TCP localport=7777Config = {
serverPort = 7777,
serverAddress = "", -- Auto-detect
}Home Server / Port Forwarding
Forward port 7777 (TCP) in your router settings. Use your public IP in serverAddress.
Common Mistakes
Avoid These
- Using port 30120 or 40120 — already in use by FiveM/txAdmin
- Mismatched ports —
serverPortandserverAddressmust use the same port - Wrong
serverAddressformat — must be"http://IP:PORT/"withhttp://and trailing/ - Testing before resource starts — the port only opens when the radio resource is running
- Assuming panel = opened — adding a port in your hosting panel doesn't always open it; verify with portchecker.co
Amber 'hairpin-NAT' warning on startup (v5.7+)
v5.7 probes both the public URL and 127.0.0.1 at startup. If the public probe fails but localhost succeeds, you'll see an amber warning rather than a red error — this usually means your router doesn't support NAT reflection, not that the radio is broken. As long as players can connect from outside your LAN, it's safe to ignore. See Health Checks Failing Despite Working Panel for details.
Start the Resource
Add to your server.cfg:
start radioWhen everything works, you'll see:
[Radio-Server] Started Radio Server - Running Checks...
[Radio-Server] HTTP endpoint test passed (attempt 1/4)
[Radio-Server] Socket.IO connection test passed (attempt 1/4)
+----------------------------------------------------+
| |
| Tommy's Radio - System Ready |
| |
| Version: v5.6 |
| Status: Started - All Systems Operational |
| Panel: http://192.0.2.100:7777/ |
| NAC ID: 141 |
| Config: 3 zones, 12 channels |
| |
+----------------------------------------------------+Next Steps
- Wire up NAC IDs — edit
Config.getUserNacIdinconfig.luato return a string per player based on their job or role. See framework integration for QBCore / ESX / Qbox. - Define zones and channels — set
Config.zoneswith the NAC IDs that can see each zone and connect or scan each channel. See Zones & Channels. - Tune audio live —
/tradio> Admin Settings toggles P25 / analog FX, 3D audio, bonking. No restart needed. See Radio FX. - Set up the dispatch panel — pick NAC ID or Discord login, download the desktop app. See Dispatch Panel.
- Customise alerts and tones — add
Config.alertsentries, drop WAV files intoclient/radios/default/sounds/. See Alerts. - Place vehicle radio props —
/tradio> 3D Prop Editor in each vehicle you want a dashboard radio on. See 3D Prop Editor.
Upgrading from v4.x
v5 introduces a split config: network/zones/callbacks stay in config.lua, while audio/FX/3D/bonking/callsign settings move to data.json (managed by the in-game admin panel). Migration runs automatically on first start.
Moves from config.lua to data.json:
- Audio & volume (
voiceVolume,sfxVolume,volumeStep,pttReleaseDelay,pttTriggersProximity,panicTimeout) - Transmission effects (
playTransmissionEffects,analogTransmissionEffects) - Radio FX chain (
radioFx.*) - Bonking (
bonking.*) - 3D audio (
enable3DAudio,default3DAudio,default3DVolume,vehicleRadio3DAudioEnabled,vehicle3DActivationDistance) - GPS & signal (
gpsBlipUpdateRate,signalDegradationEnabled) - Callsign system (
useCallsignSystem,callsignCommand) defaultLayouts
Stays in config.lua:
- Network (
serverPort,serverAddress,authToken,dispatchNacId,useDiscordAuth) - Keybinds (
Config.controls) - Zones and channels
- Alerts (
Config.alerts) - Signal tower coordinates
- Callbacks (
radioAccessCheck,getUserNacId,getPlayerName,talkCheck,bgSirenCheck,batteryTick)
No manual action is needed — just start the resource and the migration runs once.
