Uh oh!
There was an error while loading. Please reload this page.
feat(keychron): add M6 wired and receiver support - #33
Conversation
b08a43c to
201cd48CompareAssisted-by: Codex
201cd48 to
4cfcb4fCompareydw1904
commented
Aug 25, 2026
Companion PR in the web app: OpenMouse-Project/openmouse#128 (draft, blocked on this one). Worth flagging because this PR alone does not make the M6 usable. #128 adds one entry to Verified on wired hardware with both PRs applied: connects, reports 800 DPI / 500 Hz / battery, and a DPI change flashes and reads back. |
Uh oh!
There was an error while loading. Please reload this page.
Combines the M6 PR (#33) and Nape Pro PR (#29), which both branched before the other landed and independently touched keychron/index.ts and registry.ts. Retires the generic KeychronHidClient (keychron/hid.ts): nape-hid.ts is a strict superset of it and both matched the exact same product IDs, so every Nape Pro device was claimable by two drivers (caught by registry.test.ts). This matches this PR's own stated intent ("keep the Keychron driver Nape-only"). Build and full test suite pass (544/544). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Combines the M6 PR (#33) and Nape Pro PR (#29), which both branched before the other landed and independently touched keychron/index.ts and registry.ts. Retires the generic KeychronHidClient (keychron/hid.ts): nape-hid.ts is a strict superset of it and both matched the exact same product IDs, so every Nape Pro device was claimable by two drivers (caught by registry.test.ts). This matches this PR's own stated intent ("keep the Keychron driver Nape-only"). Build and full test suite pass (544/544). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The M6 driver in @openmouse/protocol is enough for the registry to detect the mouse, but not for the app to drive it: the sidebar lists it as "Keychron · Available" and activating it fails with client.describeCollections is not a function pulsarClient() is a negative check — any active client not listed in DEDICATED is assumed to be a Pulsar client and routed into showPulsarExplorer(), which calls describeCollections(), a method only the Pulsar drivers have. A new driver class is therefore broken by default until it is named here, and the error points nowhere near the cause. KeychronM6HidClient joins NEEDS_OPEN, next to the Nape Pro's KeychronHidClient: its open() is what attaches the input-report listener its query/reply exchanges depend on, and NEEDS_OPEN feeds DEDICATED, so one entry covers both. Verified on a wired Keychron M6: the device connects and reports 800 DPI, 500 Hz, and battery, and a DPI change flashes to the mouse and reads back. Needs the M6 driver from OpenMouse-Project/mouse-protocol#33.
Summary
Scope
Hardware validation
Tests
Assisted by Codex.