You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Settings overview groups categories by topic (Map, Sampling & alerts, App,
Data, System) with uppercase headers and a one-line description on each
category tile.
Added
Hidden achievement "Быть легендой mesh сетей Смоленска" (💎): unlocks while
the connected companion radio reports a node name starting with "Ya_",
"Yakut", or "Якут" (case-insensitive). The badge stays invisible on the
Achievements screen until it is unlocked. The device's own MeshCore advert
name is now parsed from the SELF_INFO handshake response and tracked while
the companion is connected; it is separate from the Bluetooth/USB transport
name.
Auto-ping pause on bad GPS: when the configured number of consecutive
position fixes is rejected by the location quality filters, automatic pings
pause until the next valid fix instead of pinging a stale position. The
feature is on by default after 5 rejected fixes; the toggle and threshold
live in Settings → Location Quality Filters → Auto-Ping Pause and are
included in settings export/import. A snackbar announces each pause and
resume.
Audible link-loss alert: when the LoRa companion radio disconnects
unexpectedly, the app plays a distinctive double-beep tone with vibration.
A disconnect made explicitly from the map stays silent. The alert can be
turned off in Settings → Feedback ("Link Loss Alert", enabled by default)
and is included in settings export/import.
Automatic reconnection to the LoRa companion radio after an unexpected
connection loss (USB unplugged or Bluetooth link dropped). Reconnect attempts
use exponential backoff (3 s doubling up to once a minute) and refresh the
contact list on success. Auto-ping suspended by the loss resumes when the
link is restored. A disconnect made explicitly from the map is never followed
by an automatic reconnection.
In-app language (System / English / Русский) under Settings → App & device;
Russian UI.
Impossible Zones in Location Quality Filters: user-defined circles
where you cannot physically be. GPS or Wi-Fi fixes inside a zone are
discarded (no sample, no ping) and the map keeps the last valid
position. They can be added from Settings or by long-pressing the map;
they are not drawn on the map.
Long-pressing the map now opens a choice of what to add: a planned repeater,
a privacy zone, or a GPS-impossible zone.
Before a GPS fix is available, the map opens on the average of stored
measurements at a city-scale zoom. Spread-out samples zoom out to fit. With
no samples it keeps the previous default view, and the first GPS fix still
recenters as before.
Long-press the map Play button to start a new recording on a blank map
without deleting stored samples. Short press still shows all coverage. An
empty session (no GPS points) asks whether to keep it; discarding or deleting
the session on the map falls back to the latest saved session.
Battery saver can now be turned off in Settings → App & device. Automatic
ping-interval doubling at ≤20% battery stays on by default and can be changed
while a recording is running.
Direction-arrow mode now offers a figure-8 compass calibration when Android
reports the magnetometer as unreliable. A compact map banner appears after a
short delay, Later snoozes it for a day, and Calibrate Compass remains in
Settings or via a long-press on the compass button.
Interface and map themes can now be selected independently. Existing installs
keep their previous map appearance when the new setting is initialized.
Map LOD (geohash grouping of coverage, edges, and samples at low zoom) can now
be turned off in Map display. It stays on by default. With it off, the map
shows native coverage cells and individual GPS sample points.
Added a map-provider investigation covering Yandex Tiles API, Yandex MapKit,
hosted alternatives, offline support, migration effort, and licensing risks.
GitHub Actions CI runs format checks, analyzer, tests, and a debug APK build
on main. A manual Release APK workflow publishes a signed APK to GitHub
Releases using repository signing secrets and the version from pubspec.yaml.
Location rejection thresholds are now configurable in a dedicated expandable
Settings group, with user-friendly km/h speed inputs and one-tap restoration
of the previous built-in defaults.
Settings now use a modern Android-style overview with grouped category cards
and dedicated child pages for each category.
Starting a recording now requests precise and always-on location access plus
an exemption from Android battery optimization. When beaconDB Wi-Fi
positioning is enabled, the app also links to Developer options to disable
Wi-Fi scan throttling and holds a Wi-Fi lock during foreground tracking.
Optional beaconDB Wi-Fi positioning can now be enabled in Settings. It scans
nearby access points every 30 seconds and gives a valid Wi-Fi-only estimate
priority over Android fused/GPS positions. IP and cell fallbacks are disabled, _nomap, hidden, randomized, and stale networks are excluded, and the active
Wi-Fi position is shown with a cyan marker.
Discovery response collection is now configurable: fast mode finishes three
seconds after the first response, while thorough mode keeps listening until
the configured discovery timeout.
Fresh installs now use the regional meshcoretel.ru upload endpoint for
Russian locales and meshcoretel.io elsewhere.
A new Keep Screen On setting prevents the display from sleeping while the
app is open, without interfering with the existing tracking wakelock.
The current GPS marker can now be switched between the classic blue circle
and a compass-aware direction arrow in Settings. The arrow falls back to GPS
course while moving when a compass sensor is unavailable. In arrow mode, the
compass button toggles heading-up rotation; rotating the map manually stops
heading-up tracking.
An app-wide offline banner now detects restricted or unavailable internet
access with a short periodic connectivity check. GPS tracking, radio
communication, and local sample storage continue while offline.
Successful pings heard by at least three positioned repeaters now show a
temporary grey radio-position estimate and its uncertainty circle. The
estimate is visually distinct from the blue GPS position and can be hidden
in map settings without disabling its calculation.
Fixed
Dialogs, bottom sheets, file pickers, and nested screens opened from a
Settings category now return to that category instead of the overview.
Community coverage tiles now use exact geohash bounds and the same LOD
precision as local coverage, so they line up with the user's grid. They stay
visible regardless of the session filter and are hidden only by their own
map-display toggle. Tap details use the same aggregated cells as the overlay.
Long-pressing Play starts a blank-map session. The Play button no longer uses
a Material tooltip, which was swallowing the long-press gesture.
Session History "Tap to view on map" uses the theme primary color so it stays
readable on dark cards.
Quick Settings no longer crashes when Discovery Timeout is 5s or 25s, or when
ping distance is Frequent (50 m) or another value missing from the compact
menus. Those lists now match Settings and still accept unknown saved values.
Settings text fields now keep their controllers alive until dialog dismissal
finishes, preventing crashes and cascading layout errors after saving location
quality thresholds and other editable preferences.
Location quality controls now open as a dedicated submenu and no longer rely
on Flutter's ExpansionTile announcement event, which Android API 36 reports
as deprecated.
The map now keeps searching for a fused Android position whenever it is open,
even before recording starts. A watchdog restarts stalled or closed location
streams and resumes automatically after Location Services are re-enabled.
Android-reported mock locations are excluded from the map and recorded
wardrive data. GPS samples and trip distance retain their five-metre movement
threshold even though the live position stream updates more frequently.
Discovery pings now persist one sample for every unique repeater response,
including each response's latency, while duplicate responses from the same
node remain de-duplicated.
Coverage-to-repeater lines now match full and short node IDs without case
sensitivity, and coverage details show two-byte repeater prefixes.
The connect action is disabled for the full USB/Bluetooth connection attempt
so overlapping scans and connection requests cannot be started.
Repeater names containing Cyrillic characters or emoji are now decoded and
displayed correctly.
Radio ping results are now shown as soon as the first tagged discovery
response arrives, with the actual response time. Additional repeater
responses are still collected for radio-position estimation without delaying
feedback, and overlapping discovery cycles are prevented.
Companion-radio communication now parses firmware layout 13 while correctly
negotiating the documented app response layout 3. Golden protocol tests pin
command/response assignments, USB/BLE framing, discovery, contacts,
SELF_INFO, channel data, UTF-8 text, coordinates, and malformed-frame
handling. Channel messages no longer use UTF-16 bytes or append an extra
NUL, and quarter-dB SNR is preserved until the integer application boundary.
BLE connections use the official UART UUIDs and request MTU 512.
Update checks now time out quickly and show a concise offline error instead
of leaving the request hanging.
Android location fixes now use the fused provider so GPS, cellular, and
nearby Wi-Fi positioning can work together.
Very inaccurate fixes and probable in-flight samples are ignored without
blocking legitimate drives on high-altitude roads.
Tracking startup failures now show a specific permission, settings, or
service error.
Changed
Dart and Android plugins are updated within the Flutter 3.47 / API 36
toolchain. BLE connect now uses FlutterBluePlus's nonprofit license. The map
stack stays on flutter_map 7 because flutter_map_heatmap still does not
support v8. Packages that need Android 17 (API 37) or AGP 9 built-in Kotlin
stay on the last versions that compile against API 36.
Android builds now follow the Flutter 3.47 toolchain: Gradle 9.3.1, Android
Gradle Plugin 9.1.0, and Kotlin 2.4.0. CI and release workflows pin Flutter
3.47.1 so the Gradle/AGP/Kotlin warnings no longer appear. Gradle 9 no longer
provides jcenter(), so the Android build maps leftover plugin calls to
Maven Central. Android library plugins are compiled against API 36 so they
satisfy AGP 9's compile SDK requirement.
The update check and the "View on GitHub" entry in Settings → About now
point at the fork's releases. The check uses the releases list endpoint so
prerelease-only repositories are detected, and release tags are matched by
their dotted version regardless of prefix.
Bluetooth device selection no longer waits for the scan timeout. Previously
used and paired companion radios appear immediately, and newly found devices
are added to the list while scanning continues.
Settings now open as a dedicated full-screen page and are grouped into
Android-style categories for map display, positioning, alerts, Carpeater,
app/device preferences, discovery, statistics, data, diagnostics, and online
services.
Fresh installs default to metric units, geohash precision 7, time-based
pings every 30 seconds, and a 10-second discovery timeout. Additional
20-second, 25-second, and 45-second ping intervals are available.