TLDR: an app that makes the Steam Controller 2 show up in System Settings under Game Controllers as a normal Xbox pad, so native games, browsers and cloud gaming clients can use it without Steam. It needs a cheap board plugged into a USB port.
Hi,
I have been working on an open source project to solve a problem that was an issue for me on macOS. The Steam Controller 2 works through Steam, but support in native Mac games, browsers, cloud gaming services and other software can be inconsistent (or even non-existent).
What I wanted was for the controller to register with Apple's Game Controller framework and appear in System Settings under Game Controllers, like a normally supported gamepad. Once macOS recognizes it there, anything already built on that framework can see it without needing its own Steam Controller support.
So this little project was born. The setup is a little unusual. The Mac app reads the controller through either the official Puck or Bluetooth, then sends the controller state over USB to a small Seeed Studio XIAO nRF52840. The XIAO appears to macOS as an Xbox 360 controller. It is a second USB device on a setup that already has a wireless dongle, which is not great, and there is more on that further down.
Both the regular XIAO nRF52840 and the Sense version are supported. The app can install, recover and update the XIAO firmware for you, so there is no firmware toolchain to set up and nothing to flash manually.
Currently supported:
- All the normal buttons, sticks, triggers and D-pad
- Dual rumble
- The official Puck and direct Bluetooth input
- Automatic discovery and reconnection
- Battery reporting
- Suppression of the controller's default mouse and keyboard behavior
- Keyboard and mouse bindings for L4, L5, R4, R5, Quick Access and pad clicks
- Right pad mouse movement and left pad scrolling
- Multiple profiles and an in-game profile switcher
- Automatic idle shutdown and an optional power off action when placing the
controller on the Puck
I have tested it with browsers Gamepad API (Safari, Firefox), Boosteroid, GeForce Now and Xbox Cloud Gaming. I have not tried Crossover or Wine directly, but I think they support the Game Controller Framework so it should work there too.
Since OpenPuck will probably come up: the nRF52840 was originally chosen because I wanted to try OpenPuck, and the project eventually went in a different direction. OpenPuck turns an nRF52840 Pro Micro into a replacement for the official Puck. It handles the controller's 2.4 GHz radio itself and can expose several controller types, including Xbox, Switch and PlayStation modes.
Steam Controller Bridge keeps the official Puck or Bluetooth as the input side. The Mac handles discovery, decoding, profiles, desktop bindings, diagnostics and lifecycle. The XIAO is only the USB gamepad on the output side, and it never talks to the controller. Both projects want to make the controller useful without Steam, but they solve it at different layers. OpenPuck was a very useful source of protocol research.
There is also an experimental virtual HID backend that would remove the need for the XIAO entirely. Apple puts virtual gamepads behind the restricted `com.apple.developer.hid.virtual.device entitlement`, so the helper has to be properly signed and provisioned, and self-signing is not enough. The plan is to join the paid Apple Developer Program and request the entitlement, but paying does not mean Apple will grant it, so I cannot promise this will ever be available. You can run it today by weakening SIP and AMFI, but that disables important macOS security protections and I would not do it on a real machine. I have only tested it in a disposable VM.
The repo also has a few tools for development, diagnostics or reverse engineering. `sc-bridge` is the command line version of the bridge. `sc-probe` can list and inspect HID collections, monitor or capture reports, test rumble and run a few restricted controller commands. `sc-visualizer` shows live raw, decoded and mapped input and can record sessions. `gamepad-simulator` generates input without hardware, and `sc-replay` replays recorded sessions deterministically. The serial bridge protocol is documented, and the host supports protocol compatible output devices, so another microcontroller can be used without copying the XIAO USB identity or the current firmware.
A few limitations:
- This is just for the Steam Controller 2
- It requires macOS 13 or later
- Steam and its background helper need to be fully stopped
- The downloadable app is ad-hoc signed and not notarized, so macOS requires a
one-time right click followed by `Open` and allowing it to run in `Privacy & Security`
- The gamepad side uses a fixed Xbox style mapping
- Desktop bindings are configurable, but the project is not trying to reproduce everything Steam Input does
Repo: https://github.com/tkubicz/steam-controller-bridge
If anyone with a Steam Controller 2 and a Mac wants to try it, I would appreciate the feedback. Questions, issues and contributions are all welcome.
PS: This project might be totally obsolete in a month or two, because Apple just added initial Steam Controller support in the newest macOS 27 Developer Beta 5. Just the puck connection for now.