LoRa mesh hardware identifiers¶
Generated by scripts/gen_lora_inventory.py from the sweep in
scripts/lora-sweep.sh. Do not edit by hand — regenerate.
Generated: 2026-08-28
Board definitions read: 107 across meshcore, meshtastic
Distinct USB identifiers: 26
Identifiers claimed by more than one board: 13
Already flagged ambiguous: 14 of 26
Why this source exists¶
Meshtastic and MeshCore build with PlatformIO, so every supported board ships a boards/*.json naming the identifiers its flasher looks for. Curated, machine-readable, and maintained by the people who ship the firmware — the same reasons Debian's udev rules were worth mining.
It is also the only way this catalog's meshtastic entry can be closed. The maintainer's boards were lost in a flood, and Meshtastic was never one device — it is firmware that runs on a hundred. Upstream publishes what all hundred present, and none has to be on a desk.
The finding¶
107 board definitions. 26 identifiers. The top six cover 201 of them.
That is the D-028 argument arriving from a third independent direction, and in its most extreme form yet. The Debian sweep found bridge chips shared by unrelated products; this finds an entire product category built on a handful of modules, where the identifier tells you which module a board uses and nothing whatever about which board it is.
| Identifier | Boards | Flagged | Examples |
|---|---|---|---|
303a:1001 |
49 | yes | meshcore:BQ Station G2, meshcore:ELECROW ThinkNode M7, meshcore:ESP32-S3-WROOM-1-N4 (4 MB Flash, No PSRAM) |
239a:0029 |
41 | yes | meshcore:BQ nRF52840, meshcore:Heltec Mesh Node T1 Board, meshcore:Heltec Mesh Solar Board |
239a:002a |
41 | yes | meshcore:BQ nRF52840, meshcore:Heltec Mesh Node T1 Board, meshcore:Heltec Mesh Solar Board |
239a:8029 |
29 | yes | meshcore:BQ nRF52840, meshcore:Heltec Mesh Node T1 Board, meshcore:Heltec Mesh Solar Board |
239a:802a |
25 | yes | meshcore:BQ nRF52840, meshcore:Heltec Mesh Node T1 Board, meshcore:Heltec Mesh Solar Board |
239a:4405 |
16 | yes | meshcore:Heltec Tower V2 Board, meshcore:Heltec nrf (Adafruit BSP), meshcore:elecrow eink |
303a:0002 |
8 | yes | meshcore:Heltec Vision Master E213, meshcore:Heltec Vision Master E290, meshcore:Heltec Vision Master T190 |
2886:1667 |
6 | yes | meshcore:Seeed Wio Tracker L1, meshtastic:Heltec Mesh Node T1, meshtastic:Heltec RC52 |
239a:00b3 |
4 | yes | meshcore:Keepteen LT1, meshcore:ProMicro NRF52840, meshtastic:MeshLink |
2886:0059 |
4 | yes | meshcore:Seeed Studio XIAO nRF52840, meshtastic:icarus, meshtastic:seeed-xiao-s3 |
239a:0071 |
3 | yes | meshcore:Heltec Tower V2 Board, meshtastic:Heltec MeshTower V2 (Adafruit BSP), meshtastic:Heltec nrf (Adafruit BSP) |
2886:0057 |
3 | yes | meshcore:Seeed SenseCAP MeshTracker X1, meshtastic:Seeed Mesh Tracker X1, meshtastic:Seeed T1000-E |
2886:1668 |
3 | yes | meshcore:Seeed Wio Tracker L1, meshtastic:seeed_wio_tracker_L1, meshtastic:seeed_wio_tracker_L1_Pro_1W |
2886:8044 |
1 | no | meshcore:Seeed Studio XIAO nRF52840 |
2886:0044 |
1 | no | meshcore:Seeed Studio XIAO nRF52840 |
13 identifiers are claimed by exactly one board definition. Those are the ones a udev rule could safely name — and being single-use in this dataset is not proof of being single-use in the world, which is why they are not promoted to safe on that basis alone.
What this does not settle¶
A board definition is what the flasher matches, not necessarily what the board reports. These identifiers come from firmware build metadata; a running board's descriptor may carry a manufacturer or product string the JSON never mentions, and that string is exactly what would make a safe symlink possible. Only a capture shows it.
So this closes the identifier question for a hundred boards and leaves the distinguishability question open for all of them. The 33 identifiers taken from udev rules shipped alongside the firmware are on the same footing.
Nothing here is maintainer_verified. D-027 keeps that separate: upstream metadata is good evidence that an identifier is correct and no evidence at all that anyone here has run the hardware.
Which product strings are worth asking for¶
Not all of them, and working out which is the useful part. A product string is only worth collecting where it can distinguish a board — and for the largest identifier family here it provably cannot.
| Identifier | Boards | Product string here | Worth asking? |
|---|---|---|---|
303a:1001 |
49 | USB JTAG/serial debug unit |
no — the string is the chip's, not the board's |
239a:0029 |
41 | not read here | yes |
239a:002a |
41 | not read here | yes |
239a:8029 |
29 | not read here | yes |
239a:802a |
25 | not read here | yes |
239a:4405 |
16 | not read here | yes |
303a:0002 |
8 | not read here | yes |
2886:1667 |
6 | not read here | yes |
239a:00b3 |
4 | not read here | yes |
2886:0059 |
4 | not read here | yes |
239a:0071 |
3 | not read here | yes |
2886:0057 |
3 | not read here | yes |
2886:1668 |
3 | not read here | yes |
2886:8044 |
1 | not read here | yes |
2886:0044 |
1 | not read here | yes |
239a:009f |
1 | not read here | yes |
303a:80d6 |
1 | not read here | yes |
239a:cafe |
1 | not read here | yes |
239a:4404 |
1 | not read here | yes |
1a86:7523 |
1 | not read here | yes |
2886:0166 |
1 | not read here | yes |
239a:00da |
1 | not read here | yes |
16d0:1178 |
1 | not read here | yes |
239a:810b |
1 | not read here | yes |
239a:010b |
1 | not read here | yes |
239a:810c |
1 | not read here | yes |
67 of the 107 board definitions sit behind an identifier whose product string nobody here has read. Those are the useful captures. The ESP32-S3 family is deliberately excluded: 303a:1001 was captured three times on 2026-08-26 — a Clip-Boy, a Minino and the ESP32-S3 inside a Free-WiLi 2 — and all three reported the identical product string, USB JTAG/serial debug unit. That is the ROM's, not the board's. No capture of an ESP32-S3 board using native USB can distinguish it from another, which is worth knowing before asking 49 boards' worth of owners for one.
The nRF52840 families are the opposite case: their UF2 bootloaders are built per board, so the string is usually the board's own name. That is where a thirty-second capture buys something, and it is what .github/ISSUE_TEMPLATE/lora-product-string.yml asks for.