Skip to content

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.