Skip to content

AarveeGill/Phantom-Sense

Repository files navigation

PhantomSense

Forward a DualSense from your Steam Deck to your PC over the network.
Adaptive triggers, HD haptics, gyro, and touchpad — all working natively over Moonlight.

License: MIT Platform Maintained PRs Welcome


PhantomSense is a turnkey setup pipeline that forwards a DualSense controller from a Steam Deck to a Windows PC using USB/IP. Your PC sees a real, wired DualSense — not a virtual Xbox pad — so every advanced feature works natively. Moonlight carries the video. VirtualHere carries the controller. Total cost is zero.

Demo video coming soon — see Roadmap.


Why this exists

Moonlight translates every controller into a virtual Xbox 360 gamepad before it reaches the PC. Adaptive triggers, HD haptics, gyro, and touchpad are stripped in that translation. Sunshine on Windows only supports Xbox 360 and DualShock 4 emulation. Native DualSense emulation exists only on Linux, and even there, adaptive triggers are blocked by SDL limitations.

DualSense --> Steam Deck --> Moonlight --> [XInput Translation] --> Virtual Xbox Pad
                                                  ^
                                          Features lost here.

PhantomSense bypasses this entirely. It forwards the DualSense as a raw USB device over the network, so Windows believes the controller is physically plugged in. DSX picks it up. Everything works.

DualSense --> Steam Deck --> VirtualHere USB/IP --> Network --> PC sees native DualSense
              Steam Deck --> Moonlight --------------------------> Sunshine (video + audio only)
                                                                         |
                                                                     DSX on PC
                                                                 Adaptive Triggers  [works]
                                                                 HD Haptics         [works]
                                                                 Gyro               [works]
                                                                 Touchpad           [works]

Two parallel data paths. They never interfere.


Who is this for


Your Gaming PC

The powerhouse. Sits in your main room or office. Runs every AAA title at max settings. It's always on, always ready.

TVs Around The House

Living room. Bedroom. Basement. You've set up Moonlight + Sunshine to stream PC games to every screen in the house.

Your Steam Deck

Your portable companion. Play on the couch, on a TV via HDMI, or in bed. It can also run games natively — but it really shines as a streaming powerhouse.

Now add a DualSense to the mix — Sony's flagship controller with adaptive triggers, HD haptics, gyroscope, and touchpad. You paid a premium for those features. You expect them to work.

They don't. When Moonlight streams your game, it converts the DualSense into a generic Xbox 360 gamepad. Every premium feature is silently killed. Your $200 controller feels like a $20 one.


Adaptive Triggers — Lost HD Haptics — Lost Gyroscope — Lost Touchpad — Lost

PhantomSense Fixes This

Plug your DualSense into the Steam Deck via USB-C. PhantomSense forwards that controller as a raw USB device directly to your PC over the network — bypassing Moonlight entirely. Your PC sees a real, wired DualSense. Every feature works.


Handheld Mode

Stream from PC to Deck. DualSense plugged into Deck. Play on the Deck's screen with full trigger and haptic feedback.

Docked Mode

Deck connected to a TV via HDMI. DualSense plugged into Deck. Big screen gaming with every DualSense feature alive.

Bridge Mode

Gaming on any TV in the house. Deck sits nearby as a USB bridge — its only job is forwarding the DualSense to your PC.


Quick install

Steam Deck — open Konsole in Desktop Mode:

curl -sL https://raw.githubusercontent.com/AarveeGill/Phantom-Sense/main/install-phantomsense-deck.sh | bash

Windows PC — download install-phantomsense-pc.bat and double-click it. Handles admin elevation, downloads, and full setup. No terminal needed.

After both scripts finish: plug the DualSense into the Deck, open VirtualHere Client on the PC, attach the controller, launch DSX. Done.

Tip

The Deck installer creates a systemd service (auto-starts at boot in Desktop and Game Mode), a desktop shortcut, and a restore script for SteamOS updates. The PC installer handles VirtualHere Client, ViGEmBus, HidHide, Sunshine config, and DSX.


What this enables

PhantomSense is the pipeline. These are the capabilities it unlocks:

Capability How
Adaptive triggers Per-game resistance profiles through DSX
HD haptics Precision feedback via DualSense audio channels
Gyroscope Full 6-axis motion passthrough
Touchpad Native multi-touch input
Zero cost VirtualHere free tier covers exactly one USB device
Low latency USB/IP over LAN adds ~1–3 ms
Auto-start on boot Systemd service runs in Desktop and Game Mode
Survives SteamOS updates Binary persists in /home/deck/; restore script rebuilds the service
Tailscale-ready Works over encrypted mesh VPN
Standard DualSense support Not just the Edge — both models work identically

Requirements

Hardware

Device Notes
Gaming PC Windows 10 or 11
Steam Deck SteamOS — handheld, docked, or bridge mode
DualSense Edge or standard
USB-C cable Connects DualSense to Steam Deck
Local network Same LAN, or Tailscale

Software

Software Role Where Link
Sunshine Stream host PC LizardByte/Sunshine
Moonlight Stream client Deck moonlight-stream.org
VirtualHere Server USB/IP server Deck virtualhere.com
VirtualHere Client USB/IP client PC virtualhere.com
DSX (DualSenseX) Triggers + haptics engine PC Steam / GitHub
Tailscale (optional) Mesh VPN Both tailscale.com

How it works

+------------------------------------------------------------------+
|                    STEAM DECK (Room B)                            |
|                                                                   |
|  +-----------+  USB-C  +--------------------+                     |
|  | DualSense |-------->| VirtualHere Server |                     |
|  +-----------+         +--------+-----------+                     |
|                                 | TCP :7575                       |
|  +-------------------+          |                                 |
|  |    Moonlight      |          |                                 |
|  | (video/audio only)|<---+     |                                 |
|  +-------------------+    |     |                                 |
+---------------------------+-----+---------------------------------+
                            |     |
                     +------+-----+------+
                     |   Network (LAN)   |
                     +------+-----+------+
                            |     |
+---------------------------+-----+---------------------------------+
|                    GAMING PC (Room A)                             |
|                           |     |                                 |
|  +-------------------+    |     |                                 |
|  |    Sunshine       |----+     |                                 |
|  | controller = off  |          |                                 |
|  +-------------------+          |                                 |
|                                 |                                 |
|  +--------------------+ USB/IP  |                                 |
|  | VirtualHere Client |<--------+                                 |
|  +--------+-----------+                                           |
|           | appears as local USB                                  |
|  +--------v-----------+                                           |
|  |       DSX          |                                           |
|  | Adaptive Triggers  |                                           |
|  | HD Haptics         |                                           |
|  | Gyro + Touchpad    |                                           |
|  +--------+-----------+                                           |
|           |                                                       |
|  +--------v-----------+                                           |
|  |       Game         |                                           |
|  +--------------------+                                           |
+------------------------------------------------------------------+

Alternatives considered

Approach Latency Cost Complexity Full DS features SteamOS compatible
PhantomSense (VirtualHere) ~2–4 ms Free Medium Yes Yes
USB/IP open-source ~1–3 ms Free High Yes Yes
Sunshine DS4 emulation <1 ms Free Low No Yes
Sunshine DS5 (Linux only) <1 ms Free Medium No N/A
DS5Dongle (RPi Pico 2W) ~1 ms $7–16 Low Yes No

VirtualHere won because the free tier supports exactly one USB device — which is exactly what this needs. Signed Windows drivers, auto-discovery, a single static binary on SteamOS, and years of production use. The $49 license is only for forwarding multiple devices.


Performance

Component Added latency Notes
VirtualHere USB/IP (LAN) ~1–3 ms TCP encapsulation, negligible
Moonlight / Sunshine video ~5–15 ms Encoder and network dependent
DSX processing <1 ms Local
Total controller overhead ~1–3 ms Imperceptible vs. direct USB

The dominant latency is always the video stream, never the controller.


Cost

Item Cost
VirtualHere Server (free tier, 1 device) $0
VirtualHere Client $0
DSX (free version) $0
Moonlight $0
Sunshine $0
Tailscale (personal) $0
Total $0

VirtualHere's free tier has no time limit. The $49 license is only for multiple devices. DSX's paid DLC (~$4.99) adds extra haptic modes; the free version covers the essentials.


Your gaming session

Once set up, each session is:

  1. Power on the Steam Deck. VirtualHere starts automatically.
  2. Plug in the DualSense. VirtualHere Client on the PC auto-attaches it.
  3. DSX detects the controller. Triggers and haptics activate.
  4. Open Moonlight on the Deck, connect to Sunshine, pick a game.
  5. Play. Full DualSense, from the other room.

The DualSense is forwarded to the PC, so it won't control the Deck locally. Use the Deck's touchscreen or built-in controls to navigate Moonlight.


Manual setup

Tip

If you used Quick install, skip this entirely.

Phase 1 — VirtualHere Server on Steam Deck

Switch to Desktop Mode. Open Konsole.

passwd                          # set a password if you haven't
mkdir -p ~/Documents/virtualhere
cd ~/Documents/virtualhere
wget https://www.virtualhere.com/sites/default/files/usbserver/vhusbdx86_64
chmod +x vhusbdx86_64
sudo ./vhusbdx86_64             # plug DualSense in first

You should see VirtualHere USB Server x86_64 running...

[!WARNING] Closing the terminal kills the server. See Phase 6 for auto-start.

Phase 2 — VirtualHere Client on Windows

Download the VirtualHere Windows Client and run it. The Deck should appear within ~15 seconds.

If it doesn't (common with multi-router setups): right-click the top node > Specify Hubs > Add > enter <Steam_Deck_IP>:7575.

Phase 3 — Forward the DualSense

Expand the Steam Deck node. Right-click the DualSense > Use this device. Windows installs HID drivers automatically. Status should read "In use by you".

Verify in Device Manager: Sony HID entry under Human Interface Devices, and a new audio device under Sound (haptics use audio channels).

Phase 4 — DSX setup

Install DSX from Steam. Install ViGEmBus (required) and HidHide (optional, prevents double-input).

Launch DSX. It should detect the DualSense as a wired USB controller. Open the trigger test panel, apply a preset like Rigid or Pulse. If the triggers push back, PhantomSense is working.

Phase 5 — Sunshine / Moonlight config

Disable controller passthrough to prevent double input.

In Sunshine (https://localhost:47990) > Configuration > Input > set Controller to disabled. Or add to sunshine.conf:

controller = disabled

Moonlight now carries video and audio only.

Phase 6 — Auto-start on boot

[!TIP] The Quick Install script handles this automatically, including the restore script.

sudo nano /etc/systemd/system/virtualhere.service
[Unit]
Description=VirtualHere USB Server
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/home/deck/Documents/virtualhere/vhusbdx86_64
Restart=always
RestartSec=3
User=root

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable virtualhere.service
sudo systemctl start virtualhere.service

SteamOS updates can wipe /etc/systemd/system/. The binary in /home/deck/ survives. Keep a restore script to recreate the service, or use Quick Install, which saves one at ~/phantomsense/restore-service.sh.


Troubleshooting

VirtualHere Client shows nothing
  • Server not running: sudo systemctl status phantomsense
  • Different subnets: manually add the hub at <Deck_IP>:7575
  • Firewall: sudo iptables -A INPUT -p tcp --dport 7575 -j ACCEPT
DSX does not detect the DualSense
  • VirtualHere must show "In use by you"
  • Check Device Manager for a Sony HID entry
  • Unplug and re-plug USB-C, re-attach in VirtualHere
  • Restart DSX
Double input or ghost controller
  • Set controller = disabled in Sunshine config
  • Whitelist only DSX in HidHide
  • Confirm Moonlight isn't forwarding a virtual pad
HD haptics not working
  • Haptics use audio channels (4-channel device: 2 headphone, 2 haptic)
  • Check Windows Sound Settings for a DualSense audio device
  • Confirm the haptic channels aren't muted
Service wiped after SteamOS update
  • Binary survives in /home/deck/ — only the systemd unit is wiped
  • Quick Install users: sudo ~/phantomsense/restore-service.sh
  • Manual users: recreate from Phase 6
Noticeable input latency
  • Use wired Ethernet instead of Wi-Fi
  • In VirtualHere Client: right-click hub > Optimize for Interactive (Low Latency)
  • Try Tailscale for a more direct route through double-NAT

FAQ

Does it work with the standard DualSense (non-Edge)?

Yes. Both models use the same HID protocol.

Can I use the DualSense on the Deck and PC at the same time?

No. USB/IP detaches it from the Deck. Use the Deck's own controls for Moonlight navigation.

Does this work over the internet?

Yes, with a VPN like Tailscale. LAN is recommended for gaming latency.

What about anti-cheat?

Some engines may flag VirtualHere's virtual USB hub driver. Best suited for single-player and co-op titles.

Do DSX game-specific profiles work?

Yes. DSX sees a normal wired USB DualSense. Every profile and trigger configuration works.


Fallback — open-source USB/IP

Fully open-source setup without VirtualHere

Steam Deck

sudo steamos-devmode enable
sudo pacman -S usbip
sudo modprobe usbip-core usbip-host
sudo usbipd -D
usbip list -l
sudo usbip bind -b X-Y   # replace with actual bus ID

Windows

Use usbip-win2 — actively maintained with WHLK-certified drivers.

Trade-offs

USB/IP (open source) VirtualHere
Cost Free Free (1 device)
Stability Occasional BSOD risk Very stable
SteamOS persistence Wiped on updates Survives
Complexity High Medium
Auto-discovery Manual Automatic

Network topology

Reference diagram
         +------------------+
         |    Gaming PC     |
         |  Sunshine        |
         |  VH Client       |
         |  DSX             |
         +--------+---------+
                  |  Ethernet
         +--------+---------+
         |    Router 1      |
         +--------+---------+
                  |  Ethernet
         +--------+---------+
         |    Router 2      |
         +--------+---------+
                  |  Wi-Fi
         +--------+---------+
         |    Steam Deck    |
         |  VH Server       |
         |  Moonlight       |
         |  DualSense <-- USB-C
         +------------------+

If auto-discovery fails, the two routers likely put devices on different subnets. Add the hub manually or use Tailscale.


Security

PhantomSense install scripts run with elevated privileges (sudo on Linux, Administrator on Windows). They download binaries from official sources (VirtualHere, GitHub releases for ViGEmBus and HidHide). Review the scripts before running them. All source URLs point to the original vendor distribution pages.

If you find a security issue, open a GitHub issue with the security label.


Roadmap

  • One-click setup script for Steam Deck
  • One-click setup script for Windows PC
  • Double-click .bat launcher for Windows
  • phantomsense --status diagnostic check
  • Decky Loader plugin for Game Mode integration
  • Video walkthrough and demo
  • Wired vs. Wi-Fi latency benchmarks
  • Tailscale WAN configuration guide
  • Game compatibility matrix
  • Track Sunshine DS5 emulation — LizardByte #652

Contributing

Bug reports, documentation improvements, script enhancements, game compatibility reports, and alternative network configurations are all welcome. Open an issue or submit a pull request.


Credits

Project Author Role in PhantomSense
VirtualHere VirtualHere Pty. Ltd. USB/IP transport layer
DSX / DualSenseX Paliverse Adaptive triggers and haptics engine
Sunshine LizardByte Open-source stream host
Moonlight moonlight-stream Stream client
DS5Dongle awalol Validated wired DualSense = full features
usbip-win2 vadimgrn Open-source USB/IP client
Steam Deck USB/IP kalvinarts Pioneered USB/IP on SteamOS

And every forum poster, Reddit commenter, and GitHub contributor whose scattered fragments helped piece this together.


License

MIT License — Copyright (c) 2026 Rajvinder Singh


Your PC sees a DualSense that isn't there. That's PhantomSense.

If this helped, a star helps others find it.

About

Enable full DualSense/ DualSense Edge features (Adaptive Triggers, HD Haptics, Gyro, Touchpad) over Moonlight/Sunshine game streaming via Steam Deck using USB/IP forwarding , for free.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages