Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
352 commits
Select commit Hold shift + click to select a range
ff6e1cd
fix(logitech): stop offering surface and lift-off controls the G309 d…
jazzstack Aug 6, 2026
796c8e8
Merge branch 'dev' into dev
viix0dev Aug 6, 2026
b3c8a7b
Merge pull request #41 from jazzstack/g309-fix
snekxs Aug 8, 2026
334154d
Merge pull request #33 from dwei30/razer-viper-v2-pro
snekxs Aug 8, 2026
0a99384
Merge pull request #40 from jazzstack/razer-viper-mini
snekxs Aug 8, 2026
60b77d1
build: account for Viper Mini protocol driver
snekxs Aug 8, 2026
672fa04
Merge pull request #32 from Pochiiko/viper-v3-pro-sleep-low-power
snekxs Aug 8, 2026
f560b51
fix(razer): integrate Viper power controls with Mini driver
snekxs Aug 8, 2026
4f390ff
Merge pull request #34 from viix0dev/g403-deathadder-support
snekxs Aug 8, 2026
d131de2
Merge dev into feat/razer-lift-off-distance
snekxs Aug 8, 2026
2df0294
Add Keychron Nape Pro WebHID support.
dwei30 Aug 5, 2026
22ed285
Pass bundle and dependency checks
snekxs Aug 8, 2026
ee32d46
Fix Keychron client constructor for Node strip-only tests.
dwei30 Aug 8, 2026
6907975
Merge pull request #37 from Pochiiko/feat/razer-lift-off-distance
snekxs Aug 8, 2026
f700282
Raise JS bundle budget for Keychron Nape Pro.
dwei30 Aug 8, 2026
da7bc5a
Merge branch 'dev' into add-keychron-nape-pro
dwei30 Aug 8, 2026
20d6c6f
feat(razer): add Viper Mini lighting with verified effect payloads
jazzstack Aug 8, 2026
a5267d2
build: raise bundle budgets for the Viper Mini lighting feature
jazzstack Aug 8, 2026
a3cf1aa
feat(Razer): Adding Support for 100+ mouses
viix0dev Aug 8, 2026
dfee262
Fix: CI / check (pull_request) error fix
viix0dev Aug 8, 2026
ba42714
Fix: CI Action error
viix0dev Aug 8, 2026
38d1887
Add Logi Bolt transport for MX Master 3S over 046d:c548.
dwei30 Aug 8, 2026
d9d30ed
Raise JS bundle budget for Logi Bolt / MX Master 3S.
dwei30 Aug 8, 2026
3f1e91a
fix(razer): retry corrupt replies after an 8K polling switch
jazzstack Aug 8, 2026
c6486e4
fix(razer): retry corrupt replies after an 8K polling switch
jazzstack Aug 8, 2026
1149d50
feat(teevolution): complete Terra Pro controls
dwei30 Aug 8, 2026
1b88b78
build: account for Teevolution bundle growth
dwei30 Aug 8, 2026
3a1bc8a
fix(logitech): write polling rate to onboard profile for direct-conne…
jazzstack Aug 8, 2026
672c061
Port the moddoMOUSE into the new src/devices structure
jus-kim Aug 8, 2026
611854d
fix(logitech): connect G305 receivers by probing slot 0x01 first
jazzstack Aug 8, 2026
e191af2
Legacy
AngeloCore Aug 6, 2026
0546110
Verify profile 3 and extended verification data
AngeloCore Aug 6, 2026
57c6568
Verification tool
AngeloCore Aug 6, 2026
27ca2c1
asdd
AngeloCore Aug 6, 2026
ea04ad0
bbb
AngeloCore Aug 6, 2026
1cedf56
fix(logitech): hide surface and LightForce controls on the G305
jazzstack Aug 8, 2026
8416bcb
Fix per-device issues
AngeloCore Aug 6, 2026
4265c64
aaa
AngeloCore Aug 7, 2026
dee05eb
.
AngeloCore Aug 8, 2026
cbfa4fd
Verify profile 2 writing
AngeloCore Aug 8, 2026
dc840fa
Increase bundle size
AngeloCore Aug 8, 2026
a492b14
added support for base razer viper
FormunaGit Aug 8, 2026
9a3a314
Merge pull request #50
snekxs Aug 9, 2026
19190e9
Merge pull request #54
snekxs Aug 9, 2026
b54e57b
wlmouse
nyedle Aug 9, 2026
cefb873
QoL & Offline
nyedle Aug 9, 2026
ce439a7
UI
nyedle Aug 9, 2026
7e2809b
Merge pull request #57 from nyedle/dev
snekxs Aug 9, 2026
f45c73a
feat(razer): add DeathAdder V2 support with no-store DPI reads
jazzstack Aug 8, 2026
b43b7a1
fix(razer): offer the DeathAdder V2 in the device picker
jazzstack Aug 8, 2026
37d15f9
fix(razer): explain macOS Input Monitoring on open failure
jazzstack Aug 8, 2026
875e29e
build: raise JS bundle budget for the DeathAdder V2 driver
jazzstack Aug 9, 2026
fb9b381
test(razer): drop dead corrupt-send plumbing from the fake mouse
jazzstack Aug 9, 2026
9858e43
feat(razer): add Viper Mini lighting with verified effect payloads
jazzstack Aug 8, 2026
b6e3829
build: raise bundle budgets for the Viper Mini lighting feature
jazzstack Aug 8, 2026
fcce50f
fix(razer): retry corrupt replies after an 8K polling switch
jazzstack Aug 8, 2026
c9fb41d
Merge branch 'OpenMouse-Project:dev' into dev
viix0dev Aug 9, 2026
2ce95cb
hotfix(Razer): polling rate writes on the Razer Viper V3 HyperSpeed
viix0dev Aug 9, 2026
18033b2
fix(Razer): Audit Razer transaction ids per-PID against OpenRazer
viix0dev Aug 9, 2026
4e2d52b
fix(logitech): find merged-receiver mice beyond slot 0x01
jazzstack Aug 9, 2026
9ff61de
fix(Razer): Gate Razer lift-off behind a per-product flag
viix0dev Aug 9, 2026
c93f0ca
test(logitech): drop unused report-id constant
jazzstack Aug 9, 2026
6bfe399
feat(Razer): Adding tests for DeathAdder V3 Pro
viix0dev Aug 9, 2026
83efe00
fix(razer): DeathAdder V3 Pro receiver polls on the legacy command
viix0dev Aug 9, 2026
39ef7a2
Merge pull request #43 from dwei30/add-keychron-nape-pro
snekxs Aug 9, 2026
225271e
Merge pull request #52 from jus-kim/moddomouse-support
snekxs Aug 9, 2026
fc429c9
Merge pull request #49 from dwei30/add-teevolution-terra-pro
snekxs Aug 9, 2026
fb90d6d
Merge pull request #53 from AngeloCore/dev
snekxs Aug 9, 2026
c13832d
Merge pull request #46 from dwei30/add-logitech-bolt-mx-master-3s
snekxs Aug 9, 2026
91a4427
Merge pull request #45 from viix0dev/dev
snekxs Aug 9, 2026
4bf29ca
Merge pull request #44 from jazzstack/feat/razer-viper-mini-lighting
snekxs Aug 9, 2026
e8f9abd
Merge pull request #48 from jazzstack/hotfix/razer-v3-pro-8k
snekxs Aug 9, 2026
e8dd8c3
Merge pull request #56 from FormunaGit/dev
snekxs Aug 9, 2026
710464d
Merge pull request #58 from jazzstack/feat/razer-deathadder-v2
snekxs Aug 9, 2026
b2ac8c5
Merge pull request #59 from jazzstack/g502-fix
snekxs Aug 9, 2026
84434ac
fix: reconcile merged mouse driver changes
snekxs Aug 9, 2026
94901d9
refactor: consume shared mouse protocol library
snekxs Aug 9, 2026
20c5045
ci: approve shared protocol dependency
snekxs Aug 9, 2026
38ddda4
chore: update mouse protocol library
snekxs Aug 9, 2026
b65ec84
refactor: consume shared WebHID drivers
snekxs Aug 9, 2026
64befdb
feat: redesign control workspace
snekxs Aug 9, 2026
7066ebe
feat: make workspace sections true tabs
snekxs Aug 9, 2026
648ecd4
feat: add persistent device picker
snekxs Aug 9, 2026
6fa1d31
feat: add OP1 8K device artwork
snekxs Aug 9, 2026
5b9161e
fix: prevent DPI controls from clipping
snekxs Aug 9, 2026
ac9a7f7
chore: update mouse protocol dependency
snekxs Aug 9, 2026
1756d80
chore: update mouse protocol dependency
snekxs Aug 10, 2026
7b0078d
allow root git deps via .npmrc
nyedle Aug 10, 2026
74c00f1
Merge branch 'dev' of main:OpenMouse-Project/openmouse into dev
nyedle Aug 10, 2026
0971d9b
Add Ninjutso devices to OpenMouse
snekxs Aug 10, 2026
53f8225
chore: update mouse protocol dependency
snekxs Aug 10, 2026
b8e6494
chore: account for Ninjutso bundle size
snekxs Aug 10, 2026
cd8c048
Handle unavailable Ninjutso motion sync
snekxs Aug 10, 2026
be48e62
chore: update Ninjutso protocol fallback
snekxs Aug 10, 2026
ac06a89
Add NinjaForce performance and receiver UI
snekxs Aug 10, 2026
df9b5be
Match NinjaForce mode availability rules
snekxs Aug 10, 2026
a0533df
Refine NinjaForce settings layout
snekxs Aug 10, 2026
53fb331
rework ui
nyedle Aug 10, 2026
768513a
Merge branch 'dev' of main:OpenMouse-Project/openmouse into dev
nyedle Aug 10, 2026
060ff6a
battery
nyedle Aug 10, 2026
ac10252
razer: explain native-only models in the connection error (#60)
jazzstack Aug 10, 2026
9536b58
Add Logitech MX Master 3S device panel artwork.
dwei30 Aug 10, 2026
d95d30e
Match MX Master 3S art by display name only.
dwei30 Aug 10, 2026
40eaf0c
Add a dedicated Lighting tab with an in-app colour picker, plus Razer…
jazzstack Aug 11, 2026
0b2cbda
razer: add Cobra wired mouse support (hardware-verified) (#66)
jazzstack Aug 11, 2026
632c934
Move Terra Pro DPI lighting to Advanced and add product art. (#62)
dwei30 Aug 11, 2026
d037c2c
Add Keychron Nape Pro preview, device art, and activate open (#63)
dwei30 Aug 11, 2026
fb26fea
Add Razer Viper V2 Pro device panel artwork. (#64)
dwei30 Aug 11, 2026
423ae67
feat: add Mouse Check HID diagnostics page (#65)
DEERSTUDIO101 Aug 11, 2026
4528ee3
build: refresh protocol lock after merged drivers (#68)
snekxs Aug 11, 2026
bac3f2c
Add Miku and Catppuccin interface themes (#70)
jazzstack Aug 11, 2026
1dab6a8
Replace interface density with live theme preview (#71)
snekxs Aug 11, 2026
7a19c25
Expose CRDRAKO performance controls
snekxs Aug 11, 2026
e57b35e
Raise bundle budget for CRDRAKO support
snekxs Aug 11, 2026
8ce75c6
Enable driver previews on the deployed insiders app (#72)
snekxs Aug 11, 2026
94a8a73
Add CRDRAKO KO-ONE device artwork
snekxs Aug 11, 2026
b83a27c
Add M3K and CRDRAKO driver previews (#73)
snekxs Aug 11, 2026
5eebebd
Add Zaunkoenig device artwork and protocol update
snekxs Aug 11, 2026
a6da291
Activate Zaunkoenig devices in the control UI
snekxs Aug 11, 2026
b3c803e
Raise JS budget for Zaunkoenig support
snekxs Aug 11, 2026
6568d7f
Show M3K and KO-ONE artwork in fixture previews (#75)
snekxs Aug 11, 2026
ee4e52e
Make M3K device artwork transparent (#76)
snekxs Aug 11, 2026
e398f2e
add razer viper topdown image (#81)
FormunaGit Aug 11, 2026
fee483c
Prevent overlapping HID++ clients from corrupting feature resolution …
jazzstack Aug 11, 2026
cd273e6
feat(endgame): add XM2we preview fixture and isolate OP1 8K image fal…
ziewenn Aug 11, 2026
a44f0f5
MX Master 4: haptics, wheel, name and Easy-Switch cards (#82)
weltern Aug 11, 2026
c1f3f45
Rewrite the UI in Preact (#79)
nyedle Aug 11, 2026
1227050
feat: add database-backed mouse support requests
snekxs Aug 11, 2026
48466b1
chore: keep database migrations private
snekxs Aug 11, 2026
59991dc
fix: configure support requests in production
snekxs Aug 11, 2026
c352b8d
refactor: make mouse requests cover full device support
snekxs Aug 11, 2026
0dcec20
fix: allow scrolling inside dialogs
snekxs Aug 11, 2026
c7ce790
fix: accept empty responses from support request RPCs
snekxs Aug 11, 2026
b84387b
Update protocol for Logitech G502 support
snekxs Aug 11, 2026
452c207
Raise bundle budgets for current UI
snekxs Aug 11, 2026
f04b1bd
Add G502 controls and product artwork
snekxs Aug 12, 2026
264d691
Pause voting during abuse incident
snekxs Aug 12, 2026
1381059
Fix the tab nav dropping below the MX Master cards on Advanced
weltern Aug 12, 2026
688c31b
MX Master 4: button remapping card
weltern Aug 12, 2026
c334d37
feat: add PWA manifest and offline service worker for public pages
ydw1904 Aug 12, 2026
6de6173
Protect and reopen mouse voting
snekxs Aug 12, 2026
4fa8c40
Trigger protected voting deployment
snekxs Aug 12, 2026
de80e74
Rebuild with Turnstile site key
snekxs Aug 12, 2026
47f30bf
Load voting configuration at runtime
snekxs Aug 12, 2026
b9bbefe
Deploy preview voting bindings
snekxs Aug 12, 2026
2b37d00
Reopen protected mouse requests
snekxs Aug 12, 2026
21ab4d3
Fix protected request database path
snekxs Aug 12, 2026
cbeda3d
Disambiguate protected request SQL
snekxs Aug 12, 2026
4f8a9e5
Report ambiguous request database errors
snekxs Aug 12, 2026
a1d4ed5
Fix request submission conflict target
snekxs Aug 12, 2026
436f283
Add MX Master 3S to the driver preview picker.
dwei30 Aug 12, 2026
1e13249
Qualify protected vote SQL columns
snekxs Aug 12, 2026
c5e7055
Decouple mouse requests from initial votes
snekxs Aug 12, 2026
87c1c98
crop image
dwei30 Aug 12, 2026
a4a29de
Merge branch 'dev' into logitech-mx-master-3s
dwei30 Aug 12, 2026
829cff2
reorder options
dwei30 Aug 12, 2026
709d5f7
added viper v2 pro
dwei30 Aug 12, 2026
2a232d5
fix(endgame): detect XM2we wireless receiver and resolve display name
ziewenn Aug 12, 2026
5be719c
fix Terra Pro preview artwork
dwei30 Aug 12, 2026
002fac3
Add Keychron Nape Pro h:m:s auto-sleep controls.
dwei30 Aug 12, 2026
b673954
feat: add Attack Shark vendor + community device tracker page
DEERSTUDIO101 Aug 12, 2026
a66f420
fix(attackshark): add 0x373e OEM VID to HID filters
DEERSTUDIO101 Aug 13, 2026
79c5666
feat(attackshark): add 0x1d57 OEM VID to HID filters (R1 / X11 family)
DEERSTUDIO101 Aug 13, 2026
d533c46
feat: add Attack Shark R5 Ultra product artwork
jazzstack Aug 13, 2026
dafd803
feat: Attack Shark R5 Ultra support (upstream protocol dependency)
jazzstack Aug 13, 2026
d8925aa
Add G502 lighting zones and button remapping
snekxs Aug 13, 2026
6d99d1a
Update mouse protocol dependency
snekxs Aug 13, 2026
7d891b4
Add Logitech keyboard and media remapping
snekxs Aug 13, 2026
e64e644
Show G502 X Plus feature preview
snekxs Aug 13, 2026
b3c8506
Redesign G502 controls and add per-LED RGB UI
snekxs Aug 13, 2026
25141eb
Add keyboard shortcut recorder
snekxs Aug 13, 2026
223ee4b
Remove legacy typed shortcut prompt
snekxs Aug 13, 2026
4a7fcce
Add explicit shortcut sequence recording
snekxs Aug 13, 2026
797a20f
Save recorded shortcuts as onboard macros
snekxs Aug 13, 2026
6d97193
Pin macro write recovery
snekxs Aug 13, 2026
987e6f9
Merge OpenMouse-Project/dev into dev
snekxs Aug 14, 2026
5d93906
Add OpenMouse Bridge settings preview
snekxs Aug 14, 2026
8a099ec
fix: replace glitchy R5 Ultra artwork with official render
jazzstack Aug 14, 2026
cbd75c5
Clarify OpenMouse Bridge integration
snekxs Aug 14, 2026
ad026d4
build: raise bundle budgets for G502, remap, and recorder features
jazzstack Aug 14, 2026
abc7893
Focus Bridge preview on initial features
snekxs Aug 14, 2026
3437ffe
Add Bridge connection controls
snekxs Aug 14, 2026
9a2fdd4
chore: unpin protocol to the approved upstream URL
jazzstack Aug 14, 2026
4b78938
Add Superstrike device artwork
snekxs Aug 14, 2026
f51587e
Merge pull request #93 from jazzstack/dev
jazzstack Aug 14, 2026
a809242
fix(endgame): use protocol XM2we identity
snekxs Aug 14, 2026
eb16b4f
fix: resolve Viper Mini and Cobra artwork in preview mode
jazzstack Aug 14, 2026
31f059d
Merge pull request #94 from jazzstack/dev
jazzstack Aug 14, 2026
74af41e
Add Bridge application profiles
snekxs Aug 14, 2026
6e7b60d
Only connect to Bridge on user request
snekxs Aug 14, 2026
c72abfb
Add Bridge application profile controls
snekxs Aug 14, 2026
e3a2525
Reconnect to Bridge automatically
snekxs Aug 14, 2026
6e7646d
Update bundle budgets for Bridge controls
snekxs Aug 14, 2026
622a4bb
Port shared DPI stage selector to the Preact control UI.
dwei30 Aug 12, 2026
c8de226
Match Teevolution DPI lighting CSS to single-line device styles.
dwei30 Aug 12, 2026
f46d5e0
Merge branch 'dev' into logitech-mx-master-3s
dwei30 Aug 14, 2026
bf64163
Fix staged Logitech profile writes
snekxs Aug 14, 2026
5627575
Merge remote-tracking branch 'refs/remotes/origin/pr/92' into dev
snekxs Aug 14, 2026
0650b02
Merge branch 'pr-74' into dev
snekxs Aug 14, 2026
1b93bdb
Merge branch 'pr-83' into dev
snekxs Aug 14, 2026
a8d0281
Merge branch 'pr-84' into dev
snekxs Aug 14, 2026
06110d5
Merge branch 'pr-85' into dev
snekxs Aug 14, 2026
310675b
Merge branch 'pr-86' into dev
snekxs Aug 14, 2026
b870009
Merge PR #87 (superseded by #92 and mouse-protocol #17)
snekxs Aug 14, 2026
a7dfc9b
Merge branch 'pr-88' into dev
snekxs Aug 14, 2026
cc844ba
Merge branch 'pr-90' into dev
snekxs Aug 14, 2026
17311f2
Resolve combined PR integration
snekxs Aug 14, 2026
21a4f8d
Fix staged profile assignment previews
snekxs Aug 15, 2026
5564151
Gate Bridge connection behind user action
snekxs Aug 15, 2026
1e35455
Add interface themes, glass material, and toast notifications
jazzstack Aug 15, 2026
e3bad3a
Merge remote-tracking branch 'upstream/dev' into dev
jazzstack Aug 15, 2026
178016e
Raise bundle budgets for interface themes and supported-device page
jazzstack Aug 15, 2026
6cc4a58
Merge pull request #98 from jazzstack/dev
snekxs Aug 15, 2026
efb2564
Update protocol for Razer HyperPolling
snekxs Aug 15, 2026
d28f95c
Rework UI
nyedle Aug 15, 2026
4ee3691
build(deps): point @openmouse/protocol at the Pulsar 4K receiver commit
jazzstack Aug 15, 2026
a8503c8
feat(ui): show Pulsar X2 V2 artwork for the 4K wireless receiver
jazzstack Aug 15, 2026
08b164b
feat(ui): show Pulsar X2 V2 artwork in the pulsar driver preview
jazzstack Aug 15, 2026
82fbe9b
feat(ui): model the pulsar preview as the X2 V2
jazzstack Aug 15, 2026
b29ea3f
chore(ui): use the Red Edition X2 V2 render for the pulsar artwork
jazzstack Aug 15, 2026
eecbc7f
chore(ui): remove the Medium label from the pulsar artwork
jazzstack Aug 15, 2026
de2c98b
chore(deps): bump mouse-protocol to b07567c for the pulsar DPI and po…
jazzstack Aug 15, 2026
d7bdda5
chore(deps): revert @openmouse/protocol to the upstream OpenMouse-Pro…
jazzstack Aug 16, 2026
91d587f
feat(ui): add Developer Hall of Fame page
jazzstack Aug 16, 2026
8fabcbb
feat(devices): dark-only supported page with live request and registr…
jazzstack Aug 16, 2026
39fd044
feat(ui): include merged-PR authors in the Hall of Fame
jazzstack Aug 16, 2026
f646d8b
Merge pull request #100 from jazzstack/hof-supported-live
snekxs Aug 16, 2026
b3d57ef
Merge pull request #99 from jazzstack/dev
snekxs Aug 16, 2026
bd7f58d
Add Pulsar Pro dongle artwork
snekxs Aug 16, 2026
8745bc9
Make Pulsar polling changes apply reliably
snekxs Aug 16, 2026
09da6be
Integrate Bridge game catalog and active profiles
snekxs Aug 16, 2026
bd6e1fe
Sync default Bridge profile and filter games
snekxs Aug 16, 2026
f8f1701
Keep Bridge connection alive with handshakes
snekxs Aug 16, 2026
4337588
Start Bridge heartbeat automatically
snekxs Aug 16, 2026
912ceea
Add v1 stable update center
snekxs Aug 16, 2026
ae0c53d
Focus updates on Bridge and simplify profiles
snekxs Aug 16, 2026
ce64c30
Implemented button mapping for the vv3p
Pochiiko Aug 16, 2026
c891a09
fix(devices): mark Pulsar X3 Medium test-needed until XS-1 driver lands
jazzstack Aug 16, 2026
f7cf583
fix(devices): mark Pulsar X3 Medium test-needed until XS-1 driver lands
jazzstack Aug 16, 2026
631cdb9
Merge pull request #103 from jazzstack/feat/pulsar-x3-supported
snekxs Aug 16, 2026
d9c3546
Merge pull request #101 from Pochiiko/vv3p-button-mapping
snekxs Aug 16, 2026
b4bfc13
Merge branch 'OpenMouse-Project:dev' into dev
jazzstack Aug 16, 2026
e7c1a27
fix(pulsar): ship the XS-1 driver and mark X3 Medium supported
jazzstack Aug 16, 2026
2a2d58d
build: raise JS bundle budget for the XS-1 driver
jazzstack Aug 16, 2026
a5ecbee
Merge pull request #104 from jazzstack/dev
jazzstack Aug 16, 2026
51e528b
chore(protocol): bump to ba64a12 for the X3 M dongle name
jazzstack Aug 16, 2026
3c7d6ee
Merge pull request #105 from jazzstack/dev
jazzstack Aug 16, 2026
edb4ef3
fix(supported): collapse brand typos onto canonical names
jazzstack Aug 16, 2026
6d0ccfc
Merge pull request #2 from jazzstack/fix/brand-name-aliases
jazzstack Aug 16, 2026
232e1ee
feat(fantech): add WG14P Yari Pro support
jazzstack Aug 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 2
trim_trailing_whitespace = true

[*.md]
trim_trailing_whitespace = false
6 changes: 3 additions & 3 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# Cloudflare Pages Functions runtime bindings.
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SERVICE_ROLE_KEY=configure-as-a-cloudflare-secret
VITE_SUPABASE_URL=
VITE_SUPABASE_ANON_KEY=
VITE_TURNSTILE_SITE_KEY=
3 changes: 3 additions & 0 deletions .env.production
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
VITE_SUPABASE_URL=https://htvsdiikalggstogproq.supabase.co
VITE_SUPABASE_ANON_KEY=sb_publishable_k_Ea1wta7Ts0Bzj3cehBMg_VrLEujxR
VITE_TURNSTILE_SITE_KEY=
51 changes: 51 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: CI

on:
pull_request:
push:

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7

- uses: actions/setup-node@v7
with:
node-version: 24
cache: npm

- run: npm ci

- name: Type check and build
run: npm run build

- name: Test
run: npm test

- name: Bundle size
run: npm run size

- name: Audit
run: npm audit --audit-level=high

- name: Approved runtime dependencies
run: |
node <<'NODE'
const { dependencies = {} } = require("./package.json");
const approved = {
"@openmouse/protocol": "https://github.com/OpenMouse-Project/mouse-protocol.git",
"preact": "^10.29.8",
};

if (JSON.stringify(dependencies) !== JSON.stringify(approved)) {
console.error("Runtime dependencies differ from the maintainer-approved list.");
console.error("Expected:", approved);
console.error("Received:", dependencies);
process.exit(1);
}
NODE
28 changes: 28 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: CodeQL

on:
pull_request:
push:
schedule:
- cron: "0 6 * * 1"

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
analyze:
runs-on: ubuntu-latest
permissions:
security-events: write
actions: read
contents: read
steps:
- uses: actions/checkout@v7

- uses: github/codeql-action/init@v4
with:
languages: javascript-typescript
queries: security-and-quality

- uses: github/codeql-action/analyze@v4
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
node_modules/
dist/
/preview/
CHANGELOG.md
supabase/migrations/
.DS_Store
.env
.env.*
!.env.example
!.env.production
1 change: 1 addition & 0 deletions .npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
allow-git=all
78 changes: 37 additions & 41 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,62 +1,58 @@
# OpenMouse

OpenMouse is a browser-based app for managing supported gaming mice in one place.
It uses the WebHID API to communicate with devices directly from Chrome or Edge — no separate desktop utility required.
OpenMouse is a browser-based control panel for supported gaming mice.

## Features
Connect a mouse, view its information, and change supported settings such as DPI
and polling rate without installing a different app for every brand.

- **DPI control** — view and change sensitivity presets
- **Polling rate** — switch between 125 Hz – 8 KHz where supported
- **Battery & firmware** — read live status from wireless mice
- **Lift-off distance**, debounce, motion sync, and more per brand
- Supports Logitech, Pulsar, Endgame Gear, and WLMouse hardware

## Browser support

| Browser | WebHID | Status |
|---------|--------|--------|
| Chrome | ✅ | Fully supported |
| Edge | ✅ | Fully supported |
| Firefox | ❌ | WebHID not implemented |
| Safari | ❌ | WebHID not implemented |
This branch is deployed as the public development control panel.

## Development

```bash
npm install
npm run dev # start local dev server
npm run build # production build (requires tsc + vite)
npm test # run protocol unit tests
npm run dev
```

Copy `.env.example` to `.env` and fill in your Supabase credentials if you need the license/access-gate functions.
Run the full local check before pushing changes:

## Mouse Check — Diagnostics & Discord Reporting
```bash
npm run check
```

**Mouse Check** is a companion Tauri desktop app for checking whether a mouse is WebHID compatible.
It scans native HID devices, tests the Razer protocol over every interface, and generates a full diagnostic report.
## Bridge updates

### Where to enter your Discord Webhook URL
The Settings page compares the connected OpenMouse Bridge against its latest
stable GitHub release. It only retrieves the version, changelog, and download
link; it never downloads or installs an update in the background. Users can
also run the check manually.

1. Open **Mouse Check**
2. Select your mouse from the device list and click **Run Diagnostics**
3. When the **Discord Report** section appears at the bottom, paste your Discord Webhook URL into the field labeled *"Discord Webhook URL (saved locally)"*
4. Click **Send to Discord**
The control panel is organized by responsibility: `control.ts` coordinates the
application, while the template, events, DOM helpers, persisted preferences,
battery history, device selection, and rendering live in focused modules under
`src/`.

The webhook URL is saved in your browser's `localStorage` under the key `om-discord-webhook`.
It is **never** stored in the app code, never committed to the repository, and never sent anywhere other than Discord.
Packet codecs and WebHID drivers live in the standalone
[`@openmouse/protocol`](https://github.com/OpenMouse-Project/mouse-protocol)
library. Its codec entry points remain transport-independent, while its
`drivers` entry points own discovery filters, device clients, retries, and
application-facing status conversion. OpenMouse consumes the same public
exports that external consumers use.

**How to create a webhook:**
Discord server → Channel settings → Integrations → Webhooks → New Webhook → Copy Webhook URL
## Adding a vendor

## Stack
Codec and driver contributions belong in the `mouse-protocol` repository.

- **Vite 6** + **TypeScript 5** — build tooling
- **WebHID** — browser API for direct HID device access
- **Cloudflare Pages** — hosting + edge functions (access gate)
- **Supabase** — license verification (optional, for access gate)
1. Add transport-independent packet definitions and codecs under the vendor's
`mouse-protocol/src/<vendor>/` folder.
2. Add the WebHID implementation under `mouse-protocol/src/drivers/<vendor>/`.
3. Register the driver and browser filters in the shared driver layer.
4. Add or extend codec and driver tests, state which product IDs were verified
on hardware, and run the checks in both repositories.

## License
OpenMouse should only need changes when a driver introduces a genuinely new UI
capability. The control UI otherwise discovers supported clients through the
library registry automatically.

Not currently licensed for use, modification, or redistribution.
A license will be selected before the project's full public release.
Hardware-specific validation checklists live in the protocol repository's
`docs/` directory.
69 changes: 69 additions & 0 deletions build/check-bundle-size.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import { readdirSync, statSync } from "node:fs";
import { join } from "node:path";

const BUDGET_BYTES: Record<string, number> = {
// Raised from 103 kB for the interface themes: NieR: Automata and Liquid
// Glass each ship their own token block, and the liquid-glass material
// layer (SVG displacement filters plus their component rules) adds the
// largest share. The measured bundle is 153.7 kB; 175 kB adds headroom for
// the Developer Hall of Fame page (~15 kB of animated card and hero
// styles that load only on /contributors.html).
".css": 175_000,
// Raised from 510 kB for Bridge discovery, profile editing, automatic
// reconnection, and recent device support, which have since grown further
// with the supported-device page and MX Master remap controls. Preview
// fixtures retain their separate allowance below; the measured aggregate
// is 573.4 kB with them, plus the ~11 kB Hall of Fame chunk. Raised again
// from 590 kB for the Razer button-mapping card and its codec: the measured
// aggregate is 588.2 kB, which left under 2 kB of headroom. Raised again to
// 610 kB for the Pulsar XS-1 feature-report driver and 4K receiver support
// (mouse-protocol 3c3a445): the X3 family codec plus the 4K DPI/polling work
// adds ~1.3 kB to the measured aggregate.
".js": 610_000,
};

const ASSETS = join("dist", "assets");

function bundles(): { name: string; ext: string; bytes: number }[] {
return readdirSync(ASSETS)
.filter((name) => name.endsWith(".css") || name.endsWith(".js"))
.map((name) => ({
name,
ext: name.slice(name.lastIndexOf(".")),
bytes: statSync(join(ASSETS, name)).size,
}));
}

const found = bundles();
if (found.length === 0) {
console.error(`No bundles in ${ASSETS}. Run "npm run build" first.`);
process.exit(1);
}

const budgets = {
...BUDGET_BYTES,
".js": BUDGET_BYTES[".js"] + (found.some(({ name }) => name.startsWith("preview-fixtures-")) ? 18_000 : 0),
};

const totals = new Map<string, number>();
for (const { ext, bytes } of found) totals.set(ext, (totals.get(ext) ?? 0) + bytes);

let failed = false;
for (const [ext, budget] of Object.entries(budgets)) {
const bytes = totals.get(ext) ?? 0;
const percent = Math.round((bytes / budget) * 100);
const label = `${ext.slice(1).toUpperCase().padEnd(3)} ${String(bytes).padStart(7)} / ${budget} bytes (${percent}%)`;
if (bytes > budget) {
failed = true;
console.error(`over budget ${label}`);
} else {
console.log(`ok ${label}`);
}
}

if (failed) {
console.error("");
console.error("A bundle grew past its budget. Justify the growth and raise BUDGET_BYTES,");
console.error("or find what was added. Adding a CSS framework once cost 19 kB unnoticed.");
process.exit(1);
}
Loading
Loading