All software
MeshCore Signal Tester

MeshCore Signal Tester

Monitoring / Management Stable

Web and Android signal-analysis tool for MeshCore companions and repeaters, with grouped packet reception, RSSI/SNR history, repeater statistics, GPS-tagged 3D mapping and CSV capture.

Maintainer
Aleš Janda ↗
Kind
Monitoring & Management
Maturity
Stable
Languages
JavaScript Kotlin
Licensing
Open source
Latest version
1.3.0 · 2026-08-01
License
MIT
Platforms
Web Android

Screenshots

Repeater statistics and RSSI/SNR history
GPS-tagged 3D signal map
Grouped packets with decoded details

Capabilities

Interfaces

  • Web
  • Mobile

Connections

  • BLE
  • Serial
  • USB
  • TCP

Capabilities

  • Monitoring
  • Telemetry
  • Packet analysis
  • Mapping

Node role

  • Companion
  • Repeater

Install

Releases

from GitHub · updated 2026-08-01
  1. v1.3.0 # Latest 7 days ago · 2026-08-01 17:37 UTC

    Added

    • Packet positions can come from the MeshCore device's own GPS instead of the phone. A new "Packet position from" setting geotags captured packets with the position the connected radio reports — useful when the radio moves separately from you (mounted on a car while you measure from a laptop with no GPS, or on a dog's collar roaming a garden). With the device source selected the phone's location permission isn't required; "Center on me" and the map follow whichever source is chosen, and a "⚠ no position" note appears when the chosen source has no fix.
    • The connected device's radio preset is shown in the header — the matching MeshCore regional preset (e.g. "EU/UK (Narrow)") for its frequency / bandwidth / spreading factor / coding rate, or the raw settings when nothing matches. The preset list is refreshed from the official source.
    • The device's own node name is shown for USB and WiFi companions and USB repeaters (not just Bluetooth), and it is appended to saved non-Bluetooth devices — e.g. "USB: 1A86:7523 (MyNode)".
    • Public-channel messages are decrypted and shown, via a new, much smaller packet decoder — a patched fork of @michaelhart/meshcore-decoder, maintained at github.com/kybl/meshcore-decoder.
    • Trace packets show the per-hop signal (SNR) along the path in the packet detail.
    • Suspicious "zero-stuffed" frames are flagged in the packet table and detail — long runs of leading zero bytes that are not real MeshCore traffic.
    • The RSSI chart draws the radio's own measured noise floor as a dashed line, which also covers quiet stretches between packets.
    • A date is shown next to any time that is not from today, so long multi-day captures are no longer ambiguous.
    • A non-blocking "Loading…" notice appears at the bottom of the screen while rebuilding the view over a big capture — switching the Display window to a wide range, importing a large CSV, or resuming a large saved session; the page stays usable meanwhile.

    Changed

    • Battery level now shows on its own, without needing the official MeshCore client connected at the same time.
    • The message filter searches the whole capture history, not just the currently loaded page.
    • Auto-reconnect is more persistent on Android — it keeps retrying (a fast burst, then once a minute) while the background service is alive, retries the moment you return to the app, and shows "Pairing required" if the device asks to pair again. The ongoing notification clears when you disconnect on purpose.
    • New per-packet sound: a short wooden "knock" marks a packet with a new hash, then each reception adds the SNR-pitched bell — so one packet heard via five repeaters is one knock plus five notes.
    • The 3D-map controls moved onto the map itself (Center on me, Show all repeaters, and the settings gear beside the fullscreen button), the SNR chart's Incoming/Outgoing toggles moved below the chart, and the device's position marker is now a blue cone.
    • The dark theme is easier to read — a neutral slate background instead of the old navy, with a brighter accent, clearer panel separation and brighter SNR/RSSI values, so the color comes from the data rather than the background. The light theme is unchanged.
    • Faster cold start — the app preloads its whole module graph in parallel.
    • Updated to target Android 16, as required by Google Play.

    Fixed

    • Some packets that previously showed a "Path payload too short" (or similar) error now decode correctly — the decoder's encrypted-envelope handling was corrected.
    • The packet table no longer jumps back to the selected repeater's column on every incoming packet once you have scrolled it elsewhere.
    • Accidental chart/map resizing is less likely — the resize handle is now only at the rig …
  2. v1.2.3 # 29 days ago · 2026-07-10 15:51 UTC

    Added

    • Tap a point in a 2D chart to open that packet in the Received Packets table.

    Changed

    • 2D charts now follow live data while zoomed in — during measurement a zoomed SNR/RSSI chart keeps up with new packets at the right edge and stays within the recorded time range, instead of drifting onto old or empty time.
    • The 2D-chart tooltip shows the time down to the millisecond and the packet type, plus how many receptions a clustered point stands for.
    • Smoother, steadier 3D-map clustering — points no longer flicker or shuffle as you move or zoom the camera, more individual points are shown when you zoom into a sparse area, and points appear right after zooming in.
    • Received Packets columns are ordered by recent activity — the most active repeaters lead, and columns with nothing in the newest packets no longer jump to the front (noticeable right after loading saved data).
    • CSV export shows the saved file's size, and the notification's speaker icon appears as "(🔊)" when sound is set to "Disconnect only".

    Fixed

    • The 3D-map show/hide (eye) button now works for repeaters that share an ID prefix (collision columns).
    • No more duplicate rows for the same repeater when it is seen at different ID lengths over a long run.
    • The Received Packets table no longer clears when you open certain repeater columns.
    • Seen Repeaters no longer scrolls on its own — it jumps to a repeater only when you select it.
    • The "Load previously captured data?" prompt reliably appears when you reopen the app with saved data.
    • "Show all repeaters" now works for loaded or long-running sessions — it places every known repeater that has a position, not only the ones that sent a packet in the recent in-memory window (previously it could do nothing even though each repeater still appeared when clicked individually).
    • No more burst of queued beeps when you return to the app after it was in the background — per-packet sounds keep playing while the phone still allows audio, but once it suspends audio in the background they're skipped instead of piling up and all playing at once on return.

    Internal

    • Unit test suite (node --test, 84 tests) covering CSV round-trips, the spatial index, tile/geo math, serial framing, repeater ID collision handling, the 3D-map LOD pyramid, and the chart zoom window — run automatically by a new GitHub Actions workflow on every push.
    • Several self-contained pieces of logic were extracted from app.js into pure, tested modules: column-key.js (repeater ID prefix/collision semantics), frame.js (serial frame extraction), geo.js (map tile math), maplod.js (3D-map level-of-detail pyramid), and chart-zoom.js (live-follow zoom window).
    • Headless-browser regression harness (tools/browser-check) that drives the real page in Chromium — imports a CSV and asserts the stats, column order, and "Show all repeaters" behave; used before every build.
  3. v1.2.2 # 1 month ago · 2026-06-27 14:23 UTC

    Added

    • Import multiple CSV files at once — select several files and they're merged in a single import.
    • 3D map keeps loading tiles while "Center on me" follows you — only while the map is on-screen and the app is in the foreground, to save data.
    • Auto-reconnect after Bluetooth returns (for example after leaving airplane mode).

    Changed

    • Android 15 support with true edge-to-edge — the dark border around the UI is gone; content runs to the screen edges and stays scrollable to the very top.
    • Android app package renamed to cz.kyblsoft.meshcore.signaltester. It installs as a new app — the previous build is not replaced.

    Fixed

    • "Connected but no packets" after airplane mode — Bluetooth turning off is now detected as a disconnect instead of leaving the app stuck "connected".
    • Tables no longer go blank after long runs — Seen Repeaters and Received Packets are restored from disk once old data ages out of memory.
    • 3D map repeater icons are now correctly hidden behind signal balls in front of them, plus various other UI and chart fixes and polish.

    Internal

    • The usb-serial-for-android library is vendored and built from source (no JitPack); the build is reproducible with pinned tooling and dependency checksum verification, and a CI workflow builds and lints the app on every change.
Show all 7 releases →

Project signals

popularity 2026-08-08 verification 2026-08-08
GitHub stars
15
Forks
1
Watchers
1
Open issues
0
Contributors
2
Release downloads
142
Latest downloads
11
Source available
Yes
Releases available
Yes
Signed releases
No
CI builds
Yes
Documentation
Yes
  • The Android app adds background capture and raw TCP connections to WiFi companion firmware.
  • Browser Bluetooth and serial support depends on the browser and platform.

Tags