Repository navigation
Labels
Description
Missing device: Arbiter Polar 65+ Gaming Keyboard 0x371C:0xA009 (14108:40969)
Reporter evidence (verbatim)
- Model: Polar 65+ Gaming Keyboard, vendor string "Arbiter"
- IDs: decimal
14108:40969= hex0x371C:0xA009 - Bridge log:
[17:29:46] USB device added: path=\\?\usb#vid_371c&pid_a009#a&32a63c54&0&2#{a5dcbf10-6530-11d2-901f-00c04fb951ed} vendor=14108 "Arbiter", product=40969 "Polar 65+ Gaming Keyboard", serial="", driver="usbccgp", guid=f27d5fb4-eba4-4668-b166-5e2317ada669
- Transport: USB (usbccgp), wired. OS / browser / Bridge version still needed.
- Symptom: Arbiter Studio shows in changelog 2026-10-30, but this board does not appear in the web connect picker.
Code findings
- Catalog
src/arbiter/index.ts(ARBITER_PRODUCTS, from vendor bundle retrieved 2026-10-30,docs/arbiter-support.md) contains 8 entries:0x1A81:0x2072x2 (FF01/FF02),0x1A81:0x208E(FF02),0x1A81:0x2077(FF01)0x371C:0xA005(FF02),0x371C:0xA006(FF01),0x371C:0xA003(FF02),0x371C:0xA001(FF02)- No
0xA009. Every entry isverified: false.
- Driver
src/drivers/arbiter/hid.ts:productFor()matches exact(vendorId, productId)+hasCollection(collections, entry.usagePage);isSupported()returns false for0x371C:0xA009, so registry yields no driver. - Filters
src/drivers/vendors.ts:ARBITER_HID_FILTERS = ARBITER_PRODUCTS.map(...)— picker only lists cataloged PID+usagePage pairs, so0xA009is filtered out ofSUPPORTED_HID_FILTERS. This matches the reported symptom (added but not visible). - Web app
OpenMouse-Project/openmouseis already on@openmouse/keyboard-protocol@1.4.0(includes Arbiter), so this is a missing-catalog-entry, not a version lag.
What this means
Single missing-driver cause: no settings writes can reach this board until a catalog entry + filter exists. Not a per-setting bug.
Diagnostics still needed from reporter
- Copy diagnostics output (web Overview → Refresh, under identity) or
about://device-logline — need HID collections / usage page (0xFF01vs0xFF02) and usage. - Confirm: wired vs 2.4GHz vs BT, OS + browser, Bridge version if used.
- Vendor web app (
app.arbiterstudio.com) behavior for0xA009if accessible: protocol class (yl/s2/i2/u2), travel/binding table sizes, layers/profiles, superTap — or a USB capture of the vendor app configuring this board.0xA009was not in the bundle analyzed 2026-10-30, so the row cannot be copied from an existing one.
Activity
snekxs commentedon Oct 31, 2026
Reporter follow-up (verbatim):
Notes: only
mi_00\kbd(boot keyboard) enumerated here,reportDescriptorempty. Config collection (0xFF01/0xFF02, usage 1) not yet captured — still need webOverview → Refresh/about://device-loglisting with HID collections + usage pages to place the0x371C:0xA009catalog row.snekxs commentedon Oct 31, 2026
Full
about://device-logfrom reporter (verbatim, wired Win11 Pro 25H2, Brave):Notes:
mi_00(kbd),mi_01&col02,mi_02,mi_03. All with emptyreportDescriptor, so usage page (0xFF01vs0xFF02) still unknown.mi_01&col02 ... &0001is the most likely config-collection candidate (other Arbiter boards expose config on a non-kbd interface), but cannot be confirmed without collections.device.collectionsdump (usagePage/usage per collection) vianavigator.hid.requestDevice({filters: []})+ log, or a USB capture of the vendor web app configuring0xA009to determine protocol class (yl/s2/i2/u2) + table sizes + layers/profiles/superTap.snekxs commentedon Oct 31, 2026
WebHID
collectionsdump from reporter (stitched pt1+pt2,0x371C:0xA009):usagePage: 65281=0xFF01,usage: 1,type: 1inputReports[0]:reportId: 0,reportCount: 64,reportSize: 8,usages: [4278255618]=0xFF010002outputReports[0]:reportId: 0,reportCount: 64,reportSize: 8,usages: [4278255619]=0xFF010003featureReports: [],children: []This matches the Arbiter transport (64-byte frames, report id 0) on the
0xFF01config collection. So the missing catalog row isvendorId 0x371C, productId 0xA009, usagePage 0xFF01, usage 1.Still open: protocol class (
yl/s2/i2/u2),travelKeys/bindingKeys, layers/profiles/superTap for0xA009.0xA009was not in the vendor bundle analyzed 2026-10-30. Existing0xFF01rows for reference:0x1A81:0x2072(yl, 68/68, 1 layer, 1 profile),0x1A81:0x2077(yl, 68/68),0x371C:0xA006(s2, 69/69). Do not copy blind — needs vendor-app capture or hardware trial.snekxs commentedon Oct 31, 2026
Capture verified:
unseenArbiter.pcapng(27MB, USBPcap linktype 249, 148,874 packets) contains Arbiter-protocol traffic for this board.Decoded 64-byte frames with valid checksums (
(85 - sum(b0..62)) & 0xFF == b63,logDevice=0):getFirmware(cmd 2): reqdsize=0, replydsize=8data0900440000210004getSerial(cmd 13): reqdsize=0, replydsize=19(serial redacted, formatZDK70...0386)getUserMode(cmd 53): reqdsize=6, replydsize=10data0000000101001f210000This matches
ARBITER_COMMAND(2/13/53) and the 64-byte report-0 framing, so the capture is the vendor app talking to0x371C:0xA009on its0xFF01collection. Correct device, correct interface.Still needed for the catalog row:
getTravel(cmd 1) +getKeyMapping(cmd 27) reads to fixtravelKeys/bindingKeys, layers/profiles/superTap. Current capture only shows firmware/serial/userMode — a longer capture while clicking actuation / key-remap / lighting pages in the vendor app (or noting layers/profiles/SuperTap in the UI) will settle the protocol class (yl/s2/i2/u2).github-actions commentedon Oct 31, 2026
🎉 This issue has been resolved in version 1.5.0 🎉
The release is available on:
Your semantic-release bot 📦🚀
snekxs commentedon Oct 31, 2026
Update 2: root cause of the post-release silence + fix PR
The overlooked console dump was the key. It shows the board exposes two vendor config collections:
0xFF01(in/out usages...02/...03) and0xFF02(usages...03/...04), plus the boot-keyboard and consumer collections. #11 put the row on0xFF01— the wrong one, which is why the board claimed but never answered.Three independent lines of proof that
0xFF02is the live interface:0x04/0x84); interface 2 is completely silent.Polar 65+, 14108:40969, usagePage 65282, and its device picker only claims collections withusagePage == 65282.65282appears 3x in the bundle,65281zero times.Fix: PR #12 moves the
0xA009row to0xFF02and pins it in tests. Suite384 pass / 0 fail, build clean.Also discovered: the same vendor bundle lists a second Polar 65+ variant, product 40976 (
0x371C:0xA010), on0xFF02with a different protocol class — no capture exists for it yet, so no row. If another 65+ shows up with a different PID, that's the first place to look.github-actions commentedon Oct 31, 2026
🎉 This issue has been resolved in version 1.6.1 🎉
The release is available on:
Your semantic-release bot 📦🚀