Releases: Thinline-Dynamic-Solutions/ThinLineRadio
v7.0.0 Beta 9.3 - Critical CASCADE DELETE Fix & Keyword List Preservation
Critical Bug Fixes
1. Fixed CASCADE DELETE Constraints (User Alert Preferences & FCM Tokens)
- Problem: Beta 9.2 migration only dropped CASCADE DELETE constraints but never recreated them
- Fixed: Migration now properly recreates foreign key constraints WITHOUT CASCADE DELETE
- Result: User alert preferences and FCM tokens now persist across all config save operations
2. Fixed Keyword List Orphaned IDs on Deletion
- Problem: Deleting keyword lists left orphaned IDs in user alert preferences
- Fixed: DELETE endpoint now removes all references before deleting keyword lists
- Result: No more orphaned keyword list IDs from manual deletions
3. Fixed Radio Reference Imports Wiping Keyword Lists
- Problem: Radio Reference imports were deleting ALL keyword lists and recreating them with new IDs
- Keyword lists are user-defined and have nothing to do with Radio Reference data
- Every RR import would wipe keyword lists, assign new IDs, and orphan all references
- Fixed: Radio Reference imports now completely skip keyword list processing
- Only full backup/restore operations (which include keywordListId in JSON) will replace keyword lists
- Result: Your keyword lists and their IDs are now preserved when importing from Radio Reference
Installation
Download the appropriate package for your platform and extract it. See the Installation Guide for details.
Upgrading from Beta 9.2
- Stop your Thinline Radio server
- Replace the executable with the new version
- Start the server - the migration will run automatically
- Verify in logs: "migrating user alert preferences and device tokens to remove CASCADE DELETE..."
- Test by importing a site from Radio Reference - your alert preferences and keyword lists should stay intact
Full Changelog: https://github.com/Thinline-Dynamic-Solutions/ThinLineRadio/blob/main/CHANGELOG.md
ThinLine Radio v7.0.0-beta9.2
ThinLine Radio v7.0.0-beta9.2
This is a beta release of ThinLine Radio version 7.0.
Installation
Download the appropriate package for your platform and architecture from the assets below.
Supported Platforms
- Linux: amd64, arm64, ppc64le, s390x, riscv64
- macOS: Intel (amd64), Apple Silicon (arm64), Universal
- Windows: amd64, arm64
- FreeBSD: amd64, arm64
- OpenBSD: amd64, arm64
- NetBSD: amd64, arm64
- Solaris/Illumos: amd64
Documentation
Refer to the SETUP.md file included in each package for detailed installation and configuration instructions.
Requirements
- PostgreSQL 12+
- FFmpeg (for audio processing)
- Sufficient disk space for audio files
For more information, visit the project repository.
Version 7.0.0-beta9.1
Version 7.0 Beta 9.1
Breaking Changes
- Push notifications migrated from OneSignal to Firebase Cloud Messaging (FCM)
- Scanner server now uses FCM tokens for push notifications instead of OneSignal player IDs
- Device registration endpoint updated to accept
fcm_tokenandpush_typefields - Legacy OneSignal tokens (
tokenfield) automatically fallback for backward compatibility - Test push notifications: Now use per-device sound preferences from database
- Platform-specific sound handling: iOS devices receive sound names without extensions; Android devices receive sound with
.wavextensions - Bug fix: Scanner server no longer overwrites platform-specific sounds - each platform (iOS/Android) now uses its own device's sound preference
- Files modified: server/push_notification.go
ThinLine Radio v7.0.0-beta9
Release Notes - v7.0.0-beta9
Major Bug Fixes
- Fixed talkgroup sorting persistence - Talkgroup order now properly persists across saves, page refreshes, and server restarts
- Fixed new talkgroups auto-enabling (GitHub #85) - New talkgroups/systems now default to disabled, requiring manual user activation
- Fixed system no-audio alerts foreign key error - System-generated alerts now properly use NULL for createdBy field
New Features
- Per-system no-audio alert configuration with simplified monitoring
- Per-talkgroup exclusion from preferred site detection
- Automatic site identification by frequency
- Advanced duplicate call detection with intelligent prioritization
- Enhanced Opus audio support with quality improvements
Improvements
- Multiple UI/UX enhancements across admin panel
- Improved audio normalization options (Conservative, Standard, Aggressive, Maximum)
- Better handling of over-modulated signals
See CHANGELOG.md for complete details.
Download the appropriate archive for your platform below.
Version 7.0.0 Beta 8
Change log
Version 7.0 Beta 8 - Released TBD
New Features
-
Universal dispatch tone removal for transcription
- Added automatic detection and removal of ALL dispatch tones before transcription (200-5000Hz range)
- Prevents Whisper hallucinations caused by two-tone sequential, quick call, and long tone paging systems
- Works on all audio regardless of whether tone detection is enabled for the talkgroup
- Detects sustained tones using FFT analysis with dynamic noise floor estimation
- Removes detected tone segments using ffmpeg while preserving voice audio
- Minimum tone duration: 500ms (catches all typical dispatch tones)
- Skips transcription if less than 2 seconds of voice audio remains after tone removal
- Provides detailed logging: detected tones with frequencies, durations, and removal status
- Significantly improves transcription quality by eliminating tone-induced hallucination phrases
- Files modified: server/tone_detector.go, server/transcription_queue.go
-
AssemblyAI word boost support for improved transcription accuracy
- Added word boost/keyterms feature for AssemblyAI transcription provider
- Allows administrators to provide a list of words or phrases to improve recognition accuracy
- Particularly useful for: unit names, technical terms, proper names, local terminology, call signs
- Configuration: Enter words/phrases in Admin UI (one per line) under Options → Transcription → AssemblyAI Word Boost
- Maximum 100 terms, each up to 50 characters
- Terms are automatically validated and filtered before being sent to AssemblyAI
- Only visible when AssemblyAI is selected as the transcription provider
- Files modified: server/options.go, server/transcription_provider.go, server/transcription_assemblyai.go, server/transcription_queue.go, client/src/app/components/rdio-scanner/admin/admin.service.ts, client/src/app/components/rdio-scanner/admin/config/config.component.ts, client/src/app/components/rdio-scanner/admin/config/options/options.component.html
-
Enhanced transcripts tab with filtering and search capabilities
- Added comprehensive filtering controls to the Transcripts tab in the Alerts UI
- Filter by system: Dropdown to filter transcripts by specific radio system
- Filter by talkgroup: Dropdown to filter transcripts by specific talkgroup (filtered by selected system)
- Filter by date range: Date inputs to filter transcripts by "From" and "To" dates
- Search functionality: Text search bar to find specific words or phrases within transcript text
- Search highlighting: Matching search terms are highlighted in yellow within displayed transcripts
- Clear filters button: Quick reset of all filter criteria
- Real-time filtering: Filters apply immediately as selections change
- Backend API enhancements: Added support for systemId, talkgroupId, dateFrom, dateTo, and search query parameters
- Proper systemRef/talkgroupRef resolution: Backend correctly resolves radio reference IDs to database IDs for filtering
- Files modified: server/api.go (TranscriptsHandler), client/src/app/components/rdio-scanner/alerts/alerts.component.ts, client/src/app/components/rdio-scanner/alerts/alerts.component.html, client/src/app/components/rdio-scanner/alerts/alerts.component.scss, client/src/app/components/rdio-scanner/alerts/alerts.service.ts
-
Whisper transcription worker optimization - single worker configuration
- Removed configurable worker pool size option for Whisper transcription
- Whisper API provider (local Whisper) now always uses exactly 1 worker
- Testing showed that using 1 worker eliminated all transcription failures
- Multiple workers were causing race conditions and failures with local Whisper
- Other transcription providers (Azure, Google, AssemblyAI) continue to use configurable workers
- Worker pool size UI field removed from Admin → Options → Transcription settings
- Files modified: server/transcription_queue.go, client/src/app/components/rdio-scanner/admin/config/options/options.component.html, client/src/app/components/rdio-scanner/admin/admin.service.ts
-
Configurable repeat alert timing for system health monitoring
- Added individual repeat interval settings for each alert type (Transcription Failures, Tone Detection Issues, No Audio Received)
- Administrators can now configure how often alerts repeat when issues persist
- Default values: 60 minutes for transcription and tone detection alerts, 30 minutes for no audio alerts
- Configuration available in Admin → System Health → Additional Settings column for each alert type
- Prevents alert spam by allowing customization of repeat frequency per alert category
- Files modified: server/options.go, server/defaults.go, server/admin.go, server/system_alert.go, client/src/app/components/rdio-scanner/admin/system-health/system-health.component.ts, client/src/app/components/rdio-scanner/admin/system-health/system-health.component.html, client/src/app/components/rdio-scanner/admin/admin.service.ts
-
Enhanced system alerts display with intelligent grouping and management
- Redesigned system alerts interface with professional category-based grouping
- Alerts are now organized by type: "No Audio Received", "Tone Detection Issues", "Transcription Failures", and "Other Alerts"
- Each group displays alert count badge for quick overview
- Removed technical clutter: System IDs, raw JSON data, and technical metadata hidden from display
- Individual alert dismissal: Each alert has a dismiss button (X icon) in the header
- Bulk dismissal: "Clear All" button for each alert group to dismiss all alerts in a category at once
- Confirmation dialogs: Prevent accidental dismissals with clear confirmations showing alert counts
- Success notifications: Snackbar feedback when alerts are dismissed (individual or bulk)
- Improved visual hierarchy: Group headers with clear categorization, better spacing and organization
- Active alerts only: Statistics and displays only show non-dismissed alerts
- Enhanced description for No Audio monitoring: Updated to "Intelligent adaptive monitoring: Continuously analyzes historical audio patterns by time of day, learns normal activity baselines, and dynamically adjusts alert thresholds to reduce false positives while maintaining sensitivity to genuine issues"
- Files modified: client/src/app/components/rdio-scanner/admin/system-health/system-health.component.ts, client/src/app/components/rdio-scanner/admin/system-health/system-health.component.html, client/src/app/components/rdio-scanner/admin/system-health/system-health.component.scss, client/src/app/components/rdio-scanner/admin/admin.service.ts
-
Purge logs and calls from admin UI with selective deletion support
- Added purge functionality to Admin → Tools → Purge Data section
- Purge All: Delete all logs or all calls with triple confirmation (warning dialog, final confirmation, typed confirmation)
- Selective Delete: Search and filter logs/calls, then select specific items for deletion
- Logs Management: Search by date, level (info/warn/error), sort order; select individual items or batches
- Calls Management: Search by date, system, talkgroup, sort order; select individual items or batches
- Selection Options: "Select All on Page" (current 10 items), "Select All in Batch" (current 200 items), "Deselect All"
- Pagination support: Navigate through results while maintaining selections
- Confirmation dialogs: Requires confirmation before deleting selected items
- Visual feedback: Selected count displayed, success/error notifications
- Backend API:
/api/admin/purgeendpoint accepts{type: 'calls'|'logs', ids?: number[]}for selective or bulk deletion - Admin authentication required with localhost restriction (same as other admin endpoints)
- Files modified: server/call.go, server/log.go, server/admin.go, server/main.go, client/src/app/components/rdio-scanner/admin/admin.service.ts, client/src/app/components/rdio-scanner/admin/admin.module.ts, client/src/app/components/rdio-scanner/admin/tools/purge-data/*
- Files added: client/src/app/components/rdio-scanner/admin/tools/purge-data/purge-data.component.ts, purge-data.component.html, purge-data.component.scss
Bug Fixes
- Fixed handling of unknown radio IDs from Trunk Recorder
- Trunk Recorder sends -1 for transmissions where the radio ID could not be determined (no value over the air or control channel)
- Previously, -1 was being converted to an unsigned integer (18446744073709551615), causing database insertion errors
- Error message: "bigint out of range (SQLSTATE 22003)" when attempting to insert call units
- Solution: Added validation to skip negative source IDs before converting to unsigned integers
- Unknown transmissions (src: -1) are now gracefully ignored instead of causing database errors
- Affects all parsing methods: Trunk Recorder srcList, generic sources/units, and unit field
- Files modified: server/parsers.go
Changes
-
Talkgroups with tone detection now transcribe short audio clips after tone removal
- Previously, calls with less than 2 seconds of audio remaining after tone removal were skipped
- Now, if a talkgroup has tone detection enabled, short clips are transcribed regardless of remaining duration
- This ensures important dispatch messages aren't missed even if they're brief after tones are removed
- Applies to both the pre-queue duration check and the transcription worker check
- Example: "RESPOND CODE 3" after tone removal might only be 1.5 seconds but is now transcribed
- Files modified: server/controller.go, server/transcription_queue.go
-
Removed emojis from all email subjects and body content to reduce spam marking
- Emojis are automatically stripped from all email subjects and body text (both HTML and plain text)
- Improves email deliverability by avoiding spam filt...
Version 7.0.0 Beta 7
Version 7.0.0 Beta 7
New Features
- Opus audio codec support for 50% storage savings - Implemented Opus audio encoding as an alternative to M4A/AAC format providing 50% storage reduction with same or better voice quality
- Opus migration tool - Database migration tool to convert all existing M4A/AAC/MP3 calls to Opus format with batch processing, dry run mode, and progress tracking
Bug Fixes
- Fixed keyword alerts not respecting alertEnabled preference - Keyword alerts now properly check both alertEnabled and keywordAlerts flags, matching tone alert behavior
See CHANGELOG.md for complete details.
ThinLine Radio v7.0.0 Beta 6
Version 7.0 Beta 6 - Released January 10, 2026
Bug Fixes
- Fixed invitation codes not working for user registration
- Fixed
ValidateAccessCodeHandlerchecking for incorrect status: was checking for "active" but invitations are created with "pending" status - Fixed
ValidateAccessCodeHandlerincorrectly treating unused invitations as used: database stores usedAt as 0 (not NULL), so added check for > 0 - Fixed registration form not appearing when clicking email invitation link: auth-screen component wasn't setting
codeValidated = trueafter successful validation - Users can now successfully register using invitation codes sent via email
- Added comprehensive logging throughout invitation validation flow for easier debugging
- Files modified: server/api.go, client/src/app/components/rdio-scanner/auth-screen/auth-screen.component.ts, client/src/app/components/rdio-scanner/user-registration/user-registration.component.ts
- Addresses issue where fresh invitation codes were incorrectly reported as "already used"
- Fixed
Installation
Download the appropriate package for your platform and follow the README included in each distribution.
Platform Support
- Linux: amd64, arm64, ppc64le, s390x, riscv64
- macOS: Intel (amd64), Apple Silicon (arm64), Universal
- Windows: amd64, arm64
- BSD: FreeBSD, OpenBSD, NetBSD (amd64, arm64)
- Solaris/Illumos: amd64
For detailed setup instructions, see the SETUP.md file included in each distribution package.
Version 7.0 Beta 5
ThinLine Radio v7.0 Beta 5
This release includes Whisper prompt support, major tone detection improvements for analog conventional channels, and all bug fixes from the previous beta cycle.
Major Features
- Custom Whisper transcription prompts for improved accuracy with radio-specific terminology
- Major tone detection improvements for analog conventional channels
- Dynamic noise floor estimation (20th percentile method)
- Parabolic peak interpolation for sub-bin accuracy (±3.9 Hz → ±0.5 Hz)
- Force-split detection with lookahead for frequency drift
- Bandpass filtering (200-3000 Hz) and dynamic normalization
- Increased frequency merging tolerance (±15 Hz → ±20 Hz) for analog drift
- Note: Tone detection is still in BETA - improvements based on theory, not fully tested on analog channels by dev team (all digital systems)
Bug Fixes
- Fixed talker alias ingestion
- Fixed talkgroup sorting persistence
- Added admin-configurable tag colors
- Fixed P25 Phase II simulcast patch calls
- Fixed template compilation errors
Credits
Tone detection techniques inspired by icad_tone_detection by thegreatcodeholio (Apache 2.0 License)
See CHANGELOG.md for full details.
Community Testing Welcome
We encourage community testing and feedback on the tone detection improvements, especially for analog conventional channels.
Thinline Radio v7.0.0 Beta 4
More Bug Fixes, Check the Changelog for any info.
Thinline Radio v7.0.0 Beta 3
Check the Change Log for Improvements