deck-as-controller.mp4
A Decky Loader plugin that turns your Steam Deck into a controller for your Mac, iPad or PC, wirelessly over Bluetooth or wired over a USB cable. Nothing needs to be installed on the other device: the Deck shows up as a PS5, Xbox or Steam Controller.
This is still a very early build, expect latency and connection issues, specially with untested devices.
Developed on a Steam Deck OLED (Decky Loader 3.2.9 and SteamOs 3.8.28) with a Mac M4 running macOS 27. See Tested devices for what others have tried.
Independent project. Deck as Controller is developed independently and is free. It isn't affiliated with, endorsed by, or sponsored by Valve Corporation.
- Four controller types: PS5 (DualSense), PS5 Edge, Xbox Elite Series 2, and Steam Controller (2026). PS5 Edge carries all four Deck back buttons; Steam Controller carries every Deck control to Steam on the other device.
- Wired mode (USB cable) as a PS5 or PS5 Edge controller, with much lower latency than Bluetooth. See Wired (USB).
- Deck screen off while connected. Tap ⋯ to toggle it; hold ⋯ for 2 seconds to stop and get the Deck's screen and controls back.
- Reconnects automatically to the last device when you turn the plugin on.
- Remembers your devices: pair more than one (e.g. a Mac and an iPad).
- Rumble (see the table below for where it works).
- Trackpads: the Deck trackpads act as the PS5 touchpad, with a small haptic tick when you click them.
- Gyro on the PS5 types.
- Battery level of the Deck shown on the Mac (PS5 types).
- Use of the Steamdeck's screen as a secondary screen, (think WiiU, 3ds, guides, etc)
- Nintendo Switch Controller Profile
- Install Decky Loader on your Deck.
- Download
deck-as-controller.zipfrom the releases page. - In Game Mode, open ⋯ → Decky → ⚙ Settings → General, turn on Developer mode, then go to Developer → Install Plugin from ZIP File and pick the zip.
- Open ⋯ → Decky → Deck as Controller, choose a controller type, and turn on Use as controller. Connect with is Wireless (Bluetooth) by default; for a cable, see Wired (USB).
- The first time, the Deck is ready to pair. On your Mac or iPad, open Bluetooth settings and connect to the controller that appears (e.g. "DualSense Edge Wireless Controller").
- After that, turning the plugin on reconnects to the device automatically.
While connected, the Deck's controls go to your device:
| On the Deck | Does |
|---|---|
| Tap ⋯ (or the screen) | Turn the Deck screen on or off |
| Hold ⋯ for 2 seconds | Stop and give the Deck its controls back |
Switching controller types: your device remembers the Deck as the type it was paired as. To switch, remove the Deck from your device's Bluetooth settings, choose the new type, tap Pair a new device, and pair again.
Over a USB-C cable the Deck is a wired PS5 or PS5 Edge controller: no pairing, and input arrives much more steadily. On a Mac, the longest gap between updates was 14 ms over USB, against 80-140 ms over Bluetooth, and tested games felt lag-free.
- Set Connect with to Wired (USB cable).
- The first time, tap Turn on USB mode and confirm. The Deck restarts. USB mode lets the Deck's USB-C port act as a device; it's the BIOS option USB Dual Role Device.
- Turn on Use as controller and connect the Deck to your computer with a USB-C cable. It connects within a second, and again whenever you replug the cable.
While USB mode is on, USB drives, hubs and docks plugged into the Deck may not work, the Deck can't boot from USB, Windows installed on the Deck loses USB, and the Deck charges slowly from a computer. To go back, tap Turn off USB mode in the wired view (the Deck restarts again).
Switching USB mode from the plugin works on the Deck OLED with BIOS F7G0114. On other BIOS versions the plugin shows how to turn it on in the BIOS instead: with the Deck off, hold Volume + and press Power, open Setup Utility, then Advanced → USB Configuration → USB Dual Role Device → DRD.
On a Mac, PS5 Edge is the best all-round choice. Tested results:
| PS5 / PS5 Edge | Xbox Elite | Steam Controller | |
|---|---|---|---|
| Steam and games played through it (e.g. Baldur's Gate 3, Hades) | ✅ | ✅ | ✅ |
| Mac games that read controllers directly (e.g. Hollow Knight: Silksong) | ✅ | ❌ not detected | ❌ not detected |
| Rumble from Steam (Steam's test page, Steam Input games) | ❌ | ✅ | ✅ |
| Rumble from Mac games using Apple's controller support | ✅ | ✅ | – |
| Back buttons | PS5 Edge | Steam only | ✅ |
Steam Controller is for playing through Steam (including Steam on a Linux or Windows PC). The Deck has the same controls as the 2026 Steam Controller, so Steam sees both sticks, both trackpads as separate pads, the four back buttons, gyro and stick touch, and you configure them with Steam Input like a real one. Rumble and trackpad haptics come from Steam. Games that don't run through Steam won't recognize it: on a Mac that includes native games like Hollow Knight and Silksong, because macOS has no support for the Steam Controller and Steam can't pass it on to them. Tested with Steam on a Mac and on a Linux PC.
| Deck | PS5 / PS5 Edge | Xbox Elite |
|---|---|---|
| A B X Y | ✕ ○ □ △ | A B X Y |
| View / Menu | Create / Options | View / Menu |
| Steam | PS | Xbox |
| Trackpad click | Touchpad click | – |
| L4 / R4 | Edge left / right Fn | Paddles P3 / P1 |
| L5 / R5 | Edge left / right paddle | Paddles P4 / P2 |
| ⋯ | reserved for the plugin | reserved for the plugin |
As a Steam Controller every control keeps its own name (A B X Y, View / Menu, Steam, L4 / R4, L5 / R5, both trackpads); only ⋯ stays reserved for the plugin.
- Turn off screen while connected
- Check for updates Since the extension is not live on decky store yet, this is a simple way to check if there is an update, to make sure you have the latest features.
- Steam doesn't rumble the PS5 types. Steam never sends rumble to them over Bluetooth, so Steam's rumble test and games that rumble through Steam Input stay silent. Use Xbox Elite if you need rumble in those.
- Some Mac games only work with the PS5 types. Native Mac games that read controllers through Apple's support, such as Hollow Knight and Silksong, don't see the Steam Controller type at all, and may not detect Xbox Elite (below). Pick PS5 Edge for those.
- Some Mac games don't detect Xbox Elite. macOS keeps the name the Deck first paired with (e.g. "DualSense Wireless Controller") for its Bluetooth address, even after you forget it, and passes that name to games. Games that recognize controllers by name, like Silksong, then ignore the Deck. Renaming it in Bluetooth settings doesn't help.
- Xbox Elite back buttons only reach Steam. Mac games using Apple's controller support don't see the paddles; Steam and SDL-based games do.
- The Steam Controller type connects over Bluetooth Classic. A real Steam Controller uses Bluetooth LE. Steam on Linux doesn't tell them apart; other systems haven't been tried. Steam also registers the Deck to your account as a controller, with a serial number made up from the Deck's Bluetooth address, and its grip sensors and haptic audio aren't emulated.
- The Deck's own Bluetooth devices are unavailable while the plugin is on wirelessly. Headphones, controllers and keyboards paired to the Deck can't be used, and your device never uses the Deck as a speaker. Wired mode leaves the Deck's Bluetooth alone.
- Turning the plugin on or off wirelessly restarts the Deck's Bluetooth, which drops any Bluetooth devices connected to the Deck for a moment.
- Wired mode is PS5 and PS5 Edge only. The Xbox Elite and Steam Controller types work over Bluetooth only.
- USB mode can only be switched from the plugin on known BIOS versions (Deck OLED 512Gb, F7G0114 so far), because the setting's location in the firmware differs between versions. The BIOS setup screen keeps showing XHCI while the plugin has USB mode on; saving settings there turns USB mode off again.
Reports from the developer and from users. Something missing or different for you? Open an issue.
| Deck | Connected to | Controller type | Result | Source |
|---|---|---|---|---|
| OLED | Mac (macOS 27), Steam | all four | ✅ Works, see Which type to pick | @jmedina21 |
| OLED | Mac (macOS 27), native games | PS5 / PS5 Edge | ✅ Works | @jmedina21 |
| OLED | iPad Mini 7 (iOS 27) | Xbox Elite | ✅ Works | @jmedina21 |
| OLED | Mac (macOS 27), USB cable | PS5 / PS5 Edge | ✅ Works in Steam and native games, including back buttons, rumble and replugging | @jmedina21 |
| – | Steam Frame | all | ✅ Works | #3 |
| LCD | Linux PC (NixOS) | PS5 Edge | ✅ Works, including trackpads and back buttons. Remove any old pairing on both sides first. | #4 |
| – | Linux PC (CachyOS), Steam | Steam Controller | ⚠️ Works for one user; another's pairing failed with an authentication error | @SrStylus, #2 |
The plugin's backend runs a small daemon with the Deck's system Python:
- Bluetooth: restarts BlueZ with a runtime-only config (under
/run) that frees the HID channels and gives the Deck a gamepad identity, then serves the Bluetooth HID profile itself. Stopping the plugin, or rebooting, restores the stock setup. - USB: in wired mode the Deck's USB-C port acts as a USB device (Linux USB gadget) that
presents a DualSense's own USB descriptor. USB mode is turned on by changing the firmware's copy
of the USB Dual Role Device setting (one byte in the
AmdSetupUEFI variable), which takes effect at the next boot. The original variable is backed up first. - Input: takes exclusive access to the built-in controller over USB, so Steam on the Deck stops reacting to it, and translates its reports into the chosen controller's format.
- Profiles:
py_modules/sdcd/profiles/defines each controller type: its Bluetooth identity, HID descriptor, input encoding and rumble parsing.
pnpm install
scripts/deploy.sh deck@<deck-ip> # build and install over SSH (needs passwordless sudo on the Deck)
scripts/package.sh # build out/deck-as-controller.zipTo log what the host sends (rumble, setup requests), run sudo touch /run/sdcd-debug on the
Deck before turning the plugin on; the output appears in Decky's plugin log.
The plugin switches USB mode by changing one byte in the AmdSetup UEFI variable, and that
byte's position can differ between BIOS versions. To find it on yours (Desktop Mode, Konsole):
- Note the version:
cat /sys/class/dmi/id/bios_version. - In the BIOS, set USB Dual Role Device to XHCI, boot, and save a copy:
sudo cp /sys/firmware/efi/efivars/AmdSetup-3a997502-647a-4c82-998e-52ef9486a247 ~/amdsetup-xhci - Set it to DRD, boot, check that
ls /sys/class/udcshowsdwc3.1.auto, and save another copy as~/amdsetup-drd. - Compare them:
cmp -l ~/amdsetup-xhci ~/amdsetup-drd. It should print a single line such as229 0 1. The offset is that first number minus 5 (cmpcounts from 1, and the file starts with 4 attribute bytes), so229means224. Also note the file size (ls -l). - Add
"<version>": <offset>toDRD_OFFSETSinpy_modules/sdcd/usb.py, or open an issue with the version, thecmpoutput and the file size. If the size isn't 1474 bytes, mention it: the plugin checks the size before writing.
Only map a version when exactly one byte differs. The menu itself is the Setup variable, which
the firmware doesn't let the OS write, so its offset alone isn't enough. You can still use it to
cross-check: the firmware images in /usr/share/jupiter_bios/ contain the BIOS menus, and
running UEFIExtract and
IFRExtractor-RS on the SetupUtility module
shows "USB Dual Role Device" and its Setup offset (0x227 on F7G0114).
Contributions are welcome: bug reports, pull requests, and test results on devices we haven't tried yet (Windows, Android, other Linux distributions, other macOS and iPadOS versions).
When reporting a problem, please include your Deck model, the controller type you picked, the
device you connected to, and the plugin log from ~/homebrew/logs/deck-as-controller/ on the
Deck. To capture what your device sends to the Deck, see the debug tip under
Development.
Released under the MIT License.
Steam and Steam Deck are trademarks of Valve Corporation. PlayStation, DualSense and PS5 are trademarks of Sony Interactive Entertainment. Xbox and Xbox Elite are trademarks of Microsoft. Mac and iPad are trademarks of Apple. These names are used only to describe compatibility; this project isn't affiliated with or endorsed by any of these companies.
The plugin changes the Deck's Bluetooth setup and takes over its built-in controller while it runs. Both are restored when you turn it off or reboot. Turning on USB mode changes a firmware setting, which stays until you turn it off in the plugin or change it in the BIOS. Use it at your own risk.