Oxide Radio

Framework-agnostic handheld radio built on pma-voice with open frequencies, restricted job channels, and encryption for FiveM servers.

Oxide Radio is a framework-agnostic handheld radio built on top of pma-voice. It is designed to be the one radio for your whole server — a single radio item that everyone carries, open civilian frequencies anyone can tune to, and restricted job channels for emergency services and other departments. It replaces the assortment of separate radio scripts most servers accumulate, while still serving jobs like police and EMS that register their own channels at runtime.

pma-voice provides the actual voice audio; oxide-radio sits on top of it and manages everything around it: which channels exist, who is allowed on each one, password encryption for private frequencies, and the whole in-game interface. The radio UI still works when pma-voice is not installed — players just see a clear "voice unavailable" banner and no audio is transmitted. Access is server-authoritative and enforced at the pma-voice layer, so a modded client cannot force itself onto a restricted or encrypted channel.

The resource is standalone but integrates automatically with the studio's job resources through o-link exports. When oxide-police or oxide-ems are installed they register their department channels and put officers on the right frequency at clock-on, with a badge shown on the roster — all without the server owner touching oxide-radio's configuration. After the first start, configuration is edited live in-game from an admin settings menu backed by the shared oxide_settings database table, with no file edits or restarts.

Key Features

  • One Radio for the Whole Server — A single inventory item (radio by default) opens the radio for everyone. Access to restricted channels is decided by job, not by carrying a special item
  • Open and Restricted Channels — Any whole number in the configured dial range is an open civilian frequency anyone can tune to; restricted job channels can sit on any frequency and are gated by job name, minimum grade, and optional on-duty requirement
  • Runtime Channel Registration — Other resources (police, EMS) register their own department channels through the RegisterChannel export; these are owner-scoped, shadow any config channel on the same frequency, and are released automatically when the owning resource stops
  • Server-Authoritative Access Control — Every join is validated server-side and enforced at the pma-voice layer, so a modded client cannot bypass a restricted or encrypted channel. Access is re-checked on job/duty change and on a periodic sweep, and a player who loses access is removed from the channel
  • Channel Encryption — Any open frequency can be password-locked by a player currently tuned to it. Passwords are 6–32 characters, stored salted and hashed, and never sent to other clients. Five wrong attempts triggers a five-minute lockout that survives reconnect. The lock creator or a server admin can change or remove it
  • Channel Browser — A TeamSpeak-style list inside the panel showing every active channel and who is on it, scoped to the viewer — restricted channels only reveal their members to qualifying jobs, and encrypted channels hide members until unlocked
  • On-Screen Roster Overlay — A subtle heads-up list of who is on your current channel, with Discord-style live speaking indicators, badge tags, and a downed indicator. Toggled with a rebindable keybind (default U) and repositionable from the panel
  • Radio Display Names — Each player can set a per-character display name shown on rosters in place of their character name
  • Mic Clicks, Favorites, and Remembered Passwords — Per-client radio preferences: mic-click sound (Default/On/Off), starred favorite frequencies, and remembered encryption passwords
  • Roster Tags and Downed Flags for Integrators — Other resources can show a short tag next to a member (SetMemberTag, used by oxide-police for badge numbers) and flag members as down (SetRadioDead, or automatically via o-link death events). No hard dependency on any death or police resource
  • Automatic Job Integration — With oxide-police / oxide-ems installed, department channels register themselves and officers auto-join their default channel at clock-on with their badge on the roster — configured in those resources, not here
  • Live Database-Backed Configuration/radio settings (admin) edits everything in-game with no file edits or restarts after initial setup
  • Framework-Agnostic — Works on QBCore, QBX, ESX, and Oxide Core through o-link, and is localizable via locales/*.json

Requirements

Required

ResourcePurpose
ox_libLocale and shared runtime helpers
oxmysqlDatabase access for display names, encrypted frequencies, and live settings
o-linkFramework abstraction for character identity and names, jobs and duty, admin checks, usable items, notifications, death state, and logging
ResourcePurpose
pma-voiceProvides the radio voice audio. Soft dependency — not in the manifest dependencies. The radio UI works without it, but no voice is transmitted and players see a "voice unavailable" banner

Supported Frameworks

FrameworkSupport
QBCoreFull
QBX (qbx_core)Full
ESXFull
CustomVia o-link

Quick Start

Place oxide-radio in your server's resources directory.

Start oxmysql, ox_lib, pma-voice, o-link, and oxide-radio in that order in your server.cfg.

Make sure a usable radio item exists in your inventory system — stock QBCore and stock ox_inventory already ship one.

Review shared/config.lua before the first start — especially the job names in Config.JobChannels — since settings import into the oxide_settings database table on first start.

Turn off any other radio scripts (qb-radio, mm_radio) so oxide-radio is the only resource talking to pma-voice.

Start the server, use the radio item to open the panel, and run /radio settings as an admin to configure everything live.

See the Installation Guide for the full setup flow.

Documentation