udev identifier inventory¶
Generated by scripts/gen_udev_inventory.py from the sweep in
scripts/udev-sweep.sh. Do not edit by hand — regenerate.
Swept: 2026-09-12, debian-13
Packages shipping udev rules: 125
Distinct USB identifiers found: 1965
Already in our hardware catalog: 280
Available and not yet carried: 1685
What this is¶
A distribution's udev rules are a primary source about hardware we will never own, written and maintained by the people who ship the drivers. They are the same kind of asset as the Debian Blend task lists: curated, machine-readable, and unmined by anyone in this space.
The rtl-sdr entry is why this exists. It carried three identifiers and Debian's librtlsdr0 rule carries 42 — the missing 39 being rebadged DVB-T sticks from Hauppauge, Terratec, Dexatek and Gigabyte, all RTL2832U underneath. Every one of those meant a working device with no /dev symlink and no error message anywhere in the chain, which is the failure this catalog refuses to guess its way into, reached by omission instead.
Nothing is filtered out of the sweep. Every package in the archive that ships a udev rule is downloaded and read — a curated shortlist is how the rtl-sdr gap happened in the first place. The section split below decides only what gets a detailed table. That claim was true of packages and false of syntax until 2026-09-12: the parser read only ATTRS{idVendor}, and a rule written as ENV{PRODUCT}=="403/de58/*" or ENV{ID_VENDOR_ID} had no row — brltty's whole file, among others. All three syntaxes are read now (scripts/udev_rule_pairs.py, D-047); brltty itself ships no rules on Debian 13, and docs/reference/brltty-inventory.md measures it on the targets that do.
By archive section¶
| Section | Packages | Identifiers | Not yet carried |
|---|---|---|---|
| libs | 28 | 273 | 203 |
| utils | 19 | 191 | 189 |
| electronics | 17 | 134 | 16 |
| admin | 16 | 273 | 272 |
| science | 8 | 20 | 9 |
| misc | 7 | 33 | 20 |
| hamradio | 5 | 9 | 5 |
| devel | 4 | 13 | 12 |
| sound | 3 | 88 | 88 |
| graphics | 2 | 35 | 35 |
| games | 2 | 59 | 59 |
| net | 2 | 23 | 23 |
| libdevel | 2 | 2 | 1 |
| comm | 2 | 720 | 715 |
| video | 2 | 49 | 49 |
| python | 2 | 8 | 8 |
| metapackages | 1 | 3 | 3 |
| embedded | 1 | 100 | 0 |
| kde | 1 | 7 | 7 |
| perl | 1 | 40 | 40 |
Bold sections are the ones detailed below. The others are printers, scanners, storage, input devices and desktop plumbing — swept and counted, not tabulated.
Packages worth mining¶
Ordered by how many identifiers they carry that we do not.
| Package | Section | Rule file | Identifiers | Not yet carried |
|---|---|---|---|---|
usb-modeswitch-data |
comm | 40-usb_modeswitch.rules |
414 | 414 |
modemmanager |
comm | 77-mm-broadmobi-port-types.rules |
320 | 315 |
libsigrok4t64 |
libs | 60-libsigrok.rules |
88 | 84 |
libgphoto2-6t64 |
libs | 60-libgphoto2-6t64.rules |
33 | 33 |
knxd |
net | 60-knxd.rules |
22 | 22 |
libifd-cyberjack6 |
libs | 60-libifd-cyberjack6.rules |
19 | 19 |
libnjb5 |
libs | 45-libnjb.rules |
14 | 14 |
libnitrokey-common |
libs | 41-nitrokey.rules |
12 | 11 |
qlcplus |
misc | z65-anyma-udmx.rules |
11 | 9 |
libam7xxx0.1 |
libs | 60-libam7xxx0.1.rules |
6 | 6 |
ola |
electronics | 60-ola.rules |
8 | 6 |
libticables2-8 |
libs | 69-libticables2-8.rules |
5 | 5 |
0xffff |
misc | 60-0xffff.rules |
4 | 4 |
libdjconsole-data |
libs | 45-hpdjconsole.rules |
4 | 4 |
libx52pro0 |
libs | 60-x52pro.rules |
4 | 4 |
dfu-util |
electronics | 60-dfu-util.rules |
3 | 3 |
goldencheetah |
misc | 60-goldencheetah.rules |
3 | 3 |
indi-dsi |
science | 99-meadedsi.rules |
3 | 3 |
libccid |
libs | 92-libccid.rules |
3 | 3 |
libfreenect0.5t64 |
libs | 60-libfreenect0.5t64.rules |
3 | 3 |
libhackrf0 |
libs | 60-libhackrf0.rules |
6 | 3 |
linuxcnc-uspace |
misc | 99-shuttle.rules |
3 | 3 |
tucnak |
hamradio | 60-tucnak.rules |
3 | 3 |
ubertooth |
science | 40-ubertooth.rules |
5 | 3 |
libbmusb6 |
libs | 70-bmusb.rules |
2 | 2 |
libm2k0.9.0 |
libs | 53-adi-m2k-usb-0.9.0.rules |
2 | 2 |
libmirisdr4 |
libs | 60-libmirisdr4.rules |
4 | 2 |
libmtp-common |
libs | 69-libmtp.rules |
2 | 2 |
libnxt |
electronics | 60-libnxt.rules |
2 | 2 |
usbrelay |
electronics | 92-usbrelay.rules |
2 | 2 |
direwolf |
hamradio | 99-direwolf-cmedia.rules |
1 | 1 |
dmrconfig |
hamradio | 60-dmrconfig.rules |
3 | 1 |
eegdev-plugins-free |
libs | 60-eegdev-plugins-free.rules |
1 | 1 |
eg25-manager |
net | 80-modem-eg25.rules |
1 | 1 |
galileo |
science | 98-galileo.rules |
1 | 1 |
galileo-daemon |
science | 99-galileo-daemon.rules |
1 | 1 |
indi-armadillo-platypus |
science | 99-armadilloplatypus.rules |
1 | 1 |
indi-ffmv |
science | 99-fireflymv.rules |
1 | 1 |
kodi-peripheral-xarcade |
libs | 60-kodi-peripheral-xarcade.rules |
1 | 1 |
libbladerf2 |
libs | 88-nuand-bladerf1.rules |
4 | 1 |
libirecovery-common |
libs | 39-libirecovery.rules |
1 | 1 |
libosmosdr0 |
libs | 60-libosmosdr0.rules |
1 | 1 |
libxtrxll0t64 |
libs | 50-libxtrxll0t64.rules |
1 | 1 |
limesuite-udev |
libs | 64-limesuite.rules |
5 | 1 |
mspdebug |
electronics | 92-mspdebug.rules |
1 | 1 |
nbc |
electronics | 60-nbc.rules |
1 | 1 |
qdmr |
hamradio | 60-qdmr.rules |
3 | 1 |
qflipper |
electronics | 42-flipperzero.rules |
3 | 1 |
solaar |
misc | 60-solaar.rules |
1 | 1 |
srcpd |
electronics | 10-liusb.rules |
1 | 1 |
t2n |
electronics | 60-t2n.rules |
1 | 1 |
w1retap |
electronics | 60-w1retap.rules |
1 | 1 |
Fully carried already: avarice, avrdude, flashrom, fpga-icestorm, gpsd, gr-funcube, libairspy0, libairspyhf1, libhamlib4t64, libnfc6, librtlsdr0, mtkbabel, openfpgaloader, openocd, qthid-fcd-controller, spectools, stlink-tools, uhd-host.
What the first sweep found¶
Curated, like the blocking assessment in gen_hardware_gaps.py: the counts above are measured, this section is judgement.
Two gaps closed without owning anything.
- LimeSDR. The entry said "no USB identifier confirmed, and the maintainer does not own the hardware to confirm one". Debian's
limesuite-udevships64-limesuite.rules, which names the board:1d50:6108, plus the FT601 the Mini uses. Nowstatus: supportedwith nomaintainer_verified— the D-027 shape exactly. - Flipper Zero. Debian packages
qflipperand its rule names all three modes. A device the catalog should obviously have carried, surfaced by a sweep rather than by someone remembering it.
The hazard, which is the mirror image of the gap this method fixed.
Not every identifier in a rule identifies the device the rule is for. 64-limesuite.rules also lists 0403:6001 (FTDI FT232 serial) and 04b4:8613 (the stock Cypress FX2 development kit); LimeSuite matches them because it probes, not because they mean LimeSDR. A SYMLINK on 0403:6001 would name every FTDI adapter on the machine /dev/limesdr.
0483:df11 is the sharper case: it is STMicroelectronics' generic STM32 DFU identifier, and this sweep found it in both qflipper's rule and dmrconfig's, where it is a TYT MD-UV380 radio. Two unrelated devices, one pair. It is safe as a firmware target, where the operator chose the device, and unsafe as a symlink rule, where the kernel matches whatever is attached — so the Flipper entry records it under firmware and not under usb_ids.
Under-matching is silent and over-matching is silent. A sweep produces candidates, not answers, and the judgement about which is which is the part that cannot be generated.
Still on the table, in rough order of value to this project:
| Source | Identifiers | What it is |
|---|---|---|
qdmr, dmrconfig |
3 each | DMR radio programming — TYT MD-UV380, Baofeng RD-5R/TD-5R |
gpsd |
11 | GPS receivers: u-blox 5/6/7/8, Garmin, DeLorme. CLAUDE.md names GPS as a hardware need |
gr-funcube |
2 | FUNcube Dongle Pro and Pro+ |
spectools |
9 | MetaGeek Wi-Spy 2.4 GHz spectrum analysers |
direwolf |
1 | The "All In One Cable" packet interface |
tucnak |
3 | OK1ZIA contest hardware and an antenna rotator |
libsigrok4t64 |
88 | Logic analysers and bench instruments — a plausible electronics profile |
openocd, stlink-tools, avrdude, flashrom, openfpgaloader |
200+ | Programmers and flashers, for a hardware-hacking profile |
The 1,800-odd remaining identifiers are printers, scanners, cameras, game controllers and desktop plumbing. Counted above so the number is honest, and deliberately not mined: an identifier is only worth carrying when a device entry gives it a purpose.
How to use this¶
An identifier here is evidence, not a device entry. Adding one means deciding which device or class it belongs to and writing the prose that makes it useful — this document says what is available, not what is already decided.
Every identifier added from a sweep cites the rule file it came from in its evidence field, exactly as a capture from real hardware cites the lsusb that produced it. Both are primary sources; neither is a guess.
This closes gaps for hardware nobody here owns, which is most of it. It does not make a device maintainer_verified — that is a separate claim about whether anyone ran it, and D-027 keeps the two apart.