MeshCore Wardrive

MeshCore Wardrive · Releases

from GitHub · updated 2026-07-12

20 releases

  1. v1.0.42 # 8 days ago · 2026-07-12 22:37 UTC

    Changelog

    v1.0.42 - 2026-07-12

    Added

    • Tropospheric Ducting Forecast: View 6-day VHF/UHF ducting forecast maps from dxinfocentre.com. Select from 23 global regions, scrub through 28 forecast frames (3h intervals for first 36h, 6h intervals after), pinch to zoom, and animate with playback controls. Region selection persists between sessions. Access from Settings under the Atmospheric Ducting section.
  2. v1.0.41.1 # 11 days ago · 2026-07-09 21:45 UTC

    Changelog

    v1.0.41.1 - 2026-07-09

    Fixed

    • Community Coverage Download: Now works with Cloudflare live map (sharded KV format). Fetches all shards in batches for full coverage download.
    • Community coverage colors: Cells now use green/yellow/red quality colors instead of solid blue
    • Tap community cells: Tap any community coverage cell to view success rate, repeaters (with RSSI/SNR), sample count, and last update
    • Clear community data: Trash icon on the Community Coverage toggle to delete cached data

    v1.0.41 - 2026-07-09

    Added

    • #22 Community Coverage Download: Download coverage data from your configured web map for offline viewing. Go to Settings → Data Management → "Download Community Coverage" to fetch, then toggle "Community Coverage" in map layers to show coverage from all community wardrive data.

    Fixed

    • #27 Permissions/ping failure on fresh install: Fresh installs of v1.0.40 created the samples table without the device_id column, causing all sample inserts to fail silently. Coverage squares and pings appeared to not work. Fixed _onCreate schema and added defensive error handling around device tracking.
    • #24 Static GPS Blue Dot: GPS blue dot was only updating every 5 seconds (on the timer-driven _loadSamples cycle). Now updates in real-time via setState() on every GPS position update.
    • #23 Coverage boxes reverting to red: Cells with confirmed coverage (at least one successful ping) will no longer drop below yellow, even if subsequent drives through the area fail. Only cells with zero successful pings show as red.

    Technical

    • _onCreate now includes device_id column and devices table for fresh installs
    • Device tracking upsertDevice() call wrapped in try/catch to prevent cascade failures
    • Position stream listener now triggers setState() for immediate blue dot movement
    • Coverage color logic floors at 30% success rate when received > 0
  3. v1.0.41 # 11 days ago · 2026-07-09 21:10 UTC

    Changelog

    v1.0.41 - 2026-07-09

    Added

    • #22 Community Coverage Download: Download coverage data from your configured web map for offline viewing. Go to Settings → Data Management → "Download Community Coverage" to fetch, then toggle "Community Coverage" in map layers to show a blue-tinted overlay of all community wardrive data.

    Fixed

    • #27 Permissions/ping failure on fresh install: Fresh installs of v1.0.40 created the samples table without the device_id column, causing all sample inserts to fail silently. Coverage squares and pings appeared to not work. Fixed _onCreate schema and added defensive error handling around device tracking.
    • #24 Static GPS Blue Dot: GPS blue dot was only updating every 5 seconds (on the timer-driven _loadSamples cycle). Now updates in real-time via setState() on every GPS position update.
    • #23 Coverage boxes reverting to red: Cells with confirmed coverage (at least one successful ping) will no longer drop below yellow, even if subsequent drives through the area fail. Only cells with zero successful pings show as red.

    Technical

    • _onCreate now includes device_id column and devices table for fresh installs
    • Device tracking upsertDevice() call wrapped in try/catch to prevent cascade failures
    • Position stream listener now triggers setState() for immediate blue dot movement
    • Coverage color logic floors at 30% success rate when received > 0
  4. v1.0.40 # 1 month 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
  5. v1.0.39 # 1 month 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
  6. v1.0.38 # 3 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
  7. 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.
  8. 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()
  9. v1.0.36 # 4 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
  10. v1.0.35 # 4 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
  11. v1.0.34 # 4 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
  12. v1.0.33 # 4 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
  13. v1.0.32 # 4 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
  14. v1.0.31 # 5 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
  15. v1.0.30 # 5 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
  16. v1.0.29.1 # 5 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

  17. v1.0.29 # 5 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
  18. v1.0.28 # 5 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
  19. v1.0.27 # 5 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
  20. v1.0.26 # 5 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