MeshCore Ninja Alpha
MeshCore Wardrive

MeshCore Wardrive · Releases

from GitHub · updated 2026-06-23

20 releases

  1. v1.0.40 # 15 days ago · 2026-06-09 00:04 UTC

    Changelog

    v1.0.40 - 2026-06-09

    Added

    • Device Tracking & Comparison: The app now logs which LoRa companion device (by Bluetooth ID and name) you use for each wardrive session. View all paired devices and their performance stats in the new Device Comparison screen (Settings → Data Management). Compare two devices side-by-side: success rate, fail rate, total pings, unique cells, avg response time, avg SNR, and avg RSSI.
    • Dead Zone Alert Toggle: New setting to enable/disable the "Entering known dead zone" notification
    • New Repeater Alert Toggle: New setting to enable/disable the new repeater discovery notification

    Fixed

    • New Repeater Discovery Alert: Now only fires for repeaters that have truly never been seen before in the database. Previously the in-memory set reset on every app restart, causing false "new" alerts. Known repeater IDs are loaded from sample history on startup.

    Technical

    • Database version 11 → 12: new devices table, new device_id column on samples
    • LoRaCompanionService: captures connected device ID (BT remoteId for Bluetooth, product name for USB)
    • All ping samples (distance, time, and carpeater) tagged with device_id
    • DatabaseService: device CRUD, per-device stats queries (success rate, avg SNR/RSSI/response time, unique cells)
    • New device_comparison_screen.dart with device cards and side-by-side comparison table
    • SettingsService: deadZoneAlertsEnabled and newRepeaterAlertsEnabled toggles
  2. v1.0.39 # 16 days ago · 2026-06-08 00:24 UTC

    Changelog

    v1.0.39 - 2026-06-08

    Added

    • Multiple Ignore Repeaters: Comma-separated list support for ignoring multiple repeater prefixes at once
    • Live Notification Stats: Foreground notification now shows real-time success rate, ping count, and distance (e.g., ✅ 85% | 📍 247 pings | 🛣️ 12.3mi)
    • Repeater Contacts in JSON Export: Discovered repeaters now included in unified JSON exports
    • Privacy Zones: Define circular exclusion areas on the map — data inside zones is stripped from uploads and exports. Long-press to add, manage via Settings menu
    • New Repeater Discovery Alert: Sound + snackbar notification when a never-before-seen repeater is discovered during wardriving
    • Dead Zone Alerts: Vibration + snackbar warning when entering a previously-mapped dead zone (throttled to once per cell per session)
    • Battery Saver Mode: Automatically doubles ping interval when device battery ≤20%, restores at >30%. Shows orange "🔋 Saver" badge in control panel
    • Coverage Redundancy View: New "Redundancy" color mode showing repeater count per cell (green=3+, yellow=2, orange=1)
    • Coverage Score: New Score tab in Analytics — single shareable number computed from uniqueCells × successRate × freshness with letter grade (S/A/B/C/D)
    • Wardrive Achievements: 14 milestone badges (First Ping, Kilopinger, Road Warrior, Mesh Master, etc.) with unlock notifications and dedicated Achievements screen
    • Repeater Downtime Detection: Repeater Health screen now flags repeaters not seen in 7+ days (with 10+ total pings) with offline icon and day count
    • Quick Settings Gesture: Double-tap the tracking FAB to show a floating overlay with ping distance, timeout, and mode dropdowns for quick adjustments

    Technical

    • Database version 10 → 11: new privacy_zones table
    • New achievement_service.dart with SharedPreferences-based badge tracking
    • New achievements_screen.dart with progress bar and unlock history
    • Added battery_plus dependency for device battery monitoring
    • DatabaseService: added isDeadZoneCell(), privacy zone CRUD, export with repeaters
    • LocationService: dead zone stream, battery saver stream, battery monitoring lifecycle
    • AggregationService: new redundancy color mode branch
    • Analytics: new Coverage Score tab with share button, 5-tab bottom nav
    • Repeater Health: isOffline/daysSinceSeen fields, offline badge in app bar
  3. v1.0.38 # 2 months ago · 2026-04-28 23:08 UTC

    Changelog

    v1.0.38 - 2026-04-28

    Added

    • Planned Repeater Markers: Long-press anywhere on the map to place a marker for a potential repeater location. Add an optional label, tap to view details or delete. Markers persist in the database.
    • Delete Mode: Remove bad data before uploading. Activate from Data Management menu, then tap a coverage square to delete all samples in that cell, or tap individual sample dots to remove one at a time. Red banner shows when active.
    • Planned Repeaters menu entry: Shows marker count with option to clear all markers

    Fixed

    • Show Successful Pings Only toggle: Was incorrectly writing to map rotation setting instead of the filter. Now works correctly and persists across restarts.

    Technical

    • Database version 9 → 10: new planned_markers table
    • DatabaseService: added marker CRUD methods, deleteSample(), deleteSamplesByGeohash()
    • SettingsService: added showSuccessfulOnly persistence + export key
    • Map long-press handler for marker placement
    • Delete mode routing in sample and coverage tap handlers
  4. v1.0.37.1 # 3 months ago · 2026-04-10 01:12 UTC

    Changelog

    v1.0.37.1 - 2026-04-10

    Fixed

    • Coverage gaps eliminated: Removed _pingInProgress guard from distance-based pings, restoring v1.0.33 behavior. Distance pings now fire immediately on every threshold trigger, allowing overlapping pings for dense coverage. Each ping uses a unique discovery tag so responses correlate correctly.
    • Rate limit fully removed: No artificial delay between pings — _pingInProgress is only used for time-based ping deduplication, not distance pings.
  5. v1.0.37 # 3 months ago · 2026-04-09 00:03 UTC

    Changelog

    v1.0.37 - 2026-04-08

    Fixed

    • Coverage gaps eliminated: Rate limit reduced from 30s to 5s — at 50m distance pings, coverage squares are now continuous with no large gaps
    • Coverage resolution setting: Changing precision now properly invalidates the aggregation cache and rebuilds the map
    • Web map wrong success rates: GPS-only samples (no ping attempted) are now filtered from uploads — previously they inflated failure counts on the live map
    • Prediction rings blocking taps: Rings now render behind coverage squares and repeater icons so they don't intercept touch events
    • Lock rotation persistence: Map rotation lock setting now persists across app restarts

    Added

    • Ping time interval 5s and 10s options: Time-based ping interval dropdown now includes 5s and 10s for more aggressive coverage in "Both" mode

    Improved

    • Map performance when zoomed in: Auto-follow throttled to every 2 seconds (was every GPS update ~1/sec), distance/speed updates no longer trigger full map rebuilds, and the 5-second refresh skips setState entirely when nothing changed
    • Carpeater message passthrough: Confirmed that received/sent messages work while in carpeater mode (by design — logged into the repeater)

    Technical

    • Auto-follow uses _autoFollowInterval throttle to reduce _mapController.move() calls
    • Distance/speed stream listeners update values silently without setState
    • _loadSamples no-change path compares all state fields before calling setState
    • Upload service filters pingSuccess == null samples in both single and multi-endpoint paths
    • Web map samples.js also skips GPS-only samples in aggregateSamples()
  6. v1.0.36 # 3 months ago · 2026-04-06 03:19 UTC

    Changelog

    v1.0.36 - 2026-04-06

    Fixed

    • Carpeater stale neighbours: Neighbour table is now cleared before each discovery cycle. Previously the repeater returned cached neighbours from its home location even when driving far away, causing false green coverage squares.
    • Empty gray coverage boxes: Coverage cells with only GPS-only samples (no pings) are no longer rendered. Eliminates the gray boxes that appeared between ping samples, especially at short distance intervals.
    • Settings export: Now offers Save to Folder or Share options (was share-only)
    • Ping timing reverted: Discovery timeout back to 20s default, rate limit back to 30s (v1.0.33 behavior) to reduce false dead zones from aggressive timeouts

    Added

    • Session restore on import: JSON exports now include session history alongside samples. Importing restores both — no more losing session records on reinstall. Backward compatible with old export files.
    • Carpeater cycle interval "None": New option for back-to-back discovery cycles with zero gap between them

    Improved

    • Carpeater settings UI: renamed "Discovery Interval" to "Cycle Interval" with descriptive subtitle
    • Data import handles both new unified format ({samples, sessions}) and legacy format (plain sample array)
    • Import shows session count in result message when sessions are restored

    Technical

    • WSession model: added toJson()/fromJson() for session serialization
    • DatabaseService: new exportAllData() and importAllData() methods for unified export/import
    • AggregationService: filters out coverage cells where all samples are GPS-only (pingSuccess == null)
    • CarpeaterService._runDiscoveryCycle(): calls _clearPreviousNeighbours() before each discovery
  7. v1.0.35 # 3 months ago · 2026-04-02 02:48 UTC

    Changelog

    v1.0.35 - 2026-04-02

    Added

    • Multi-Device Wardrive: Merge coverage data from multiple users into one map
      • source field on samples identifies which device/operator collected the data
      • Device Name setting in Settings for tagging your exports
      • Multi-file import with merge summary dialog (shows source, count, overlap)
      • Filter by Source in Data Management to view data from a specific contributor
    • Repeater Health Dashboard: Dedicated per-repeater analysis screen
      • List view with sortable repeater cards (reliability, response time, ping count, alerts first)
      • Degradation alerts: warning icon when 7-day success rate drops >15% vs 30-day average
      • Tap-to-drill-down detail page per repeater:
        • SNR over time line chart
        • Weekly success rate bar chart
        • Best/worst time of day breakdown
        • Last 20 ping results history
      • Alert count chip in app bar
    • Settings Export/Import: Backup and restore all app preferences as JSON
      • Export via share sheet (includes upload endpoints, carpeater config, display settings)
      • Import with confirmation dialog — wardrive data is not affected
      • Useful for reinstalls and sharing configs with MeshCore communities
    • Carpeater Mode (Beta) label with v1.14+ firmware requirement hint
    • Manual ping sound/vibration feedback — matches auto-ping behavior

    Fixed

    • Device position command: CMD_SET_POSITION was using code 20 (battery request) instead of 14 (lat/lon) — pings now route correctly through the mesh
    • Auto-ping lock: _pingInProgress flag could get stuck permanently, blocking all future auto-pings (now uses finally block)
    • Carpeater toggle mid-tracking: Enabling/disabling carpeater in settings now properly starts/stops the service and resumes auto-ping
    • Session history filter: Selecting a session no longer fails to update the map (aggregation cache bypass)
    • Carpeater self-filtering: Target repeater automatically excluded from neighbour results (no need to add to ignore list)
    • USB disconnect detection: Pulling USB cable now properly disconnects and disables auto-ping (mirrors Bluetooth handler)
    • Stream controller leak: _disconnectController now closed in dispose()
    • SQLite WAL pragma: Fixed executerawQuery for Android compatibility

    Improved

    • Sound: Switched from STREAM_NOTIFICATION to STREAM_MUSIC for reliable audio playback
    • Vibration: Uses USAGE_ALARM VibrationAttributes to bypass Samsung touch vibration setting
    • Sound and vibration enabled by default for new installs
    • Ping timing: Rate limit reduced from 30s to 5s, default discovery timeout from 20s to 8s
    • Both mode dedup: Time-based pings skip if a distance ping fired recently
    • Aggregation caching: Skips full recomputation when sample/repeater count unchanged
    • SQLite WAL mode for better concurrent read/write during wardriving
    • Ping rate limit enforced: Actually waits cooldown instead of just logging
    • Advertisement map cleanup: Stale entries pruned every 5 minutes
    • Upload JSON deduplicated: Extracted shared _samplesToJson() method

    Technical

    • Database version 8 → 9: new source column on samples with index
    • New repeater_health_screen.dart (~670 lines)
    • SettingsService extended with exportSettings()/importSettings() and device_name
    • LoRaCompanionService: added _handleUsbDisconnection(), ignoredRepeaterPrefix getter, advert cleanup
    • MeshCoreProtocol: CMD_SET_ADVERT_LATLON = 14 (was incorrectly CMD_SET_POSITION = 20)
    • Native MainActivity.kt: STREAM_MUSIC audio, USAGE_ALARM vibration attributes, debug logging
  8. v1.0.34 # 3 months ago · 2026-04-01 02:48 UTC

    Changelog

    v1.0.34 - 2026-04-01

    Added

    • Sound Feedback: System tones on ping sent, success (good/weak signal), and failure (toggleable in Settings)
    • Vibration Feedback: Haptic patterns for ping results with Android S+ compatibility (toggleable in Settings)
    • Native Android Feedback: Platform channel for ToneGenerator-based tones and Vibrator-based haptics
    • Ping-by-Time Mode: New ping trigger options — distance, time, or both (whichever threshold hits first)
    • Faster Carpeater Mode: Reduced discovery wait from 30s to 8s for v1.14+ repeaters (Carpeater Mode is still in testing, but functions)
    • Offline Map Tile Downloads: Download tiles for current view area with zoom range picker
    • Disconnect Stream: LoRaCompanionService exposes disconnect events for USB and Bluetooth
    • Auto-Ping Auto-Disable: Auto-ping and Carpeater automatically stop on device disconnect

    Improved

    • Sound and vibration feedback enabled by default
    • Carpeater service hardened: safer stop logic, _isStopped guard, improved retry counts and delays
    • Map screen performance: conditional re-aggregation only when sample/repeater counts change, repeater deduplication
    • Upload service refactored: extracted _samplesToJson helper, cleaner JSON construction

    Technical

    • New SoundService with platform channel (mintylinux.wardrive/feedback) for native audio/haptic feedback
    • New TileDownloadService for offline tile management
    • Added VIBRATE permission to AndroidManifest
    • Protocol constant renamed: CMD_SET_POSITIONCMD_SET_ADVERT_LATLON
    • MainActivity.kt extended with ToneGenerator and Vibrator support
  9. v1.0.33 # 3 months ago · 2026-03-29 21:03 UTC

    Changelog

    v1.0.33 - 2026-03-29

    Added

    • Carpeater Mode ( BETA) (contributed by @overkillfpv): "Car Repeater" wardrive mode (Repeater Firmware 1.14 or higher required)
      • Instead of pinging directly, log into a target repeater and use it to discover neighbors
      • Configure target repeater ID, admin password, and discovery interval in Settings
      • Automatic login with 3x retry, discovery cycle with neighbour table clear/fetch
      • GPS position snapshotted at moment of discovery for accurate geotagging
      • Each discovered neighbour saved as a sample with SNR data
      • Empty responses recorded as dead zones (failed samples)
      • Auto-reconnect after 3 consecutive failed cycles
      • Discovery wait respects stop signal (no 30s hang on stop)
      • Status badge in control panel showing Carpeater state
      • Password field uses obscured text input
      • Auto-ping suppressed when Carpeater mode is active
    • Fixed App Icon: Cropped to proper 1024x1024 square from banner image

    Technical

    • New CarpeaterService with state machine, retry logic, and cycle tracking
    • Extended MeshCoreProtocol with Carpeater commands: login, CLI, binary request, neighbour parsing
    • Extended LoRaCompanionService with pubkey cache, Carpeater callback routing, and send methods
    • Updated push code constants to match current MeshCore firmware (with legacy aliases for compatibility)
    • LocationService integrates Carpeater alongside existing ducting monitoring
    • Carpeater settings persisted via SharedPreferences
  10. v1.0.32 # 3 months ago · 2026-03-25 02:14 UTC

    Changelog

    v1.0.32 - 2026-03-25

    ⚠️ IMPORTANT: Reinstall Required

    The APK signing key has changed in this release. Android will reject an in-place update with INSTALL_FAILED_UPDATE_INCOMPATIBLE. You must uninstall the previous version before installing v1.0.32.

    Before updating:

    1. Open the app and go to Settings → Export Data to back up your samples
    2. Uninstall the old version (adb uninstall mintylinux.meshcore.wardrive or via Android Settings)
    3. Install v1.0.32
    4. Go to Settings → Import Data to restore your samples

    Added

    • Analytics Screen: New dedicated analytics hub accessible from Settings → Data Management → Analytics
      • Time-of-Day Breakdown: Bar chart showing ping success rate by hour (0-23)
        • Color-coded bars: green (>70%), yellow (30-70%), red (<30%)
        • Best/worst hour summary and period breakdown (morning/afternoon/evening/night)
      • Coverage Goal Tracker: Set a target area and track wardriving progress
        • Pick center point (current GPS) + radius (1, 5, 10, or 25 miles)
        • Circular progress ring showing % of geohash cells covered
        • Breakdown: covered, partial (<30%), uncovered, pings in area
        • Goal persists between app restarts
      • Coverage Comparison: Compare two wardrive sessions side-by-side
        • Pick Session A (baseline) and Session B (compare)
        • Stats with delta arrows: samples, success rate, repeaters, distance
        • Coverage cell changes: new, lost, improved (>10%), degraded (>10%), unchanged
      • Repeater Reliability Scores: Per-repeater health metrics
        • Response rate, average response time, consistency score (stddev)
        • 7-day trend: improving/stable/degrading (compares last 7 days vs prior 7 days)
        • First/last seen dates, total ping count
        • Sortable by reliability, response time, or ping count
    • Atmospheric Ducting Monitor: Detect anomalous radio propagation conditions
      • Fetches pressure-level atmospheric data from Open-Meteo API (free, no key)
      • Computes radio refractivity gradient between surface and 925hPa
      • Classifies ducting risk: None (normal), Possible (super-refraction), Likely (trapping)
      • Offline-first: caches hourly data in SQLite, valid for 6 hours without network
      • Tags each sample with ducting risk level during collection
      • Color-coded badge in control panel shows live ducting status
      • Ducting risk shown in sample info popup
      • Toggle in Settings: "Atmospheric Ducting" (off by default)
    • Prediction Ring Whitelist: Coverage prediction rings now respect the "Include Only Repeaters" whitelist filter
      • When a repeater whitelist is set, only whitelisted repeaters show prediction rings
    • New App Icon: Updated launcher icon

    Technical

    • Database version 7 → 8: new ducting_cache table, ducting_risk column on samples
    • New DuctingService with ITU radio refractivity formula and Open-Meteo integration
    • New AnalyticsScreen with fl_chart bar charts and geohash-based coverage goal math
    • ductingRisk field added to Sample model (included in JSON/CSV/GPX/KML exports)
    • Coverage goal settings (goal_center_lat, goal_center_lon, goal_radius_meters) in SharedPreferences
    • LocationService integrates ducting: fetch on tracking start + hourly timer, runtime toggle
    • _buildPredictionRingsLayer() now filters by _includeOnlyRepeaters whitelist
  11. v1.0.31 # 4 months ago · 2026-03-08 04:38 UTC

    v1.0.31 - 2026-03-08

    ⚠️ IMPORTANT: Reinstall Required

    The APK signing key has changed in this release. Android will reject an in-place update with INSTALL_FAILED_UPDATE_INCOMPATIBLE. You must uninstall the previous version before installing v1.0.31.

    Before updating:

    1. Open the app and go to Settings → Export Data to back up your samples
    2. Uninstall the old version (adb uninstall mintylinux.meshcore.wardrive or via Android Settings)
    3. Install v1.0.31
    4. Go to Settings → Import Data to restore your samples
    5. This will be the last change that requires you to re-install. I promise.

    Added

    • Coverage Prediction Rings: Visualize estimated repeater coverage on the map
      • Concentric rings around each repeater based on actual ping sample distances
      • Green inner ring = strong coverage (25th percentile distance)
      • Yellow middle ring = moderate coverage (75th percentile)
      • Red outer ring = edge of coverage (max observed distance)
      • Requires at least 3 successful pings per repeater to display
      • Toggle in Settings: "Show Prediction Rings"
    • Android Home Screen Widget: 4×2 dark-themed widget for at-a-glance stats
      • Shows tracking status (Tracking/Idle) with color indicator
      • Sample count, LoRa connection type (USB/BT), success rate %, session distance
      • Updates in real-time as you drive
      • Tap widget to open the app
      • Add via long-press home screen → Widgets → MeshCore Wardrive

    Technical

    • New WidgetService wrapping home_widget package for native Android widget updates
    • Native WardriveWidgetProvider.kt with SharedPreferences-based data bridge
    • Widget state pushed on tracking start/stop, sample saves, and connection changes
    • Added home_widget: ^0.7.0 dependency
  12. v1.0.30 # 4 months ago · 2026-03-03 22:04 UTC

    Changelog

    v1.0.30 - 2026-03-03

    Added

    • Route Trail: Color-coded polyline showing your driven path on the map
      • Green = successful ping, Red = failed ping, Blue = GPS-only
      • Segments break on 5-minute gaps to avoid connecting unrelated sessions
      • Toggle in Settings: "Show Route Trail"
    • Session History: Track and review individual wardrive sessions
      • Automatically records session on start/stop tracking with duration, distance, sample/ping counts
      • New "Session History" screen accessible from Settings → Data Management
      • Add notes to sessions for future reference
      • Tap a session to filter the map to only that session's data
      • Clear filter from Settings when done
    • Offline Map Tiles: Map tiles are now cached locally for offline use
      • Tiles cache passively as you view them — no manual download needed
      • Cached tiles persist across app restarts
      • "Clear Tile Cache" button in Settings → Data Management
    • Heatmap Overlay: Smooth heat gradient visualization of ping activity
      • Successful pings glow hotter (red), failed pings are warm (orange/yellow), GPS-only points are cool (green)
      • Toggle in Settings: "Show Heatmap"
      • Independent of coverage grid — both can be on simultaneously
    • Speed Display: Live speed readout in the control panel (mph or km/h based on distance unit)
    • CSV Export: Export samples as CSV files in addition to JSON
    • GPX/KML Export: Export route and ping data as GPX or KML for use in Google Earth, etc.
      • GPX includes trackpoints with timestamps and signal data
      • KML includes route LineString plus color-coded success/fail placemarks
    • Share Coverage Map: One-tap screenshot + share with coverage stats
      • Auto-captures clean map screenshot and attaches sample count, success rate, repeater count
    • Per-Repeater Coverage View: Filter map to show coverage from a specific repeater
      • Settings → Data Management → "Filter by Repeater" lists all known repeaters
      • Quick-filter "Filter by This" button added to repeater info dialog
      • Clear filter button to restore full view
    • Repeater Response Time Tracking: Measures elapsed time from ping send to first response
      • Response time (ms) stored per sample and displayed in sample info popup
      • Logged in debug output for all successful and timed-out pings
    • Coverage Gap Finder: Identifies areas with poor or no mesh coverage
      • Settings → Data Management → "Find Coverage Gaps"
      • Lists areas with <30% success rate, sorted worst-first
      • Tap any gap to navigate directly to it on the map
    • Signal Trend Chart: Interactive line charts for RSSI, SNR, and response time over time
      • Segmented metric selector (RSSI / SNR / Response)
      • Touch tooltips with exact values and timestamps
      • Min/Avg/Max/Points summary stats
      • Accessible from Settings → Debug → "Signal Trends"

    Technical

    • New sessions SQLite table (DB version 5 → 6), response_time_ms column (DB version 6 → 7)
    • Added dependencies: flutter_map_cache, dio_cache_interceptor, dio_cache_interceptor_file_store, flutter_map_heatmap, fl_chart
    • New SessionHistoryScreen with session cards showing stats, notes, and map filtering
    • New SignalTrendScreen with fl_chart line charts for signal metrics
    • LocationService now creates/finalizes session records on start/stop tracking
    • PingResult and Sample models extended with responseTimeMs field
    • Export dialog reworked with format picker (JSON/CSV/GPX/KML) then save/share choice
  13. v1.0.29.1 # 4 months ago · 2026-02-27 05:07 UTC

    Changelog

    v1.0.29.1 - 2026-02-27

    Added

    • Metric Fuel Units: Support for L/100km and litres in fuel tracking
      • New "Fuel Unit" dropdown in Settings: MPG/Gallons or L/100km/Litres
      • Vehicle fuel economy displays and accepts L/100km when metric is selected
      • Fuel price displays and accepts $/litre when metric is selected
      • Estimated fuel usage shows litres instead of gallons
      • Internal storage remains in imperial for seamless unit switching

    ⚠️ IMPORTANT: Reinstall Required

    The app package name has changed from com.example.meshcore_wardrive to mintylinux.meshcore.wardrive. Android treats this as a completely different app, so you must uninstall the old version before installing v1.0.29.1

  14. v1.0.29 # 4 months ago · 2026-02-27 04:13 UTC

    v1.0.29 - 2026-02-27

    ⚠️ IMPORTANT: Reinstall Required

    The app package name has changed from com.example.meshcore_wardrive to mintylinux.meshcore.wardrive. Android treats this as a completely different app, so you must uninstall the old version before installing v1.0.29.

    Before updating:

    1. Open the app and go to Settings → Export Data to back up your samples
    2. Uninstall the old version
    3. Install v1.0.29
    4. Go to Settings → Import Data to restore your samples

    Added

    • Editable Upload Sites: Upload endpoint addresses can now be edited (previously only deletable)
      • Blue edit icon next to each site in Manage Upload Sites
      • Edit both site name and API URL
    • Total Distance Driven: Persistent all-time mileage tracker across all sessions
      • Displayed in new "Statistics" section in Settings
      • Supports miles and kilometers based on distance unit setting
      • Reset button with confirmation dialog
    • Estimated Fuel Usage: Rough fuel consumption estimate based on distance driven
      • Set your vehicle's MPG in Settings to enable
      • Shows gallons used and estimated cost
    • Configurable Gas Price: Set your local gas price per gallon (default $3.50)
      • Used in fuel cost estimation
  15. v1.0.28 # 4 months ago · 2026-02-19 02:28 UTC

    v1.0.28 - 2026-02-19

    Added

    • Configurable Discovery Timeout: Users can now adjust ping timeout from 10-30 seconds in 5-second intervals
      • Default: 20 seconds (changed from hardcoded 30)
      • Available options: 10s, 15s, 20s, 25s, 30s
      • Accessible in Settings menu under "Discovery Timeout"
      • Different network conditions and repeater densities may benefit from different timeout values
      • User feedback indicated 30s timeout was too long in some scenarios, causing worse results
      • Shorter timeouts work better in dense repeater areas, longer timeouts help in sparse coverage

    Changed

    • Default discovery timeout changed from 30 seconds to 20 seconds
    • LocationService now dynamically reads timeout setting instead of using hardcoded value
  16. v1.0.27 # 4 months ago · 2026-02-13 00:52 UTC

    Changelog

    v1.0.27 - 2026-02-13

    Fixed

    • WhisperOS Device Support: Devices running WhisperOS now appear in Bluetooth scan list
      • Added 'whisper' to device name filter in Bluetooth scanning
      • Users with WhisperOS-based MeshCore devices can now connect to the app
      • Line 152 in lora_companion_service.dart
  17. v1.0.26 # 4 months ago · 2026-02-12 01:44 UTC

    Changelog

    v1.0.26 - 2026-02-12

    Fixed

    • Ping Timeout: Increased ping timeout from 20 seconds to 30 seconds to respect repeater rate limits
      • Repeaters are rate-limited to 4 responses per 120 seconds (30 seconds between responses)
      • Previous 20-second timeout could trigger pings too quickly at highway speeds
      • New 30-second timeout ensures at least 60 seconds between pings (30s travel + 30s timeout)
      • Prevents overwhelming single repeaters in low-density areas

    Added

    • Miles Traveled Tracking: Display cumulative distance traveled during tracking sessions
      • Shows distance in control panel when tracking is active
      • Supports both miles and kilometers (configurable in settings)
      • Distance resets at the start of each new tracking session
      • Updates in real-time as you move
    • Screenshot Capture: Take clean map screenshots without UI clutter
      • New camera button in app bar to capture screenshots
      • Automatically hides UI elements, control panel, floating buttons, and user location marker
      • Saves high-quality PNG to device gallery
      • Option to share screenshot immediately after capture
      • Perfect for sharing coverage maps with others
    • Color Blind Accessibility Mode: Alternative color palettes for users with color vision deficiencies
      • Support for Deuteranopia (red-green, most common)
      • Support for Protanopia (red-green)
      • Support for Tritanopia (blue-yellow)
      • Applies to coverage boxes, sample markers, and repeater icons
      • Normal mode uses traditional green/red colors
      • Color blind modes use blue/orange, blue/yellow, or pink/teal palettes
      • Configurable in settings menu

    Technical

    • Added distance tracking streams to LocationService
    • Created ColorBlindPalette utility class with scientifically-designed accessible color schemes
    • Modified AggregationService to accept color blind mode parameter
    • Integrated screenshot package for high-quality image capture
    • Added image_gallery_saver for saving screenshots to device
  18. v1.0.25 # 5 months ago · 2026-01-31 17:19 UTC

    Changelog

    v1.0.25 - 2026-01-31

    Added

    • Multi-Site Upload: Upload your data to multiple endpoints simultaneously
      • New "Manage Upload Sites" option in settings to add/remove custom upload endpoints
      • Select which sites to upload to with checkboxes
      • Shows individual progress and results for each site
      • Default meshcore.live endpoint included by default
    • Apply Whitelist to Edges: New toggle to optionally filter edges by Include Only Repeaters whitelist
      • When enabled, edges only show connections to whitelisted repeaters
      • Useful for analyzing coverage from specific repeaters

    Fixed

    • Upload Sites List UI: Fixed "Manage Upload Sites" dialog expanding as white box down the screen
      • Removed problematic ConstrainedBox and SingleChildScrollView wrappers
      • Uses simple Column with mainAxisSize.min for proper sizing
      • Dialog now stays within its window boundaries
    • Multi-Site Upload Tracking: Samples can now be uploaded to multiple endpoints independently
      • Each endpoint tracks which samples it has received separately
      • Uploading to default endpoint no longer blocks uploading to custom endpoints
      • Database now uses per-endpoint upload tracking instead of global flag
      • Existing uploaded samples automatically migrated to new tracking system
    • Upload Reliability: Fixed upload failures with large datasets (1000+ samples)
      • Uploads now split into batches of 100 samples to prevent timeouts
      • Increased timeout from 30 seconds to 60 seconds per batch
      • Automatic retry logic: failed batches are retried once before giving up
      • Progress feedback: UI shows "Uploading batch X of Y" during multi-batch uploads
      • Better error messages: shows which batch failed and why
      • Resolves "Failed to Upload Error: 500" issues reported by users
    • Toggle Animations: Fixed settings dialog toggle switches not animating when clicked
      • Wrapped settings dialog in StatefulBuilder for proper state updates
      • Toggle switches now animate smoothly without closing the dialog

    Improved

    • Minimized Control Panel: Reduced control panel to single compact row
      • Shows connection status, battery level, sample count, and Connect/Manual Ping button
      • Cleaner map view with more screen space for the map
    • Reorganized Settings: Moved Export, Import, and Clear Map buttons from main screen to settings menu
      • New "Data Management" section in settings for better organization
      • Main screen is now less cluttered
    • Enhanced Clear Confirmation: Clear Map dialog now shows exact sample count and warns about permanent deletion
    • Repeater Display: Combined live (LoRa service) and historical (aggregation) repeaters
      • Repeaters remain visible on map even when disconnected from LoRa device
      • Shows complete picture of discovered repeaters
    • Privacy Enhancement: Limited web map maximum precision to street-level (7, ~153m)
      • Removed building-level precision option (8, ~38m) for user privacy
      • Added privacy note explaining the limitation
    • Edge Filtering: Edges from repeaters at position 0,0 are now filtered out
      • Prevents invalid edges from unconfigured/mobile repeaters
    • Upload process is now more reliable for users with days of accumulated data
    • Clear progress indication during large uploads
    • Failed uploads now provide specific error details for troubleshooting
  19. v1.0.24 # 5 months ago · 2026-01-26 22:22 UTC

    Changelog

    v1.0.24 - 2026-01-26

    Added

    • Bluetooth Disconnection Detection: App now detects when Bluetooth connection to LoRa device is lost
      • Automatically fails any pending pings with "Bluetooth connection lost" error
      • Updates UI within 5 seconds to show disconnected state
      • Manual ping button becomes unavailable when disconnected
      • Prevents confusing "ping failed" messages when connection is lost mid-ping

    Fixed

    • Manual ping now shows clear error message when Bluetooth disconnects unexpectedly
    • Pending pings are properly cleaned up when connection is lost
    • Connection status UI accurately reflects current Bluetooth state
  20. v1.0.23 # 5 months ago · 2026-01-26 21:14 UTC

    Changelog

    v1.0.23 - 2026-01-26

    Added

    • App Version Tracking: Coverage data uploaded to the web map now includes app version information
      • Web map displays which app version was used to collect each coverage area
      • Visible in coverage square popups as "App Version: 1.0.XX"
      • Helps track data quality and identify issues with specific versions
      • App versions before this release will show as UNKNOWN

    Technical

    • Centralized version constant in lib/constants/app_version.dart
      • Single source of truth for version number across app and uploads
      • Automatically included in all sample uploads