Releases: mintylinux/Meshcore-Wardrive-Android
Releases · mintylinux/Meshcore-Wardrive-Android
Meshcore-Wardrive-Android-1.0.38
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
Meshcore-Wardrive-Android-1.0.37.1
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.
Meshcore-Wardrive-Android-1.0.37
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()
Meshcore-Wardrive-Android-1.0.36
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
Meshcore-Wardrive-Android-1.0.35
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
Meshcore-Wardrive-Android-1.0.34
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
Meshcore-Wardrive-Android-1.0.33
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
Meshcore-Wardrive-Android-1.0.32
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
Meshcore-Wardrive-Android-1.0.31
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
Meshcore-Wardrive-Android-1.0.30
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