Dispatch Panel
Setup and usage guide for the Tommy's Radio dispatch panel.
Overview
Served by the radio server at http://your-server-ip:port/. Accessible from a web browser or the Tauri desktop app.

Dispatchers can monitor channels, transmit voice, trigger alerts, manage units, and patch frequencies.
Accessing the Panel
| Desktop App (recommended) | Web Browser | |
|---|---|---|
| Install | Download from Settings or /radio/dispatch/installer | None |
| Microphone | Auto-granted | Requires HTTPS or a Chrome flag |
| PTT | Any key or mouse button, global capture | T only, no global capture |
| Updates | Auto-updates with the server | — |
Desktop App Setup
Download and install
Open the dispatch panel in your browser at http://your-server-ip:port/. Go to Settings and click Download under Desktop App. Run the installer.
Alternatively, navigate directly to http://your-server-ip:port/radio/dispatch/installer to download.
Configure the endpoint
On first launch, the app will ask for your server endpoint. Enter http://your-server-ip:port and click Save.
Login
Enter your dispatchNacId from config.lua (default: 141). If Discord auth is enabled, click the Discord login button instead.
The desktop app automatically updates when the server version changes. If a version mismatch is detected, an Update button appears in the header bar.
Web Browser Setup
Browsers block microphone access on HTTP pages. To use voice transmission in the browser, you need one of:
| Method | Use Case |
|---|---|
| Chrome flag | Development / local testing. Set chrome://flags/#unsafely-treat-insecure-origin-as-secure to your server URL. Guide |
| HTTPS reverse proxy | Production. Set up SSL with Nginx or Apache in front of your server. |
Without one of these, voice transmission will not work. The panel will show a Mic denied warning with a link to download the desktop app.
Authentication
NAC ID (Default)
The dispatch panel uses a NAC ID as a password. Set it in config.lua:
dispatchNacId = "141", -- Change this to a secure valueDiscord OAuth
Replace NAC ID authentication with Discord login. Only members of your Discord server (optionally filtered by role) can access the panel.
Enable in config
Set useDiscordAuth = true in config.lua. With this on, the NAC ID login form is replaced by a Login with Discord button.
Create Discord application
Go to the Discord Developer Portal and create a new application. Under OAuth2, copy the Client ID and Client Secret.
Add redirect URI
In your app's OAuth2 settings, add this redirect URI (must match exactly):
http://your-server-url:port/radio/dispatch/authIf you're running the panel behind an HTTPS reverse proxy, add the proxied URL instead and set DISCORD_REDIRECT_URI in .env to the same value.
Configure environment
Create server/.env (copy from server/.env.example):
DISCORD_CLIENT_ID="your_discord_client_id"
DISCORD_SECRET="your_discord_secret"
DISCORD_GUILD_ID="your_discord_guild_id"
DISCORD_ROLES="" # Comma-separated Role IDs, or "" for all members
DISCORD_REDIRECT_URI="" # Leave empty unless using a reverse proxyGetting Discord IDs
Enable Developer Mode in Discord (User Settings > Advanced) to copy Server/Role IDs by right-clicking. Leave DISCORD_ROLES empty to allow all server members.
OAuth flow
- Login with Discord → panel POSTs
/radio/dispatch/authwith callsign, gets a pending session + Discord authorize URL - User consents on Discord, which redirects back to
/radio/dispatch/authwith an auth code - Server exchanges the code, validates the user is in
DISCORD_GUILD_IDand (if set) has a matching role inDISCORD_ROLES - Session is promoted to authenticated; panel reloads with credentials
Pending OAuth sessions expire after 10 min; authenticated sessions after 24 h.
Session persistence
- Browser — session ID + auth token stored in cookies; page refresh stays logged in
- Desktop (Tauri) — cookies don't survive cross-origin redirects, so Discord callback passes
?session=&token=&callsign=URL params instead - Restart recovery — panel auto-calls
/radio/dispatch/reauthon socket reconnect; no user re-login needed
Users removed from the Discord server or stripped of a required role are only blocked on their next login — active sessions run until they expire or the resource restarts.
Panel Features
Zones and Channels
The panel displays your radio zones as collapsible sections, each containing their channels. Each channel shows:
- Connected units with their callsigns
- Listener count (users scanning the channel)
- Active transmissions highlighted in real time
Unit Management
Drag & Drop
- Drag users between channels to reassign them
- Drag your own name to switch channels
- Reorder channels within zones
Context Menu
- Click the hamburger menu on a user to:
- Disconnect them from radio
- Send a direct alert
- Set their in-game callsign (if callsign system is enabled)
Voice Transmission
Hold T (default) or the PTT button. Dispatch shares the voice server with in-game radios, so the same P25/analog FX processing applies. PTT key is configurable in Settings; the desktop app accepts any keyboard key or mouse button and captures it globally.
Alerts and Tones

- Channel alerts — Send alert tones to specific channels
- Unit alerts — Send alerts directly to individual dispatchers
- Panic alerts — View and manage active emergency alerts
- Broadcast — Send system-wide announcements to all connected players
- Custom tones — Configure alert tones in
client/radios/default/tones.json
Frequency Patching
Bridge two or more channels so all patched units hear each other in real time. Managed from the dispatch panel only.
- Create a patch from the channel menu to bridge two or more frequencies (trunked channels cannot be patched)
- All audio, tones, and alerts flow across patched channels
- A P badge appears on patched channels in the dispatch panel, radio display, and channel list
- Each frequency can only be in one patch at a time
- Patches are cleared on resource restart — they live in server memory only
Transmission Log
Running log of all transmissions with timestamps, frequencies, and callers. Filterable by channel/zone, collapsible, and pop-outable (desktop only).
Settings
| Setting | Description |
|---|---|
| PTT Key | Key or mouse button for push-to-talk |
| SFX Volume | Volume for alert tones and UI sounds |
| Voice Volume | Volume for incoming voice transmissions |
| Theme | Visual theme for the panel |
| Transmission Log | Toggle and filter the TX log |
| Auto-collapse Channels | Collapse empty channels automatically |
| Endpoint | Server URL (desktop app only) |
