English · Deutsch
DualSense over Bluetooth – to games it looks like a wired controller. On Linux, adaptive triggers, HD haptics and the controller speaker normally only work over a USB cable. DS5Tee makes them work wirelessly without any extra hardware: it is a software version of the Pico dongles DS5Dongle and DS5_Bridge.
Tested with Stellar Blade (GE-Proton 11): triggers, haptics and speaker work over Bluetooth, also with several controllers at once.
Games only enable the DualSense extras for a wired controller and find its audio device (speaker + haptics) through the shared USB device. A virtual HID controller alone is therefore not enough.
For every DualSense connected over Bluetooth, ds5bridge presents a complete USB DualSense to the
kernel – via USB/IP (vhci_hcd), using the USB descriptors of DS5Dongle (HID + 4-channel USB audio).
Linux, PipeWire and Proton see a real USB device:
| Direction | Translation |
|---|---|
| Controller → PC | Bluetooth input 0x31 → USB input 0x01 |
| PC → Controller | USB output 0x02 → Bluetooth 0x31 with sequence number and CRC32 |
| USB audio (4 channels, 48 kHz) | channels 3/4 → haptics (3 kHz, int8), channels 1/2 → speaker (Opus), Bluetooth report 0x39 |
| Feature reports | read: passed through · write: only 0x80 and 0x60–0x62 (others drop the connection) |
The real Bluetooth controller is hidden from games and Steam so it doesn't show up twice: while the bridge runs, a udev rule
(in /run/udev/rules.d) makes its nodes root-only the moment they appear, before anything can open them.
Other Bluetooth devices (keyboard, mouse, other gamepads) are left alone.
Settings per controller (or as the default for new controllers):
- Speaker, haptics, rumble – with a short test sound / test rumble when you release the slider
- Triggers L / R: strength and mode (from game, off, resistance, weapon, vibration)
- Gyro to right stick (off / while aiming with L2 / always) with sensitivity, horizontal/vertical invert – like on the Switch: coarse with the stick, fine by tilting; works in every game without Steam Input
- Light bar: custom color, by battery level (up to 5 points with your own colors, blended or in steps) or from the game, adjustable brightness; controller ID (player LEDs 1–4)
- Controller microphone over Bluetooth (switch, off by default)
- Auto-disconnect when idle, disconnect controller (also by middle-clicking the tray icon), reset
- Touchpad as desktop mouse on/off (KDE Plasma)
- Live view of buttons, sticks, triggers and touchpad (two fingers)
- Battery level in the tooltip
- Wired emulation on/off: off turns the pad back into a plain Bluetooth pad (restart the game after switching)
- Keeps the pad's haptics/speaker stream on the controller when Arctis Sound Manager would route all game audio to the headset
Small and light: both are Rust programs (bridge ~0.6 MB, about 3 MB RAM; tray about 4 MB RAM). The settings
window is its own process, drawn on the CPU (no GPU driver loaded, about 11 MB RAM), and only runs while it is
open. Starting DS5Tee again while the tray runs opens the settings.
The interface follows the system language: German on German systems, English otherwise.
- Linux with
vhci_hcd(part of the standard kernel, USB/IP) and BlueZ libopus; to build: Rust (cargo)- For haptics and speaker in games: a Proton with DualSense audio support, e.g. GE-Proton 11
- In the game / in Steam: turn off Steam Input for the game so it talks to the controller directly
Arch / CachyOS:
sudo pacman -S rust opus bluez-utilsgit clone https://github.com/ProfessorTee/DS5Tee.git
cd DS5Tee
sudo ./install.shThis builds both programs (as your user) and installs the system service ds5bridge and the tray tool
DS5Tee (starts at login).
Then connect the DualSense over Bluetooth as usual – even while a game is already running
(tested with Monster Hunter Wilds: haptics arrive in the running game after connecting).
- Log:
journalctl -u ds5bridge -f - Settings:
~/.config/ds5bridge.json(written by DS5Tee) - Uninstall:
sudo ./install.sh undo
- The controller microphone is experimental and off by default (switch in the settings window).
- The per-side trigger strength scales the effect parameters of the common modes; rare effects (bow, galloping, machine) are left unchanged.
- Tested on CachyOS with KDE Plasma; the touchpad switch uses KWin.
- awalol/DS5Dongle (MIT) – USB descriptors, HID report descriptor
(
usb_report_desc.bin) and the format of the Bluetooth audio reports - SundayMoments/DS5_Bridge – inspiration and speaker settings
- GE-Proton – DualSense haptics under Proton
MIT, see LICENSE.
