[PR #311] [MERGED] WebUSB panel: clone pairings from an official puck #282

Closed
opened 2026-10-22 05:08:40 +00:00 by roman · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/safijari/openpuck/pull/311
Author: @minijaws
Created: 10/10/2026
Status: ✅ Merged
Merged: 10/14/2026
Merged by: @safijari

Base: main ← Head: clone-official-puck


📝 Commits (1)

  • fd92bab Add "Clone pairings from an official puck" to the WebUSB panel

📊 Changes

1 file changed (+156 additions, -1 deletions)

View changed files

📝 docs/index.html (+156 -1)

📄 Description

Adds a Clone from an official puck section to the Backup & clone card in the WebUSB panel. It copies the controller pairings off a Valve puck onto an OpenPuck, so controllers paired to the official puck connect to the OpenPuck without re-pairing.

How it works

  • Read: WebHID, using the same 0xA3 bond read Steam uses (feature report 2 on each slot interface). The official puck answers it with the 24-byte bond record. The controller only checks the record's two UUIDs over the air, so the copy is enough for it to connect.
  • Write: the existing 0x0D/0x0E import commands, into free slots only. Existing pairings and settings are kept, and the OpenPuck reboots to apply.
  • One USB port is enough: step 1 keeps the pairings it reads in localStorage. You read the official puck, unplug it, plug in and connect the OpenPuck, then write. While no OpenPuck is connected, the section shows as a standalone card at the top, since the Backup card is hidden until something connects.
  • Two USB ports work too: the browser's device picker shows two identical "Steam Controller Puck" entries. If you pick the OpenPuck, the panel recognises its own pairings and tells you to pick the other entry.
  • macOS: Chrome needs Input Monitoring permission to read the official puck, because the puck's slot interfaces include a keyboard collection. The card explains this. The page itself can only reach the vendor channel.

Tested on macOS with Chrome, a nice!nano running 0.9.51 and an official puck, using a single cable. Step 1 read 1 pairing; after swapping the cable, step 2 wrote it to slot 0. The controller then connected to the nice!nano without re-pairing. Reading from a puck that already has the pairing correctly reported "nothing to do". The wrong-entry hint for the two-cable case hasn't been tested on hardware yet.


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/safijari/openpuck/pull/311 **Author:** [@minijaws](https://github.com/minijaws) **Created:** 10/10/2026 **Status:** ✅ Merged **Merged:** 10/14/2026 **Merged by:** [@safijari](https://github.com/safijari) **Base:** `main` ← **Head:** `clone-official-puck` --- ### 📝 Commits (1) - [`fd92bab`](https://github.com/safijari/openpuck/commit/fd92bab00ef1323a76f44dbd0db7dea748071e9d) Add "Clone pairings from an official puck" to the WebUSB panel ### 📊 Changes **1 file changed** (+156 additions, -1 deletions) <details> <summary>View changed files</summary> 📝 `docs/index.html` (+156 -1) </details> ### 📄 Description Adds a **Clone from an official puck** section to the Backup & clone card in the WebUSB panel. It copies the controller pairings off a Valve puck onto an OpenPuck, so controllers paired to the official puck connect to the OpenPuck without re-pairing. **How it works** - **Read:** WebHID, using the same `0xA3` bond read Steam uses (feature report 2 on each slot interface). The official puck answers it with the 24-byte bond record. The controller only checks the record's two UUIDs over the air, so the copy is enough for it to connect. - **Write:** the existing `0x0D`/`0x0E` import commands, into free slots only. Existing pairings and settings are kept, and the OpenPuck reboots to apply. - **One USB port is enough:** step 1 keeps the pairings it reads in `localStorage`. You read the official puck, unplug it, plug in and connect the OpenPuck, then write. While no OpenPuck is connected, the section shows as a standalone card at the top, since the Backup card is hidden until something connects. - **Two USB ports work too:** the browser's device picker shows two identical "Steam Controller Puck" entries. If you pick the OpenPuck, the panel recognises its own pairings and tells you to pick the other entry. - **macOS:** Chrome needs Input Monitoring permission to read the official puck, because the puck's slot interfaces include a keyboard collection. The card explains this. The page itself can only reach the vendor channel. **Tested** on macOS with Chrome, a nice!nano running 0.9.51 and an official puck, using a single cable. Step 1 read 1 pairing; after swapping the cable, step 2 wrote it to slot 0. The controller then connected to the nice!nano without re-pairing. Reading from a puck that already has the pairing correctly reported "nothing to do". The wrong-entry hint for the two-cable case hasn't been tested on hardware yet. --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
roman 2026-10-22 05:08:40 +00:00
Sign in to join this conversation.
No labels
pull-request
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
safijari/openpuck#282
No description provided.