What's Changed
🏗️ Features
- feat(settings): add 2.8 amateur and EU Lite/Narrow LoRa regions by @jamesarich in #6548
- feat(takserver): surface mesh nodes to ATAK as CoT contacts (mesh-to-CoT) by @jamesarich in #6554
- feat: distinguish saved coverage estimates in the map layers sheet by @jamesarich in #6578
- Align Android message status wording by @RCGV1 in #6133
- feat(settings): export the node database as JSON by @jamesarich in #6610
- feat(tak): show local server status by @RCGV1 in #6599
- feat(messaging): add optional full message timestamps by @simulationstation in #6639
- feat(settings): warn before enabling licensed (ham) mode by @jamesarich in #6632
- perf(startup): move WorkManager and AppFunctions init off the main thread by @jamesarich in #6648
- feat(analytics): report key user interactions as named RUM actions by @jamesarich in #6654
- feat(node): surface incomplete nodes with a badge and show them by default by @jamesarich in #6673
- refactor(maps): share custom tile providers by @simulationstation in #6641
- feat(demo): make Demo Mode reachable and populated in release builds by @jamesarich in #6691
🖥️ Desktop
- fix(desktop): stop SIGSEGV on every Linux notification by @jamesarich in #6543
- fix(desktop): free the GError and release libnotify on shutdown by @jamesarich in #6544
- fix(desktop): restore BLE scanning and connecting in packaged builds by @jamesarich in #6558
- fix(service): stop blocking getString on Dispatchers.Default-reachable notification paths by @jamesarich in #6668
- fix(messaging): disambiguate sender-scoped packet IDs by @simulationstation in #6624
- fix(connections): hide the replay demo entry when its capture asset is absent by @jamesarich in #6692
🛠️ Fixes
- fix(ui): give rx_snr real presence semantics end to end by @jamesarich in #6523
- fix(debug): restore node ID hex annotations broken by the Wire migration by @jamesarich in #6532
- fix(nodes): suppress alerts during initial database sync by @jeremiah-k in #6538
- fix(ble): pause background RSSI polling by @jeremiah-k in #6539
- fix(database): recover wedged observer pools by @jeremiah-k in #6540
- fix(docs): publish only screenshots a synced page references by @jamesarich in #6557
- fix(icons): differentiate google/fdroid debug launcher icons by @jamesarich in #6564
- fix(tak): re-encode bundled .p12 certs with legacy PKCS#12 algorithms for Android ≤ 9 ATAK compatibility by @jamesarich in #6569
- fix: Site Planner map/camera parity with iOS by @jamesarich in #6577
- fix(service): unwedge the inbound pipeline behind stale-Connected zombies by @jamesarich in #6587
- fix(map): scope location tracking to the visible lifecycle by @simulationstation in #6602
- fix(konsist): normalize source paths on Windows by @simulationstation in #6604
- fix(map): reuse cluster items across camera recompositions by @simulationstation in #6605
- fix(fdroid): ship 16 KB-compatible GeoPackage SQLite by @simulationstation in #6606
- fix(tak): gate V2 packets on known firmware by @RCGV1 in #6600
- fix(messaging): wait for shared-contact routing ACK by @simulationstation in #6603
- fix(build): sign debug builds with a shared checked-in keystore by @jamesarich in #6615
- fix(ci): unbreak the merge queue on Gradle 9.6.1 by @jamesarich in #6636
- fix(ui): add MQTT context to channel uplink/downlink toggle labels by @jamesarich in #6614
- fix(i18n): localize emoji picker strings by @jamesarich in #6628
- fix(database): delete nodes and metadata atomically by @simulationstation in #6623
- fix(ci): sync Flatpak Gradle distribution by @simulationstation in #6625
- fix(mqtt): isolate overlapping client sessions by @simulationstation in #6616
- fix(data): stop "1 hour" log retention from wiping the MeshLog table by @jamesarich in #6635
- fix(node): chart environment metrics in the user's display units by @jamesarich in #6634
- fix(messaging): time out orphaned "Sending..." messages into a retryable failure by @jamesarich in #6630
- fix(ui): stop emoji picker clipping text at large font scales by @jamesarich in #6631
- fix(service): await persisted device before boot reconnect by @simulationstation in #6617
- fix(node): stop compass updates while backgrounded by @simulationstation in #6620
- fix(service): load persisted MeshLog cleanup policy by @simulationstation in #6621
- fix(usb): validate permission callbacks by @simulationstation in #6622
- fix(settings): refresh delayed remote public keys by @simulationstation in #6638
- fix(ui): locale-aware unit formatting and message-view font scaling (design audit) by @jamesarich in #6629
- fix(android): preserve shared text in deep links by @simulationstation in #6619
- fix(test): isolate androidApp unit tests from the production Application by @jamesarich in #6644
- fix(settings): show REDACTED for a remote node's withheld private key by @jamesarich in #6649
- fix(ui): surface watchdog-forced reconnects in the nav connection icon by @jamesarich in #6655
- fix(ble): enable Kable preConflate to prevent scan-callback ANRs by @jamesarich in #6652
- fix(ui): restore bottom time-axis height at large font scales by @jamesarich in #6656
- fix(telemetry): repoint 1-Wire temperature at per-channel fields, adopt ADC voltage by @jamesarich in #6653
- fix(analytics): cover local firmware sideloads and report message_send in the foreground by @jamesarich in #6660
- fix(database): bound withDb execution so one wedged callback can't stall every write by @jamesarich in #6661
- fix(konsist): anchor path rules to the scanned checkout root so the commonMain guard isn't vacuously green in agent worktrees by @jamesarich in #6665
- fix(database): recover from Room's silent connection-pool wedge (#6608) by @jamesarich in #6658
- fix(settings): restore channels from device profiles by @simulationstation in #6618
- fix(map): open Site Planner for the selected node by @simulationstation in #6640
- fix(map): allow layers with generic MIME types by @ayysasha in #6663
- fix(ui): move event firmware branding off the app bar by @jamesarich in #6676
- fix(lora): validate 2.4 GHz bandwidth options by @RCGV1 in #6529
- fix(build): track compose-multiplatform's actual version in the flatpak arm64 force-resolve by @jamesarich in #6694
- fix(build): declare navigationevent-compose explicitly, fixing Dokka's metadata compile by @jamesarich in #6698
- fix(notifications): stop repeated protected position alerts by @ayysasha in #6700
📝 Other Changes
- refactor(compose): adopt keyed SideEffect and drop redundant config write-back effects by @jamesarich in #6684
New Contributors
- @clayburn made their first contribution in #6531
- @simulationstation made their first contribution in #6602
- @ayysasha made their first contribution in #6663
Full Changelog: v2.8.0...v2.8.1-internal.3