MeshCore Wardrive · Releases
from GitHub · updated 2026-06-2320 releases
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
devicestable, newdevice_idcolumn 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.dartwith device cards and side-by-side comparison table SettingsService:deadZoneAlertsEnabledandnewRepeaterAlertsEnabledtoggles
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 × freshnesswith 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_zonestable - New
achievement_service.dartwith SharedPreferences-based badge tracking - New
achievements_screen.dartwith progress bar and unlock history - Added
battery_plusdependency for device battery monitoring DatabaseService: addedisDeadZoneCell(), privacy zone CRUD, export with repeatersLocationService: dead zone stream, battery saver stream, battery monitoring lifecycleAggregationService: newredundancycolor mode branch- Analytics: new Coverage Score tab with share button, 5-tab bottom nav
- Repeater Health:
isOffline/daysSinceSeenfields, offline badge in app bar
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_markerstable DatabaseService: added marker CRUD methods,deleteSample(),deleteSamplesByGeohash()SettingsService: addedshowSuccessfulOnlypersistence + export key- Map long-press handler for marker placement
- Delete mode routing in sample and coverage tap handlers
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
_pingInProgressguard 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 —
_pingInProgressis only used for time-based ping deduplication, not distance pings.
- Coverage gaps eliminated: Removed
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
_autoFollowIntervalthrottle to reduce_mapController.move()calls - Distance/speed stream listeners update values silently without setState
_loadSamplesno-change path compares all state fields before calling setState- Upload service filters
pingSuccess == nullsamples in both single and multi-endpoint paths - Web map
samples.jsalso skips GPS-only samples inaggregateSamples()
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
WSessionmodel: addedtoJson()/fromJson()for session serializationDatabaseService: newexportAllData()andimportAllData()methods for unified export/importAggregationService: filters out coverage cells where all samples are GPS-only (pingSuccess == null)CarpeaterService._runDiscoveryCycle(): calls_clearPreviousNeighbours()before each discovery
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
sourcefield 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_POSITIONwas using code 20 (battery request) instead of 14 (lat/lon) — pings now route correctly through the mesh - Auto-ping lock:
_pingInProgressflag could get stuck permanently, blocking all future auto-pings (now usesfinallyblock) - 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:
_disconnectControllernow closed indispose() - SQLite WAL pragma: Fixed
execute→rawQueryfor Android compatibility
Improved
- Sound: Switched from
STREAM_NOTIFICATIONtoSTREAM_MUSICfor reliable audio playback - Vibration: Uses
USAGE_ALARMVibrationAttributes 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
sourcecolumn on samples with index - New
repeater_health_screen.dart(~670 lines) SettingsServiceextended withexportSettings()/importSettings()anddevice_nameLoRaCompanionService: added_handleUsbDisconnection(),ignoredRepeaterPrefixgetter, advert cleanupMeshCoreProtocol:CMD_SET_ADVERT_LATLON = 14(was incorrectlyCMD_SET_POSITION = 20)- Native
MainActivity.kt:STREAM_MUSICaudio,USAGE_ALARMvibration attributes, debug logging
- Multi-Device Wardrive: Merge coverage data from multiple users into one map
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,
_isStoppedguard, improved retry counts and delays - Map screen performance: conditional re-aggregation only when sample/repeater counts change, repeater deduplication
- Upload service refactored: extracted
_samplesToJsonhelper, cleaner JSON construction
Technical
- New
SoundServicewith platform channel (mintylinux.wardrive/feedback) for native audio/haptic feedback - New
TileDownloadServicefor offline tile management - Added
VIBRATEpermission to AndroidManifest - Protocol constant renamed:
CMD_SET_POSITION→CMD_SET_ADVERT_LATLON MainActivity.ktextended with ToneGenerator and Vibrator support
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
CarpeaterServicewith state machine, retry logic, and cycle tracking - Extended
MeshCoreProtocolwith Carpeater commands: login, CLI, binary request, neighbour parsing - Extended
LoRaCompanionServicewith pubkey cache, Carpeater callback routing, and send methods - Updated push code constants to match current MeshCore firmware (with legacy aliases for compatibility)
LocationServiceintegrates Carpeater alongside existing ducting monitoring- Carpeater settings persisted via SharedPreferences
- Carpeater Mode ( BETA) (contributed by @overkillfpv): "Car Repeater" wardrive mode (Repeater Firmware 1.14 or higher required)
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:
- Open the app and go to Settings → Export Data to back up your samples
- Uninstall the old version (
adb uninstall mintylinux.meshcore.wardriveor via Android Settings) - Install v1.0.32
- 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
- Time-of-Day Breakdown: Bar chart showing ping success rate by hour (0-23)
- 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_cachetable,ducting_riskcolumn on samples - New
DuctingServicewith ITU radio refractivity formula and Open-Meteo integration - New
AnalyticsScreenwithfl_chartbar charts and geohash-based coverage goal math ductingRiskfield added toSamplemodel (included in JSON/CSV/GPX/KML exports)- Coverage goal settings (
goal_center_lat,goal_center_lon,goal_radius_meters) in SharedPreferences LocationServiceintegrates ducting: fetch on tracking start + hourly timer, runtime toggle_buildPredictionRingsLayer()now filters by_includeOnlyRepeaterswhitelist
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:
- Open the app and go to Settings → Export Data to back up your samples
- Uninstall the old version (
adb uninstall mintylinux.meshcore.wardriveor via Android Settings) - Install v1.0.31
- Go to Settings → Import Data to restore your samples
- 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
WidgetServicewrappinghome_widgetpackage for native Android widget updates - Native
WardriveWidgetProvider.ktwithSharedPreferences-based data bridge - Widget state pushed on tracking start/stop, sample saves, and connection changes
- Added
home_widget: ^0.7.0dependency
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
sessionsSQLite table (DB version 5 → 6),response_time_mscolumn (DB version 6 → 7) - Added dependencies:
flutter_map_cache,dio_cache_interceptor,dio_cache_interceptor_file_store,flutter_map_heatmap,fl_chart - New
SessionHistoryScreenwith session cards showing stats, notes, and map filtering - New
SignalTrendScreenwithfl_chartline charts for signal metrics LocationServicenow creates/finalizes session records on start/stop trackingPingResultandSamplemodels extended withresponseTimeMsfield- Export dialog reworked with format picker (JSON/CSV/GPX/KML) then save/share choice
- Route Trail: Color-coded polyline showing your driven path on the map
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_wardrivetomintylinux.meshcore.wardrive. Android treats this as a completely different app, so you must uninstall the old version before installing v1.0.29.1- Metric Fuel Units: Support for L/100km and litres in fuel tracking
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_wardrivetomintylinux.meshcore.wardrive. Android treats this as a completely different app, so you must uninstall the old version before installing v1.0.29.Before updating:
- Open the app and go to Settings → Export Data to back up your samples
- Uninstall the old version
- Install v1.0.29
- 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
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
- Configurable Discovery Timeout: Users can now adjust ping timeout from 10-30 seconds in 5-second intervals
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
- WhisperOS Device Support: Devices running WhisperOS now appear in Bluetooth scan list
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
- Ping Timeout: Increased ping timeout from 20 seconds to 30 seconds to respect repeater rate limits
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
- Multi-Site Upload: Upload your data to multiple endpoints simultaneously
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
- Bluetooth Disconnection Detection: App now detects when Bluetooth connection to LoRa device is lost
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
- App Version Tracking: Coverage data uploaded to the web map now includes app version information