Low latency virtual gamepad — built with Kotlin and Jetpack Compose
PadConnect lets your phone act as a real controller (Xbox 360/DualShock4) for a PC. It streams gamepad input with very low latency and exposes it on Windows using ViGEm and natively in linux.
This project is split into two parts:
- PadConnect -> Android / client app (virtual controller UI)
- PadConnectReceiver -> PC / receiver app (creates virtual controller)
- Xbox 360(working)/DualShock4(soon) compatible virtual controller
- Low latency input streaming (UDP based)
- Built with Kotlin
- UI powered by Jetpack Compose
- Windows receiver using ViGEm
- Supports buttons, triggers, sticks, and D-Pad
- Works over local Wi-Fi (no internet required)
[ Android Phone ] ── UDP ──▶ [ PadConnectReceiver (PC) ] ──▶ [ ViGEm ] ──▶ Game
-
PadConnect (Android)
- Renders a virtual controller using Compose
- Captures button / axis input
- Serializes input events
- Sends them over UDP
-
- Listens for incoming UDP packets
- Deserializes controller events
- Feeds them into ViGEm in windows and natively in linux
- Exposes a virtual Xbox 360(working)/DualShock4(soon) controller to the OS
Games see it as a real controller.
- Kotlin + Jetpack Compose
- UDP networking
- Touch -> Gamepad mapping
PadConnectReceiver (Server)
- Kotlin Multiplatform (KMP)/JVM
- ViGEm (Virtual Gamepad Emulation Framework)
- Xbox 360(working)/DualShock4(soon) device emulation
- Android 10+
- Wi-Fi connection
- Windows 10 / 11
- ViGEmBus Driver installed
- .NET / JVM compatible environment (depending on receiver build)
- no requirements
Download and install ViGEmBus:
- Official ViGEm GitHub release
Reboot after installation.
Windows: PadConnectReceiver.exe
Linux: PadConnectReceiver.AppImage- Starts listening on UDP
- Creates a virtual controller
- Install the app on your phone
- Create a layout
- Start playing
- Buttons: A / B / X / Y
- Shoulder buttons
- Right Analog Stick (it is mostly used for changing camera angle so emulated as touch screen like change camera angle in a mobile game)
- Left Analog Stick
- R3 and L3 added as separate buttons
PadConnect/
├─ app/
PadConnectReceiver/
├─ data/
├─ input/
├─ main/ui/
├─ native/
├─ utils/
├─ viewmodel/
- DualShock4 input executor
- Multiple controller support
- Custom controller layouts
- Latency stats
- BLE HID (does not require receiver)
- Linux receiver
- low latency Game streaming as optional option
- USB support
- Optimise input sending
- Support for grid based controller customisation
- Support for on-screen button press haptic feedback as optional option
- improve controller haptic feedback if possible
- add right analog stick as optional option
- Allow to edit entire osc(On Screen Controller) at once
- don't show latency indicator text at all if disabled or not detected yet
- decouple online or offline detection behaviour from latency indicator
- Allow to reset controller customisations
- Make layout configurable at the moment the user creating
- Make setup screen smart to give the most latest compatible receiver version link
- Works best on local Wi-Fi (TODO: Implement BLE HID)
- Firewall may need UDP port allowance
- ViGEm is Windows only
- ViGEm — Virtual Gamepad Emulation Framework
- Kotlin & Jetpack Compose teams
This project is licensed under the GNU General Public License v3.0 (GPL-3.0-only)
Built for low latency, simplicity, and fun.