Dispatch Panel

Setup and usage guide for the Tommy's Radio dispatch panel.

Desktop AppWeb Interface

Overview

Served by the radio server at http://your-server-ip:port/. Accessible from a web browser or the Tauri desktop app.

Dispatch Panel Interface

Dispatchers can monitor channels, transmit voice, trigger alerts, manage units, and patch frequencies.


Accessing the Panel

Desktop App (recommended)Web Browser
InstallDownload from Settings or /radio/dispatch/installerNone
MicrophoneAuto-grantedRequires HTTPS or a Chrome flag
PTTAny key or mouse button, global captureT only, no global capture
UpdatesAuto-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:

MethodUse Case
Chrome flagDevelopment / local testing. Set chrome://flags/#unsafely-treat-insecure-origin-as-secure to your server URL. Guide
HTTPS reverse proxyProduction. 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:

config.lua
dispatchNacId = "141",  -- Change this to a secure value

Discord 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/auth

If 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):

server/.env
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 proxy

Getting 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

  1. Login with Discord → panel POSTs /radio/dispatch/auth with callsign, gets a pending session + Discord authorize URL
  2. User consents on Discord, which redirects back to /radio/dispatch/auth with an auth code
  3. Server exchanges the code, validates the user is in DISCORD_GUILD_ID and (if set) has a matching role in DISCORD_ROLES
  4. 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/reauth on 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

Dispatch Alert

  • 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.

Frequency Patch Interface
  • 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

SettingDescription
PTT KeyKey or mouse button for push-to-talk
SFX VolumeVolume for alert tones and UI sounds
Voice VolumeVolume for incoming voice transmissions
ThemeVisual theme for the panel
Transmission LogToggle and filter the TX log
Auto-collapse ChannelsCollapse empty channels automatically
EndpointServer URL (desktop app only)

On this page

Need help?

Ask on Discord