{
  "id": "meshcore-signal-tester",
  "name": "MeshCore Signal Tester",
  "kind": "monitoring",
  "status": "active",
  "maturity": "stable",
  "description": "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.",
  "image": "logo.svg",
  "screenshots": [
    {
      "file": "charts.webp",
      "caption": "Repeater statistics and RSSI/SNR history"
    },
    {
      "file": "3dmap.webp",
      "caption": "GPS-tagged 3D signal map"
    },
    {
      "file": "packets.webp",
      "caption": "Grouped packets with decoded details"
    }
  ],
  "maintainers": [
    {
      "name": "Aleš Janda",
      "url": "https://github.com/kybl"
    }
  ],
  "repository": "https://github.com/kybl/meshcore-signal-tester",
  "website": "https://meshcore.kyblsoft.cz/signal-tester",
  "license": "MIT",
  "languages": [
    "javascript",
    "kotlin"
  ],
  "platforms": [
    "web",
    "android"
  ],
  "interfaces": [
    "web",
    "mobile"
  ],
  "connections": [
    "ble",
    "serial",
    "usb",
    "tcp"
  ],
  "node_roles": [
    "companion",
    "repeater"
  ],
  "capabilities": [
    "monitoring",
    "telemetry",
    "packet-analysis",
    "mapping"
  ],
  "install": [
    {
      "type": "web",
      "url": "https://meshcore.kyblsoft.cz/signal-tester"
    },
    {
      "type": "github-release",
      "package": "meshcore-signal-tester-release.apk",
      "url": "https://github.com/kybl/meshcore-signal-tester/releases"
    },
    {
      "type": "source",
      "url": "https://github.com/kybl/meshcore-signal-tester"
    }
  ],
  "popularity": {
    "githubStars": 13,
    "githubForks": 1,
    "githubWatchers": 1,
    "githubOpenIssues": 0,
    "githubContributors": 2,
    "latestReleaseDownloads": 22,
    "lastChecked": "2026-07-21",
    "releaseDownloads": 115
  },
  "verification": {
    "sourceAvailable": true,
    "releasesAvailable": true,
    "signedReleases": false,
    "ciBuilds": true,
    "hasDocumentation": true,
    "lastChecked": "2026-07-21",
    "notes": [
      "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": [
    "signal-testing",
    "field-tool",
    "threejs",
    "packet-capture"
  ],
  "last_reviewed": "2026-06-23",
  "source": {
    "path": "data/software/meshcore-signal-tester/software.yaml",
    "updatedAt": "2026-07-21T08:04:18Z"
  },
  "latest_version": "1.2.3",
  "released": "2026-07-10",
  "releases": [
    {
      "version": "v1.2.3",
      "name": "v1.2.3",
      "datetime": "2026-07-10T15:51:26Z",
      "url": "https://github.com/kybl/meshcore-signal-tester/releases/tag/v1.2.3",
      "prerelease": false,
      "notes": "### Added\r\n\r\n- **Tap a point in a 2D chart to open that packet** in the Received Packets\r\n  table.\r\n\r\n### Changed\r\n\r\n- **2D charts now follow live data while zoomed in** — during measurement a\r\n  zoomed SNR/RSSI chart keeps up with new packets at the right edge and stays\r\n  within the recorded time range, instead of drifting onto old or empty time.\r\n- **The 2D-chart tooltip shows the time down to the millisecond and the packet\r\n  type**, plus how many receptions a clustered point stands for.\r\n- **Smoother, steadier 3D-map clustering** — points no longer flicker or shuffle\r\n  as you move or zoom the camera, more individual points are shown when you zoom\r\n  into a sparse area, and points appear right after zooming in.\r\n- **Received Packets columns are ordered by recent activity** — the most active\r\n  repeaters lead, and columns with nothing in the newest packets no longer jump\r\n  to the front (noticeable right after loading saved data).\r\n- **CSV export shows the saved file's size**, and the notification's speaker\r\n  icon appears as \"(🔊)\" when sound is set to \"Disconnect only\".\r\n\r\n### Fixed\r\n\r\n- **The 3D-map show/hide (eye) button now works for repeaters that share an ID\r\n  prefix** (collision columns).\r\n- **No more duplicate rows for the same repeater** when it is seen at different\r\n  ID lengths over a long run.\r\n- **The Received Packets table no longer clears** when you open certain repeater\r\n  columns.\r\n- **Seen Repeaters no longer scrolls on its own** — it jumps to a repeater only\r\n  when you select it.\r\n- **The \"Load previously captured data?\" prompt reliably appears** when you\r\n  reopen the app with saved data.\r\n- **\"Show all repeaters\" now works for loaded or long-running sessions** — it\r\n  places every known repeater that has a position, not only the ones that sent a\r\n  packet in the recent in-memory window (previously it could do nothing even\r\n  though each repeater still appeared when clicked individually).\r\n- **No more burst of queued beeps** when you return to the app after it was in\r\n  the background — per-packet sounds keep playing while the phone still allows\r\n  audio, but once it suspends audio in the background they're skipped instead of\r\n  piling up and all playing at once on return.\r\n\r\n### Internal\r\n\r\n- **Unit test suite** (`node --test`, 84 tests) covering CSV round-trips, the\r\n  spatial index, tile/geo math, serial framing, repeater ID collision handling,\r\n  the 3D-map LOD pyramid, and the chart zoom window — run automatically by a new\r\n  GitHub Actions workflow on every push.\r\n- Several self-contained pieces of logic were **extracted from `app.js` into\r\n  pure, tested modules**: `column-key.js` (repeater ID prefix/collision\r\n  semantics), `frame.js` (serial frame extraction), `geo.js` (map tile math),\r\n  `maplod.js` (3D-map level-of-detail pyramid), and `chart-zoom.js` (live-follow\r\n  zoom window).\r\n- **Headless-browser regression harness** (`tools/browser-check`) that drives\r\n  the real page in Chromium — imports a CSV and asserts the stats, column order,\r\n  and \"Show all repeaters\" behave; used before every build.",
      "notesHtml": "<h3>Added</h3>\n<ul>\n<li><strong>Tap a point in a 2D chart to open that packet</strong> in the Received Packets\ntable.</li>\n</ul>\n<h3>Changed</h3>\n<ul>\n<li><strong>2D charts now follow live data while zoomed in</strong> — during measurement a\nzoomed SNR/RSSI chart keeps up with new packets at the right edge and stays\nwithin the recorded time range, instead of drifting onto old or empty time.</li>\n<li><strong>The 2D-chart tooltip shows the time down to the millisecond and the packet\ntype</strong>, plus how many receptions a clustered point stands for.</li>\n<li><strong>Smoother, steadier 3D-map clustering</strong> — points no longer flicker or shuffle\nas you move or zoom the camera, more individual points are shown when you zoom\ninto a sparse area, and points appear right after zooming in.</li>\n<li><strong>Received Packets columns are ordered by recent activity</strong> — the most active\nrepeaters lead, and columns with nothing in the newest packets no longer jump\nto the front (noticeable right after loading saved data).</li>\n<li><strong>CSV export shows the saved file's size</strong>, and the notification's speaker\nicon appears as \"(🔊)\" when sound is set to \"Disconnect only\".</li>\n</ul>\n<h3>Fixed</h3>\n<ul>\n<li><strong>The 3D-map show/hide (eye) button now works for repeaters that share an ID\nprefix</strong> (collision columns).</li>\n<li><strong>No more duplicate rows for the same repeater</strong> when it is seen at different\nID lengths over a long run.</li>\n<li><strong>The Received Packets table no longer clears</strong> when you open certain repeater\ncolumns.</li>\n<li><strong>Seen Repeaters no longer scrolls on its own</strong> — it jumps to a repeater only\nwhen you select it.</li>\n<li><strong>The \"Load previously captured data?\" prompt reliably appears</strong> when you\nreopen the app with saved data.</li>\n<li><strong>\"Show all repeaters\" now works for loaded or long-running sessions</strong> — it\nplaces every known repeater that has a position, not only the ones that sent a\npacket in the recent in-memory window (previously it could do nothing even\nthough each repeater still appeared when clicked individually).</li>\n<li><strong>No more burst of queued beeps</strong> when you return to the app after it was in\nthe background — per-packet sounds keep playing while the phone still allows\naudio, but once it suspends audio in the background they're skipped instead of\npiling up and all playing at once on return.</li>\n</ul>\n<h3>Internal</h3>\n<ul>\n<li><strong>Unit test suite</strong> (<code>node --test</code>, 84 tests) covering CSV round-trips, the\nspatial index, tile/geo math, serial framing, repeater ID collision handling,\nthe 3D-map LOD pyramid, and the chart zoom window — run automatically by a new\nGitHub Actions workflow on every push.</li>\n<li>Several self-contained pieces of logic were <strong>extracted from <code>app.js</code> into\npure, tested modules</strong>: <code>column-key.js</code> (repeater ID prefix/collision\nsemantics), <code>frame.js</code> (serial frame extraction), <code>geo.js</code> (map tile math),\n<code>maplod.js</code> (3D-map level-of-detail pyramid), and <code>chart-zoom.js</code> (live-follow\nzoom window).</li>\n<li><strong>Headless-browser regression harness</strong> (<code>tools/browser-check</code>) that drives\nthe real page in Chromium — imports a CSV and asserts the stats, column order,\nand \"Show all repeaters\" behave; used before every build.</li>\n</ul>\n"
    },
    {
      "version": "v1.2.2",
      "name": "v1.2.2",
      "datetime": "2026-06-27T14:23:20Z",
      "url": "https://github.com/kybl/meshcore-signal-tester/releases/tag/v1.2.2",
      "prerelease": false,
      "notes": "### Added\r\n\r\n- **Import multiple CSV files at once** — select several files and they're\r\n  merged in a single import.\r\n- **3D map keeps loading tiles while \"Center on me\" follows you** — only while\r\n  the map is on-screen and the app is in the foreground, to save data.\r\n- **Auto-reconnect after Bluetooth returns** (for example after leaving\r\n  airplane mode).\r\n\r\n### Changed\r\n\r\n- **Android 15 support with true edge-to-edge** — the dark border around the UI\r\n  is gone; content runs to the screen edges and stays scrollable to the very top.\r\n- **Android app package renamed** to `cz.kyblsoft.meshcore.signaltester`. It\r\n  installs as a new app — the previous build is not replaced.\r\n\r\n### Fixed\r\n\r\n- **\"Connected but no packets\" after airplane mode** — Bluetooth turning off is\r\n  now detected as a disconnect instead of leaving the app stuck \"connected\".\r\n- **Tables no longer go blank after long runs** — Seen Repeaters and Received\r\n  Packets are restored from disk once old data ages out of memory.\r\n- 3D map repeater icons are now correctly hidden behind signal balls in front of\r\n  them, plus various other UI and chart fixes and polish.\r\n\r\n### Internal\r\n\r\n- The `usb-serial-for-android` library is vendored and built from source (no\r\n  JitPack); the build is reproducible with pinned tooling and dependency\r\n  checksum verification, and a CI workflow builds and lints the app on every\r\n  change.",
      "notesHtml": "<h3>Added</h3>\n<ul>\n<li><strong>Import multiple CSV files at once</strong> — select several files and they're\nmerged in a single import.</li>\n<li><strong>3D map keeps loading tiles while \"Center on me\" follows you</strong> — only while\nthe map is on-screen and the app is in the foreground, to save data.</li>\n<li><strong>Auto-reconnect after Bluetooth returns</strong> (for example after leaving\nairplane mode).</li>\n</ul>\n<h3>Changed</h3>\n<ul>\n<li><strong>Android 15 support with true edge-to-edge</strong> — the dark border around the UI\nis gone; content runs to the screen edges and stays scrollable to the very top.</li>\n<li><strong>Android app package renamed</strong> to <code>cz.kyblsoft.meshcore.signaltester</code>. It\ninstalls as a new app — the previous build is not replaced.</li>\n</ul>\n<h3>Fixed</h3>\n<ul>\n<li><strong>\"Connected but no packets\" after airplane mode</strong> — Bluetooth turning off is\nnow detected as a disconnect instead of leaving the app stuck \"connected\".</li>\n<li><strong>Tables no longer go blank after long runs</strong> — Seen Repeaters and Received\nPackets are restored from disk once old data ages out of memory.</li>\n<li>3D map repeater icons are now correctly hidden behind signal balls in front of\nthem, plus various other UI and chart fixes and polish.</li>\n</ul>\n<h3>Internal</h3>\n<ul>\n<li>The <code>usb-serial-for-android</code> library is vendored and built from source (no\nJitPack); the build is reproducible with pinned tooling and dependency\nchecksum verification, and a CI workflow builds and lints the app on every\nchange.</li>\n</ul>\n"
    },
    {
      "version": "v1.2.1",
      "name": "v1.2.1",
      "datetime": "2026-06-22T15:32:24Z",
      "url": "https://github.com/kybl/meshcore-signal-tester/releases/tag/v1.2.1",
      "prerelease": false,
      "notes": "### Added\r\n\r\n- **Auto-reconnect** — an optional toggle that automatically retries the last\r\n  device after an unexpected drop, before the disconnect alarm. Shown only\r\n  where it can actually work (not for Bluetooth in a mobile browser).\r\n- **Nicer packet sound** — a pleasant bell whose pitch still tracks signal\r\n  strength, plus a new \"disconnect only\" sound mode. The disconnect alarm now\r\n  sounds on every unexpected drop.\r\n\r\n### Changed\r\n\r\n- **Location now starts automatically when you connect (Android)** — no need to\r\n  tap the 3D map's \"Enable location\" button anymore.\r\n- **Steadier location on the 3D map** — occasional GPS jumps (sudden ~200 m\r\n  hops) are filtered out.\r\n- **3D map zooms in to street level** even on large maps, and deep zoom is\r\n  smoother.\r\n- **3D camera framing** — \"Center on me\" no longer jerks at the end of its move,\r\n  and repeaters are framed with a little headroom above them.\r\n\r\n### Fixed\r\n\r\n- 2D charts could stop updating with Display set to **All**, until you switched\r\n  the Display window and back.\r\n- Help (?) tooltips could appear away from their icon.\r\n- Seen Repeaters now shows the true last RSSI/SNR, not a rounded/averaged value.\r\n- Received Packets always lists every repeater as a column, not only the ones on\r\n  the current page.\r\n- 3D map selection no longer clears itself on its own.\r\n- 3D map tiles no longer flicker while panning or zooming.\r\n- Footer text now has proper contrast in light mode.",
      "notesHtml": "<h3>Added</h3>\n<ul>\n<li><strong>Auto-reconnect</strong> — an optional toggle that automatically retries the last\ndevice after an unexpected drop, before the disconnect alarm. Shown only\nwhere it can actually work (not for Bluetooth in a mobile browser).</li>\n<li><strong>Nicer packet sound</strong> — a pleasant bell whose pitch still tracks signal\nstrength, plus a new \"disconnect only\" sound mode. The disconnect alarm now\nsounds on every unexpected drop.</li>\n</ul>\n<h3>Changed</h3>\n<ul>\n<li><strong>Location now starts automatically when you connect (Android)</strong> — no need to\ntap the 3D map's \"Enable location\" button anymore.</li>\n<li><strong>Steadier location on the 3D map</strong> — occasional GPS jumps (sudden ~200 m\nhops) are filtered out.</li>\n<li><strong>3D map zooms in to street level</strong> even on large maps, and deep zoom is\nsmoother.</li>\n<li><strong>3D camera framing</strong> — \"Center on me\" no longer jerks at the end of its move,\nand repeaters are framed with a little headroom above them.</li>\n</ul>\n<h3>Fixed</h3>\n<ul>\n<li>2D charts could stop updating with Display set to <strong>All</strong>, until you switched\nthe Display window and back.</li>\n<li>Help (?) tooltips could appear away from their icon.</li>\n<li>Seen Repeaters now shows the true last RSSI/SNR, not a rounded/averaged value.</li>\n<li>Received Packets always lists every repeater as a column, not only the ones on\nthe current page.</li>\n<li>3D map selection no longer clears itself on its own.</li>\n<li>3D map tiles no longer flicker while panning or zooming.</li>\n<li>Footer text now has proper contrast in light mode.</li>\n</ul>\n"
    },
    {
      "version": "v1.2.0",
      "name": "v1.2.0",
      "datetime": "2026-06-14T12:24:08Z",
      "url": "https://github.com/kybl/meshcore-signal-tester/releases/tag/v1.2.0",
      "prerelease": false,
      "notes": "## Added\r\n- **Zoomable 2D signal charts** — wheel or pinch to zoom the time axis, drag across a region to zoom in, drag/Shift+wheel to pan. Both charts stay aligned; double-click or **Reset zoom** to restore.\r\n- **Full capture history is now kept on disk, not just in memory** — \"Auto-remove: Never\" keeps the whole session without slowing down or running out of memory, your data survives a reload or crash (it offers to resume on launch), every view is consistent across the Display window, and CSV export covers the complete history.\r\n- **More 3D map styles** — CARTO (Dark Matter, Positron, Voyager, +no-label variants), Esri (Dark/Light Gray Canvas and satellite), more OpenStreetMap flavours, and a **None (no map)** option. In dark mode the area around the map is now black.\r\n\r\n## Changed\r\n- **Longer history durations** — Auto-remove and Display now offer **3 h** and **12 h** (10 min and 30 min were removed).\r\n- **The 3D map's \"Cluster radius\" setting is gone** — nearby points are grouped automatically based on zoom, so there's nothing to tune.\r\n\r\n## Fixed\r\n- **The Android app no longer freezes on a blank screen after running for hours**, and recovers on its own if the system reclaims it in the background.\r\n- **Packets captured before location was turned on are no longer placed at your current location on the 3D map** — position-less points aren't shown; CSV import likewise never assigns the current location to rows that have none.\r\n- **Connecting to a saved Bluetooth device while Bluetooth is off** now prompts you to turn it on instead of silently never connecting.\r\n- **A Bluetooth device you renamed after saving it** now connects under, and is re-saved with, its new name.\r\n- **Better light/dark readability** — the map's location-status text, the 3D-map fullscreen button, the packet detail panel and the page footer are now legible in both themes; map buttons no longer look stuck-pressed after a tap.",
      "notesHtml": "<h2>Added</h2>\n<ul>\n<li><strong>Zoomable 2D signal charts</strong> — wheel or pinch to zoom the time axis, drag across a region to zoom in, drag/Shift+wheel to pan. Both charts stay aligned; double-click or <strong>Reset zoom</strong> to restore.</li>\n<li><strong>Full capture history is now kept on disk, not just in memory</strong> — \"Auto-remove: Never\" keeps the whole session without slowing down or running out of memory, your data survives a reload or crash (it offers to resume on launch), every view is consistent across the Display window, and CSV export covers the complete history.</li>\n<li><strong>More 3D map styles</strong> — CARTO (Dark Matter, Positron, Voyager, +no-label variants), Esri (Dark/Light Gray Canvas and satellite), more OpenStreetMap flavours, and a <strong>None (no map)</strong> option. In dark mode the area around the map is now black.</li>\n</ul>\n<h2>Changed</h2>\n<ul>\n<li><strong>Longer history durations</strong> — Auto-remove and Display now offer <strong>3 h</strong> and <strong>12 h</strong> (10 min and 30 min were removed).</li>\n<li><strong>The 3D map's \"Cluster radius\" setting is gone</strong> — nearby points are grouped automatically based on zoom, so there's nothing to tune.</li>\n</ul>\n<h2>Fixed</h2>\n<ul>\n<li><strong>The Android app no longer freezes on a blank screen after running for hours</strong>, and recovers on its own if the system reclaims it in the background.</li>\n<li><strong>Packets captured before location was turned on are no longer placed at your current location on the 3D map</strong> — position-less points aren't shown; CSV import likewise never assigns the current location to rows that have none.</li>\n<li><strong>Connecting to a saved Bluetooth device while Bluetooth is off</strong> now prompts you to turn it on instead of silently never connecting.</li>\n<li><strong>A Bluetooth device you renamed after saving it</strong> now connects under, and is re-saved with, its new name.</li>\n<li><strong>Better light/dark readability</strong> — the map's location-status text, the 3D-map fullscreen button, the packet detail panel and the page footer are now legible in both themes; map buttons no longer look stuck-pressed after a tap.</li>\n</ul>\n"
    },
    {
      "version": "v1.1.0",
      "name": "v1.1.0",
      "datetime": "2026-06-07T06:32:56Z",
      "url": "https://github.com/kybl/meshcore-signal-tester/releases/tag/v1.1.0",
      "prerelease": false,
      "notes": "### Added\r\n\r\n- **Connect over USB** — plug a companion radio in with a USB cable instead of\r\n  using Bluetooth. Devices you've connected to before show up as buttons for\r\n  one-tap reconnecting.\r\n- **Repeater support** — you can now plug a MeshCore repeater into USB,\r\n  not just a companion radio; the app detects which kind it is on its own. With\r\n  special logging firmware it shows full detail for every packet; with normal\r\n  firmware it shows what it can read from the repeater's logs.\r\n- **Connect over WiFi (Android app only)** — reach a WiFi companion over your\r\n  network by typing in its IP address. Web browsers can't do this, so it works\r\n  only in the Android app.\r\n- **Android app niceties** — it now shows the current status in the phone's\r\n  notification bar (with a speaker icon while beep alerts are on, and a \"paused\"\r\n  marker when capture is stopped), opens web links in your normal browser, and\r\n  closes pop-ups when you press Back.\r\n- **3D map additions:**\r\n  - optionally show your own device's location on the map (off by default —\r\n    while on it keeps asking the device for its position, which can drain the\r\n    battery faster, so leave it off when you don't need it);\r\n  - a **Center on me** button that recentres the map and then follows you as\r\n    you move;\r\n  - pin repeaters to the map and point the camera at one;\r\n  - while capturing, the map keeps the area around you loaded so you don't drift\r\n    off the edge.\r\n- **Disconnect warning** — a clear full-screen alert if the connection drops\r\n  unexpectedly (cable unplugged, device reset, out of range). It stays quiet\r\n  when you disconnect on purpose.\r\n\r\n### Changed\r\n\r\n- **Tidier header** — the connect/disconnect buttons and the status are grouped\r\n  into one colour-coded box (red when disconnected, green when connected).\r\n- **Sound is easier to notice** — when the beep-on-each-packet sound is turned\r\n  on, its control turns yellow so you can see at a glance that it's on.\r\n- **Clearer repeater colors** — brighter and easier to tell apart.\r\n\r\n### Fixed\r\n\r\n- Trace packets now show the correct route (they used to show the wrong path).\r\n- Your contacts list no longer sometimes fails to finish loading.\r\n- The 3D map's \"Enable location\" button no longer freezes when your phone's\r\n  location is switched off — it works again once you turn location back on.\r\n- The same Bluetooth device no longer shows up several times in your list of\r\n  saved devices.\r\n- The 3D map's fullscreen button now works in the Android app (it did nothing\r\n  there before).\r\n\r\nPlus lots of smaller improvements throughout.",
      "notesHtml": "<h3>Added</h3>\n<ul>\n<li><strong>Connect over USB</strong> — plug a companion radio in with a USB cable instead of\nusing Bluetooth. Devices you've connected to before show up as buttons for\none-tap reconnecting.</li>\n<li><strong>Repeater support</strong> — you can now plug a MeshCore repeater into USB,\nnot just a companion radio; the app detects which kind it is on its own. With\nspecial logging firmware it shows full detail for every packet; with normal\nfirmware it shows what it can read from the repeater's logs.</li>\n<li><strong>Connect over WiFi (Android app only)</strong> — reach a WiFi companion over your\nnetwork by typing in its IP address. Web browsers can't do this, so it works\nonly in the Android app.</li>\n<li><strong>Android app niceties</strong> — it now shows the current status in the phone's\nnotification bar (with a speaker icon while beep alerts are on, and a \"paused\"\nmarker when capture is stopped), opens web links in your normal browser, and\ncloses pop-ups when you press Back.</li>\n<li><strong>3D map additions:</strong><ul>\n<li>optionally show your own device's location on the map (off by default —\nwhile on it keeps asking the device for its position, which can drain the\nbattery faster, so leave it off when you don't need it);</li>\n<li>a <strong>Center on me</strong> button that recentres the map and then follows you as\nyou move;</li>\n<li>pin repeaters to the map and point the camera at one;</li>\n<li>while capturing, the map keeps the area around you loaded so you don't drift\noff the edge.</li>\n</ul>\n</li>\n<li><strong>Disconnect warning</strong> — a clear full-screen alert if the connection drops\nunexpectedly (cable unplugged, device reset, out of range). It stays quiet\nwhen you disconnect on purpose.</li>\n</ul>\n<h3>Changed</h3>\n<ul>\n<li><strong>Tidier header</strong> — the connect/disconnect buttons and the status are grouped\ninto one colour-coded box (red when disconnected, green when connected).</li>\n<li><strong>Sound is easier to notice</strong> — when the beep-on-each-packet sound is turned\non, its control turns yellow so you can see at a glance that it's on.</li>\n<li><strong>Clearer repeater colors</strong> — brighter and easier to tell apart.</li>\n</ul>\n<h3>Fixed</h3>\n<ul>\n<li>Trace packets now show the correct route (they used to show the wrong path).</li>\n<li>Your contacts list no longer sometimes fails to finish loading.</li>\n<li>The 3D map's \"Enable location\" button no longer freezes when your phone's\nlocation is switched off — it works again once you turn location back on.</li>\n<li>The same Bluetooth device no longer shows up several times in your list of\nsaved devices.</li>\n<li>The 3D map's fullscreen button now works in the Android app (it did nothing\nthere before).</li>\n</ul>\n<p>Plus lots of smaller improvements throughout.</p>\n"
    },
    {
      "version": "v1.0.0",
      "name": "v1.0.0",
      "datetime": "2026-05-31T12:20:21Z",
      "url": "https://github.com/kybl/meshcore-signal-tester/releases/tag/v1.0.0",
      "prerelease": false,
      "notes": "First release of MeshCore Signal Tester",
      "notesHtml": "<p>First release of MeshCore Signal Tester</p>\n"
    }
  ],
  "changelogSource": "github",
  "changelogUpdatedAt": "2026-07-10T17:50:02.328Z"
}
