This guide covers every panel in the OpenScanner admin dashboard — what each setting does, how panels work, and how to configure your system.
The admin dashboard is at /admin and requires signing in with an admin account.
- Navigation
- Activity
- Users
- Systems
- Groups & Tags
- API Keys
- Monitors (Directory Monitors)
- Downstreams
- Shared Links
- Transcription
- Options
- Logs
- Tools
The sidebar contains these panels, in order:
- Activity — dashboard overview and stats
- Users — manage user accounts
- Systems — manage systems, talkgroups, and units
- Groups & Tags — organize talkgroups into categories
- API Keys — manage recorder upload keys
- Monitors — set up directory-based call import
- Downstreams — forward calls to other OpenScanner instances
- Shared Links — view and manage shared call links
- Transcription — configure speech-to-text
- Options — general settings and behavior
- Logs — view server logs
- Tools — import, export, and maintenance
The Scanner link in the sidebar returns you to the live scanner at /. Sign Out clears your session. If you have unsaved changes in a panel, you'll be prompted before navigating away.
The Activity panel gives you a quick overview of your system:
- Calls Today — number of calls ingested today
- This Week — calls over the last 7 days
- Total Calls — all-time call count
- Active Listeners — currently connected scanner clients
- Server Uptime — how long the server has been running
- 24-Hour Activity Chart — visual breakdown of call volume by hour
- Top Talkgroups — most active talkgroups
Manage who can access OpenScanner.
Each user has:
| Field | Description |
|---|---|
| Username | Login name |
| Password | Set on create; leave blank when editing to keep unchanged |
| Role | Admin (full access) or Listener (scanner only) |
| Disabled | Temporarily block access without deleting the account |
| Expiration | Optional date after which the account is locked out |
| Connection Limit | Optional cap on simultaneous sessions for this user |
| System Selection | Optional — restrict which systems/talkgroups this user can hear |
The first admin account cannot be disabled.
Systems represent your radio systems (e.g. a county trunked system, a conventional channel group). Each system contains talkgroups and units.
- Label — display name shown in the scanner
- Order — controls display position (lower numbers appear first)
- TG Auto-Populate — when enabled, talkgroups are automatically created from incoming calls for this system. If the incoming call includes additional metadata (talkgroup name, label, group, tag, or unit information), those are created or updated automatically as well.
Each talkgroup has:
| Field | Description |
|---|---|
| Talkgroup ID | Numeric identifier matching your recorder output |
| Label | Short display label (e.g. "FD Dispatch") |
| Name | Longer descriptive name |
| Frequency | Optional frequency in Hz |
| Group | Category grouping (from Groups panel) |
| Tag | Classification tag (from Tags panel) |
You can search talkgroups by ID, label, or name. Large lists are virtualized for performance.
Each unit has a Unit ID and Label. Units represent individual radios on a system. You can search by ID or label.
Groups and tags organize your talkgroups into categories.
- Groups categorize talkgroups by function (e.g. Fire, Law, EMS, Public Works)
- Tags provide finer classification (e.g. Law Dispatch, Law Tac, Fire Tac, Emergency Ops)
Both are simple label lists. Assign them to talkgroups in the Systems panel.
OpenScanner ships with sensible defaults (Air, Common, EMS, Fire, Interop, Law, Public Works for groups; ~20 tags covering law, fire, EMS, corrections, and more).
API keys authenticate recorders that upload calls to OpenScanner over HTTP.
Each key has:
| Field | Description |
|---|---|
| Fingerprint | Auto-generated unique identifier (read-only) |
| Label | Optional friendly name |
| Disabled | Temporarily stop accepting uploads from this key |
| Systems | Restrict which systems this key can upload to (empty = all) |
| Rate Limit | Optional per-key call rate limit (calls/minute); overrides the global default |
| Order | Display position |
Copy the full API key when creating it — it's shown once. See the Recorder Guide for how to configure your recorder with the key.
Directory monitors watch a local folder and automatically import call audio files. This is an alternative to API-based upload — useful when your recorder writes files to a shared directory.
Each monitor has:
| Field | Description |
|---|---|
| Directory | Folder path to watch (browseable from the UI) |
| Type | Recorder type: Default, DSDPlus, SDR-Trunk, or Trunk-Recorder |
| Mask | Filename pattern using tokens to extract metadata (see below) |
| Extension | File extension filter (e.g. wav, mp3) |
| Delay | Wait time in milliseconds before processing a new file (allows writes to complete) |
| Use Polling | Use polling instead of filesystem events (for network drives or mounts that don't support inotify) |
| Delete After | Remove the source file after successful import |
| System Override | Force all files to a specific system |
| Talkgroup Override | Force all files to a specific talkgroup |
| Frequency | Optional frequency override in Hz |
| Disabled | Temporarily stop watching |
| Order | Display position |
The mask extracts metadata from filenames. Available tokens:
#DATE, #TIME, #SYS, #TG, #HZ, #GROUP, #TAG, #UNIT
Example: a file named 2025-01-15_143022_101_5200.wav with mask #DATE_#TIME_#SYS_#TG would extract the date, time, system 101, and talkgroup 5200.
The UI includes a help section with the full token reference.
Note: Downstream forwarding is implemented but has not been tested. Use at your own risk.
Downstreams forward ingested calls to other OpenScanner instances. Use this to fan out from a central server to regional or public-facing instances.
Each downstream has:
| Field | Description |
|---|---|
| URL | Remote server's call-upload endpoint |
| API Key | Authentication key for the remote server |
| Systems | Restrict which systems to forward (empty = all) |
| Disabled | Temporarily stop forwarding |
| Order | Display position |
API keys are encrypted at rest in the database when an encryption key is configured. The admin UI never displays API keys — they are shown as masked dots. To change a key, enter a new one in the edit form; leave it blank to keep the existing key.
Lists all shared call links created by users. Each entry shows:
- System and talkgroup
- Call date and duration
- Who shared it and when
- Expiration date (or "Never")
You can delete shared links from here. Deleting a link makes the call eligible for normal pruning.
Shared link creation and expiry are controlled in Options → Sharing & Notifications.
Configure automatic speech-to-text for calls. Transcription uses a separate go-whisper sidecar service — see the Deployment Guide for setup instructions.
This panel shows a connection status indicator and provides these controls:
| Setting | Description |
|---|---|
| Transcription Enabled | Master on/off toggle |
| Live Transcript Display | Show transcription text in the live scanner player |
| Transcription URL | Address of the go-whisper server (default: http://localhost:8081) |
| Language | Target language or auto-detect (15 languages supported) |
| Diarize | Speaker identification — only available with -tdrz models |
Before transcription works, you need to download at least one model. The panel provides:
- Download — select from the list of available Whisper models and download
- Set Active — choose which downloaded model to use
- Delete — remove a downloaded model
The panel also shows transcription statistics when available.
General settings that control how OpenScanner behaves. Settings are organized into groups.
| Setting | Description | Default |
|---|---|---|
| Branding Label | Short text shown above the scanner (e.g. your county or project name) | (empty) |
| Support Email | Contact email displayed to users | (empty) |
| Public Access | Allow unauthenticated users to listen to the scanner | Off |
| Setting | Description | Default |
|---|---|---|
| Sort Talkgroups by ID | Sort talkgroup list by numeric ID instead of display order | Off |
| Allow Toggle by Tag | Let users filter the scanner feed by tag | Off |
| 12-Hour Time Format | Display times as AM/PM instead of 24-hour | Off |
| Show Listeners Count | Display the number of active listeners in the scanner | Off |
| Playback Mode Goes Live | Automatically switch from playback to live when caught up | Off |
| AFS Systems | Comma-separated system IDs that use AFS (Australian) talkgroup format | (empty) |
| Max Simultaneous Clients | Maximum number of WebSocket listeners allowed at once | 200 |
Settings marked with a "Planned" badge in the UI are persisted but not yet wired to runtime behavior. They will activate in a future release.
| Setting | Description | Default |
|---|---|---|
| Audio Conversion (FFmpeg) | Disabled / Enabled / Normalize / Loudnorm — controls audio processing on ingest | Disabled |
| Audio Encoding Preset | Codec and bitrate for converted audio (MP3 or AAC at various bitrates) | AAC-LC 32 kbps |
| Disable Duplicate Call Detection | Skip checking for duplicate calls on upload | Off |
| Duplicate Detection Time Frame (ms) | Window for matching duplicate calls (±milliseconds) | 500 |
| Prune Database After (days) | Auto-delete calls older than this many days (0 = never prune) | 7 |
| Search Patched Talkgroups | Include patched talkgroups in search results | Off |
| Preset | Description |
|---|---|
| MP3 32 kbps | Default MP3 quality |
| MP3 24 kbps | Lower bitrate MP3 |
| MP3 16 kbps | Smallest MP3 |
| AAC-LC 32 kbps | Default AAC quality |
| AAC-LC 24 kbps | Lower bitrate AAC |
| AAC-LC 16 kbps | Smallest AAC-LC |
| HE-AAC 12 kbps | High-efficiency AAC, very small files |
| HE-AAC 8 kbps | Smallest possible, lowest quality |
| Setting | Description | Default |
|---|---|---|
| Keypad Beep Style | Button press sound: Disabled, Uniden, or Whistler | Uniden |
| Setting | Description | Default |
|---|---|---|
| Shareable Links | Allow users to create shareable links to specific calls | Off |
| Shared Link Expiry (days) | How long shared links stay active (0 = never expire) | 0 |
View and search server logs in real time.
- Date Range — select a range or use quick shortcuts (last 1, 6, or 24 hours)
- Level — filter by debug, info, warn, or error
- Search — text search across log messages
- Limit — number of entries to load (200 / 500 / 1,000 / 2,500 / 5,000)
- Auto-Refresh — stream new log entries as they arrive via WebSocket
- Auto-Scroll — keep the view scrolled to the latest entry
- Refresh — manually reload logs
- Clear Filters — reset all filters to defaults
- Log Level — change the server's runtime log level (debug, info, warn, error) without restarting
HTTP request logs are color-coded by status: green for 2xx, gray for 3xx, yellow for 4xx, red for 5xx.
Each log row also shows short contextual chips next to the message for common events — for example call=1234 sys=7 tg=5200 dur=3400 for an ingested call, or downstream=2 call=1234 try=3 for a failed downstream push. Click a row to open a details panel with the full attribute list.
Utilities for bulk data management and maintenance.
- Import Talkgroups — upload a CSV to bulk-create or update talkgroups for a system. Choose between overwrite (update existing) or skip (keep existing) for duplicates.
- Import Units — same as above for unit records.
Both report how many records were inserted, updated, and skipped.
- Export Talkgroups — download all talkgroups (or filter by system) as CSV.
- Export Units — download all units (or filter by system) as CSV.
- Export Config — download the full server configuration as
openscanner-config.json. Useful for backups or migrating to a new server. If secrets encryption is enabled, exported values retain theirenc::encrypted form. - Import Config — restore configuration from a previously exported JSON file. If the backup contains encrypted values (
enc::prefix), the target server must have the same--encryption-keyconfigured. The import is rejected if no key is set or the key cannot decrypt the values.
Preview and apply talkgroup metadata from RadioReference. This lets you pull talkgroup names, groups, and tags from RadioReference data and merge them into your system.
Link to the Swagger API documentation at /api/admin/docs.