The radio won't connect
Read the health check first
Every start prints a Status row in the tRadio banner. It tells you which of three situations you are in.
| Status | Meaning | Do this |
|---|---|---|
Green — Server started successfully | Both the public and localhost probes passed | Nothing. The port is open |
| Amber — reachable on localhost, public probe failed | The radio works for players; this host just cannot reach its own public IP (hairpin NAT, CGNAT, or a reverse proxy) | Confirm from portchecker.co or a phone on mobile data. If players connect, the warning is cosmetic |
| Red — both probes failed | Nothing is listening on that port, or something else is | Follow the port fix below |
ECONNREFUSED, closed port, or "Failed to connect to radio server"
What you see
[Radio-Server] ERROR Health check failed after 4 attempt(s)
[Radio-Server] WARN HTTP endpoint test failed - connect ECONNREFUSED
or players get Failed to connect to radio server in-game, or the browser console shows xhr poll error.
Why — the port is not reachable from the internet.
Diagnose — with the resource running, enter your server IP and the port from config.lua at portchecker.co. Closed confirms it.
Fix, hosting panel
- Confirm the port exists in your panel's Network / Ports / Allocations section
- Confirm it is not 30120 (FiveM) or 40120 (txAdmin)
- Make
serverPortand the port insideserverAddressmatch - Restart the entire server from the panel, not just the resource
- Re-test. If it is still closed, open a support ticket — most Pterodactyl hosts block the port at the network level even after you add it
Fix, VPS
sudo ufw allow 7777 && sudo ufw reload # Ubuntu / Debian
sudo firewall-cmd --permanent --add-port=7777/tcp && sudo firewall-cmd --reload # CentOS / RHELConfirmed when portchecker.co reports Open and Status goes green on the next restart.
"Invalid URL" on startup
serverAddress is malformed. Set it to "" to auto-detect, or use exactly http://IP:PORT — the protocol and the port are both required.
Port is reachable but another service answers
The banner says the port is reachable but a different service is responding. Something else is bound to it. Pick a port nothing else uses and update both serverPort and serverAddress.
The radio won't open at all
What you see — pressing F6 does nothing, and the F8 console shows radio keybind blocked: server has not granted radio access.
The server denied access. Work through the chain in order:
- Does the player have a codeplug? Their job must appear in
JOB_CODEPLUG_MAPinconfig/sv_functions.lua, and the value must match a codeplug's ID in the admin panel exactly. Unmapped jobs get no radio by design - Is a grade threshold excluding them? If the mapping uses grade thresholds, a player below the lowest threshold gets nothing
- Is the item requirement on? With
Config.inventory.enabled = true, they must be carrying the item — or hold thetRadio.accessACE - Did their job just change? Call
exports['tRadio']:refreshNacId(source), or leaveautoRefreshOnJobChange = trueand let tRadio handle it - Does the codeplug have any allowed models? A codeplug with none leaves the player with no radio to render
JOB_CODEPLUG_MAP changes require restart tRadio. Admin panel changes do not.
Also possible: radio keybind blocked: NUI engine not ready yet simply means the UI is still loading. Wait a few seconds.
No audio
Nobody can hear me and I can't hear anyone
The player's codeplug does not include the channel. Add the channel under Channel Access on their codeplug, or grant tRadio.connect.{freq} (drop the decimal: 154.755 → 154755). Reconnect to the channel afterwards.
No static, tones, or radio character
Check three settings in Admin Panel → Settings → Audio & Radio:
- Transmission Tones must be on for
TX_START/TX_END - Radio FX must be on for the analog chain
- SFX Volume — both the server default and the player's own setting
Robotic, warped, or metallic audio on a P25 channel
| What you hear | Why | Fix |
|---|---|---|
| Robotic or warped at the very start of a session | The WASM vocoder is warming up | None needed — it resolves after the first transmission |
| Metallic buzz or warbling throughout | Microphone input is clipping | Lower the mic level in Windows Sound settings → Recording → Properties → Levels |
| First syllable cut off | Normal codec behaviour | If severe, raise PTT Release Delay |
| Dispatch hears clean audio instead of P25 | That channel is not a P25 channel | Set the channel's Mode to P25 Digital in Zones & Channels. There is no global P25 switch — it is per channel |
Idle hum, pops, or clicks
Turn Signal Degradation off in Settings → Audio & Radio and listen again. Degradation deliberately inserts dropouts at low signal; if that removes the artefacts, either lower Degradation Intensity or add more signal towers so players are not sitting at the edge of coverage.
Run /tradio_debug_audio before and after reproducing the noise and compare the two reports.
Unwanted bonk tones, or people talking over each other
Both are in Settings → Audio & Radio → Half-Duplex (Bonking). Turn Play Bonk Tone off to silence the tone; turn Block Transmission on to actually prevent the second transmission.
Microphone not working
Wrong device
Open the radio → ST → MIC, or /tradio → Audio → Microphone, and pick the right input. The refresh button beside it re-enumerates devices and re-acquires the stream.
FiveM was denied microphone access
If you clicked Deny on FiveM's permission prompt, no device list appears at all.
- Close FiveM completely
- Delete
%localappdata%\FiveM\FiveM.app\cache - Relaunch — the prompt reappears
- Click Allow
canTalk is returning false
This is the most common non-hardware cause
Config.canTalk in config/cl_functions.lua blocks transmission whenever it returns false —
the shipped version does so when the player is dead or swimming. If it starts returning false
mid-transmission, the client force-stops PTT and logs canTalk check failed mid-transmission, force-stopping PTT to the F8 console. Check for that line before suspecting hardware.
Voice chat works but the radio doesn't (or the reverse)
Expected, and explainable. Radio PTT uses tRadio's own microphone capture. In-game Mumble voice activity detection is used only for 911 calls. The two paths are entirely separate, so one working while the other does not is not by itself a bug.
Diagnostic commands
| Command | Shows |
|---|---|
/tradio_debug_audio | Full F8 report: audio context state, signal degradation parameters, active voice buffers, and micStreamReady / isRecording — check those two first for mic reports |
/tradio_debug_output [deviceId] | Output-device switching report |
/_tradio_diag | Connection diagnostics — socket health and connected endpoint |
/_tradio_tone [TONE] | Play a tone by key (default BEEP) — tests the tone path independently of PTT |
/_tradio_fx [EFFECT] | Play a background effect: transmission, gunshot, siren, heli, transEnd |
/_tradio_mute2d | Toggle 2D audio mute, to isolate 3D positional audio while testing |
/_tradio_coords [lua|json] | Copy your position to the clipboard for placing speakers, towers, and geo zones |
/_tradio_debug | Toggle the radio UI debug overlay |
/tradio_con <url> | Override this client's voice server address — useful for testing one player against another endpoint. Run with no argument to clear it. Power-cycle the radio to apply |
Wrong channels, zones, or blips
| Symptom | Fix |
|---|---|
| A channel is missing from the radio | Add the channel to the codeplug's Channel Access, or grant tRadio.connect.{freq} |
| A channel cannot be scanned | Add it to Scan Access, or grant tRadio.scan.{freq}. Connect-access channels are scannable automatically |
| A zone is missing | Zone access is derived from channels — select at least one of that zone's channels on the codeplug, or grant tRadio.zone.{N} |
| No GPS blips for other players | Check all three: the target codeplug is selected under GPS Visibility on the viewer's codeplug, GPS Blips is on in that codeplug's Features, and Radio Blips is on in Settings → General. The player's own GPS toggle must also be on |
| A zone vanished from the dispatch panel but works in-game | Its Hide from dispatch toggle is on. That is display scope only, not access control |
| Zone ACE grants apply to the wrong zone | tRadio.zone.{N} is positional. Deleting or reordering zones shifts every later-numbered grant — review server.cfg |
911 calls
/911 says unknown command
Two settings suppress it, both deliberately:
- 911 Calling is off in Settings → General. Turn it on
- LB Phone 911 Dial-In is on in Settings → Advanced. That replaces the command — players dial
911on the phone instead. Turn it off and restart to get the command back
If the phone integration is on but lb-phone is not installed or started, players have no way to reach 911 at all. tRadio logs a warning about exactly this a few seconds after startup.
Turning 911 off didn't remove the command
Expected and harmless. FiveM cannot unregister a chat command, so it stays for players already connected — but the server rejects every call and tells them 911 is unavailable. It disappears for anyone who reconnects, and after a resource restart.
Calls never reach the panel
The call is queued — a dispatcher connecting later will see it. Confirm a dispatcher is actually logged in, and that the sidebar's 911 section is not collapsed or popped out. With nobody on the panel, call911NoDispatcherFallback fires instead; by default that chat-broadcasts to everyone with radio access.
The caller can't be heard after accept
911 calls use in-game voice activity detection, not radio PTT. If the player's in-game voice chat is not working, the call carries no audio even though their radio PTT may be fine. See Voice chat works but the radio doesn't.
Dispatch panel
The desktop app shows someone else's server
It is pointed at the demo endpoint. In the app's settings, set Endpoint URL to http://YOUR_IP:YOUR_PORT/ and reconnect.
The panel asks for a NAC ID and I don't have one
It is not generated — you define it. Set dispatchNacId in config/config.lua and restart.
Microphone doesn't work in the browser
Browsers only expose microphone APIs over HTTPS. Use the desktop app, which has no such requirement, or put a reverse proxy with a valid TLS certificate in front of the radio server.
"No authentication method configured"
Neither adminPassword nor discord.adminRoles is set, so nobody can log into the admin panel. Set one in config/config.lua and restart. tRadio also prints this as a startup warning.
Session expired banner
Admin sessions log out after 30 minutes of inactivity, and a resource restart invalidates them. Click Log in again. Unsaved changes are lost, so save before stepping away.
Install and config errors
Syntax error referencing <\1>
Two causes:
- Corrupted transfer. FTP clients in ASCII mode (FileZilla's default) and Remote Desktop drag-and-drop corrupt Lua files. Use WinSCP or set binary mode — and always transfer the
.zipand unzip on the server - Outdated artifact. Build 4752 or newer is required. Check with
versionin the console
To update a Linux artifact: download the latest from the build server, stop the server, delete the cache and alpine folders, run tar -xf fx.tar.xz, and restart.
Missing .fxap file
The escrow file is dot-prefixed, so it is hidden on Linux and macOS and commonly dropped by FTP clients set to hide hidden files, or by .gitignore rules in a CI pipeline. Enable hidden files and transfer it; make sure .fxap is not gitignored in a git-based deploy.
The SGN button does nothing
The player needs the tlib.admin ACE, or Supervisor Access enabled on their codeplug. Note that tlib.admin grants in-game supervisor features only — it does not unlock the web admin panel, which uses adminPassword or Discord.
Framework failed to initialize
[tRadio] ERROR: Framework 'esx' failed to initialize.
All players are denied radio access until this is resolved. Confirm the framework resource is running and that Config.frameworkResources matches its actual resource name.
Changes in the admin panel aren't applying
Almost everything applies live. The exceptions are marked Restart required in the panel: 911 Calling, the Callsign Command name, and LB Phone 911 Dial-In. Anything edited in config/config.lua, sv_functions.lua, or cl_functions.lua also needs restart tRadio.
Getting more detail
Raise Log Level in Admin Panel → Settings → General. It applies immediately.
| Level | Output |
|---|---|
| 0 | Errors only |
| 1 | Warnings |
| 2 | Minimal |
| 3 | Normal — the production default |
| 4 | Debug — for troubleshooting |
| 5 | Verbose — very noisy, measurable performance cost on a busy server |
Reproduce the problem at level 4 or 5, then look for [tRadio]-prefixed lines in the server console. Connection failures appear at startup; audio path problems only appear when someone transmits. Set it back to 3 when you are done.
Still stuck? Post in the FiveM community thread with the full console error block, your config.lua with secrets redacted, the level 4 output captured during the failure, and your framework.
