github Thinline-Dynamic-Solutions/ThinLineRadio v26.08.21
ThinLine Radio 26.08.21

5 hours ago

Version 26.08.21 - Released August 21, 2026

Added

  • Admin — live listeners roster (#270)

    • Operations → Listeners shows live WebSocket sessions grouped by user (anonymous bucket included), with multi-device counts and ~5s refresh.
    • Users table shows a Listening chip when an account is online.
  • Admin — Systems list and reorder (#282)

    • Systems opens a searchable list instead of jumping into the first system.
    • Drag-and-drop and Sort A–Z persist via PUT /api/admin/systems/order; order-only saves no longer clear unsaved system field edits.
  • Playback — multi-talkgroup filters and duration (#275)

    • Archive search can multi-select talkgroups on one system; results include a Duration column.
    • System / talkgroup / group / tag pickers use a scrollable LCD dialog with filter (replacing viewport-clipped menus).
  • Playback — unit alias display (#280)

    • Now-playing, recent, and archive show units as alias | radio ID (or ID alone) and keep live unit updates in sync across multi-source calls.

Changed

  • Client — Angular application builder

    • Migrated from deprecated @angular-devkit/build-angular:browser (Webpack) to @angular/build:application (esbuild).
    • Kept outputPath.browser empty so production assets still land in server/webapp for Go embed/Docker.
  • Client — Sass module imports

    • Replaced deprecated Sass @import with @use / @forward for shared tokens, mixins, and global styles; Google Fonts load via index.html instead of Sass @import url.
  • Admin Users — status chips and group column (#269)

    • PIN column removed from the table; PIN / account expiry and other states show as status chips.
    • Group column sits closer to User so Status has room; group name comes from GET /api/admin/users as userGroupName (no wait on a second /groups call); redundant Group Admin badge removed.
  • Ingest — per-system Auto Populate (#277)

    • Talkgroups auto-create only when that system’s Auto Populate is on; global Auto Populate still creates unknown systems only.

Fixed

  • Auth — Turnstile widget lifecycle (#259)

    • Shared RdioScannerTurnstileComponent + script service; login, registration, and group-admin each own a widget with distinct actions (user_login, user_registration, group_admin_login).
    • Email-verification → full registration form remounts Turnstile so Sign Up is no longer stuck disabled.
    • Invitation CAPTCHA skip uses server access-code type (not format guessing); Sign Up no longer checks a nonexistent invitationCode control.
    • Signup email OTP is consumed only after account creation succeeds (CAPTCHA failure no longer burns the code).
    • Siteverify uses an HTTP timeout and checks action/hostname; enabling Turnstile without both keys is rejected.
  • Docker / CI — Node pin for Angular 22

    • Client build stage and workflow now use Node 22.23 (Angular CLI requires ≥22.22.3); node:22.12 was failing npm run build with exit code 3.
  • Duplicate detection — arrival-time cache (#278)

    • Keeps arrival-time-only dedup (no PCM hash / radio timestamp restore).
    • Cache no longer slides its 1s window on hits; similar audio duration is required so busy talkgroups are not sticky-blocked.
  • Alert preferences — tone alerts stuck on “Admin must enable” (#272)

    • With bulk tone detection off, leftover bulk tag IDs no longer force-clear per-talkgroup toneDetectionEnabled on every system save.

Don't miss a new ThinLineRadio release

NewReleases is sending notifications on new releases.