I forked switch2bridge-macos to add wired USB support for the Switch 2 Pro Controller on Mac (DSU server, works with Dolphin, Cemu, Ryujinx)
The Switch 2 Pro Controller doesn't work on macOS out of the box. Bluetooth Classic pairing fails, and over USB it enumerates but stays silent. I've been using a fork of switch2bridge-macos to fix that, and figured others might want it.
Credit first: the original project is by mlstr0m. They built the Bluetooth LE client, the menu bar app, and the original DSU server. Go star their repo.
What my fork adds: kennethreitz/switch2bridge-macos
*
Wired USB mode. I reverse engineered the init sequence the controller needs on its vendor interface, so it works over a cable at 250 Hz (about 4 ms), versus about 33 Hz over Bluetooth. It upgrades to wired automatically if you plug in mid-session.
*
Wireless still works, over Bluetooth LE, with no pairing in System Settings.
*
All buttons supported, including the Switch 2 GL, GR, and C buttons.
*
Real analog sticks with factory calibration read from the controller's own flash, plus a radial deadzone.
*
Auto-connect at launch and continuous watching for the controller.
*
No gyro yet. That's the main gap.
What's a DSU server? DSU (also called the Cemuhook protocol, after the Cemu plugin it came from) is a small protocol over UDP on your local machine. The bridge reads the controller and serves its state on 127.0.0.1:26760. Emulators and frontends act as DSU clients and connect to that address to get buttons and sticks (and motion, in setups that send it). This also means it's not a system driver: macOS games using Apple's GameController framework won't see it, only DSU clients will.
DSU clients that work with it: Dolphin (Alternate Input Sources, DSU Client), Cemu (DSUController), Ryujinx, and others that speak Cemuhook. I use it with RetroVault, a native macOS RomM client I made, which connects to it as a DSU client.
Setup (from source):
brew install libusb
git clone https://github.com/kennethreitz/switch2bridge-macos.git
cd switch2bridge-macos
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt
python Switch2Bridge.py
A controller icon appears in the menu bar. Plug in the controller, or click Connect Controller and hold the pair button until the LEDs sweep. Then point your emulator's DSU client at 127.0.0.1:26760. Requires macOS Ventura or later.
I've been daily driving it for about 4 months and it's been working great. Feedback welcome, especially from anyone with a different controller revision or emulator setup.
3 points
Mentions
RetroVault 2026.11.7 is out: RetroAchievements, built in. Sign in, play your RomM library, and unlock achievements as you go, with in-game toasts and a Hardcore mode you can toggle right from the controller menu. Free, open source, Apple silicon. github.com/kennethreitz/RetroVault/releases/tag/v…
I forked switch2bridge-macos to add wired USB support for the Switch 2 Pro Controller on Mac (DSU server, works with Dolphin, Cemu, Ryujinx) The Switch 2 Pro Controller doesn't work on macOS out of the box. Bluetooth Classic pairing fails, and over USB it enumerates but stays silent. I've been using a fork of switch2bridge-macos to fix that, and figured others might want it. Credit first: the original project is by mlstr0m. They built the Bluetooth LE client, the menu bar app, and the original DSU server. Go star their repo. What my fork adds: kennethreitz/switch2bridge-macos * Wired USB mode. I reverse engineered the init sequence the controller needs on its vendor interface, so it works over a cable at 250 Hz (about 4 ms), versus about 33 Hz over Bluetooth. It upgrades to wired automatically if you plug in mid-session. * Wireless still works, over Bluetooth LE, with no pairing in System Settings. * All buttons supported, including the Switch 2 GL, GR, and C buttons. * Real analog sticks with factory calibration read from the controller's own flash, plus a radial deadzone. * Auto-connect at launch and continuous watching for the controller. * No gyro yet. That's the main gap. What's a DSU server? DSU (also called the Cemuhook protocol, after the Cemu plugin it came from) is a small protocol over UDP on your local machine. The bridge reads the controller and serves its state on 127.0.0.1:26760. Emulators and frontends act as DSU clients and connect to that address to get buttons and sticks (and motion, in setups that send it). This also means it's not a system driver: macOS games using Apple's GameController framework won't see it, only DSU clients will. DSU clients that work with it: Dolphin (Alternate Input Sources, DSU Client), Cemu (DSUController), Ryujinx, and others that speak Cemuhook. I use it with RetroVault, a native macOS RomM client I made, which connects to it as a DSU client. Setup (from source): brew install libusb git clone https://github.com/kennethreitz/switch2bridge-macos.git cd switch2bridge-macos python3 -m venv venv && source venv/bin/activate pip install -r requirements.txt python Switch2Bridge.py A controller icon appears in the menu bar. Plug in the controller, or click Connect Controller and hold the pair button until the LEDs sweep. Then point your emulator's DSU client at 127.0.0.1:26760. Requires macOS Ventura or later. I've been daily driving it for about 4 months and it's been working great. Feedback welcome, especially from anyone with a different controller revision or emulator setup.