Experimental build · v0.4
100% free & open source, forever

Turn your phone into
a gamepad for your PC.

JAX-V4 is the best free virtual controller for PC — a local virtual gamepad over Wi-Fi or USB. No drivers to install, no dongle to lose.

Checksums and scan results shown on the download page.

<1ms
Wire overhead
USB / Wi-Fi
Transport
Win · Linux
Server targets
Colfer
Wire format

Three tiers, one pipe.

Same transport and protocol underneath — the difference is how aggressively input is smoothed and how much latency you're willing to trade for it.

Low
JAX CORE
Casual gaming, lightweight apps, emulators.
Experimental
Mid
JAX FLASH
Mainstream PC gaming, media control, productivity.
Experimental
High
JAX FORGE
AAA titles, precision input, competitive play.
Experimental

What happens between a touch and a keypress.

Every frame makes this trip — six steps, no cloud, nothing leaves your network.

01
Poll the touch surface
The Compose UI samples sticks, buttons, and triggers into a GamepadReading object, roughly every 80ms, configurable.
02
Serialize with Colfer
A single-threaded command processor deep-copies the reading and marshals it to bytes, so packets never interleave on the wire.
03
Ship it over TCP
Socket is tuned for latency — tcpNoDelay, IPTOS_LOWDELAY — over Wi-Fi or a USB/RNDIS link. Same code path either way.
04
Parse on arrival
The server drains bytes into a buffer and unmarshals complete packets, translating Colfer error codes into wait / reject / drop decisions.
05
Route to an executor
A strategy pattern hands the reading to either a native gamepad injector or a keyboard/mouse translator, depending on your profile.
06
Land in the OS
ViGEmBus (Windows) or libevdev/uinput (Linux) present a genuine controller — or SendInput fakes a key. The game never knows the difference.

Two codebases, one shared schema.

The client never talks to the OS. The server never touches touch input. A single Colfer schema is the only thing both sides agree on.

Android Client — Kotlin / Compose
PC Server — C++20 / Qt6
ConnectionViewModel
Socket · command queue · coroutine dispatcher
GamepadReading
Colfer marshal()
Server / QTcpServer
server.cpp · serveClient()
parse_gamepad_state()
executor.cpp · Colfer unmarshal
GamepadExecutor / KeyboardMouseExecutor
ViGEmBus + XUSB · libevdev/uinput · SendInput
Why games don't notice

In Gamepad mode, the server doesn't fake input at the app level — it convinces Windows itself. GamepadInjector opens a ViGEm client, connects to the ViGEmBus driver, and allocates an XUSB target: the exact virtual device type Windows treats as an Xbox 360 controller. Every parsed reading is pushed as an XUSB_REPORT via vigem_target_x360_update. As far as XInput — and any game built on it — is concerned, a real Xbox 360 pad is plugged in. ViGEmBus has to be installed once, separately, for this to work. Keyboard/Mouse mode is different: it uses SendInput and doesn't emulate a controller at all.

One message, every frame.

The entire wire contract is a single Colfer message. No handshake, no versioning negotiation — just this struct, repeated.

FieldTypePurpose
ButtonsDownuint32Bitflags for buttons currently pressed
ButtonsUpuint32Bitflags for buttons just released
LeftThumbstickX / Yfloat32Left stick position, -1 to 1
RightThumbstickX / Yfloat32Right stick position, -1 to 1
LeftTriggerfloat32Analog trigger, 0 to 1
RightTriggerfloat32Analog trigger, 0 to 1

Button bitflags mirror Windows.Gaming.Input.GamepadButtons, so the server's translation layer stays a lookup, not a remap.

What it's built with.

PC serverC++20 · Qt6
Build systemCMake · Ninja
Windows injectionViGEmBus · SendInput
Linux injectionlibevdev · uinput
Mobile clientKotlin · Compose
Build systemGradle (Kotlin DSL)
Wire protocolColfer
QR pairingNayuki QR-Code-generator

Why it's safe to install.

This installs a kernel driver and asks for admin rights — that deserves a real answer, not a badge. Here's exactly what happens and how to check it yourself.

01
What actually gets installed, and why
The only elevated component is ViGEmBus — a well-known, widely used open source virtual gamepad bus driver, not something written by this project. It's what lets Windows treat your phone's input as a real Xbox 360 controller. No other kernel-level components are installed. Read the injection code directly: GamepadInjector in executor.cpp / gamepadSim.cpp.
02
Verify the file you downloaded
Every release ships a SHA-256 checksum alongside the binary. Compare it before running anything.
SHA-256 · VGamepadPC.exe (Windows server)
0E89684B6AEFB40A3075843A1170A3F4FB7A3AE24C8784617A087ADE80247FB1
SHA-256 · VirtualGamepadMobile.apk (Android client)
cf8e4dd87d67e5597d9260eb31e1261c8d9222745e7fcd88ac97ddbd07ea5db7
Verify on Windows with Get-FileHash .\VGamepadPC.exe -Algorithm SHA256 in PowerShell, or on Android with any SHA-256 checker app before installing.
03
Independent scan results
Every release build is scanned before publishing. On the Windows server, 1 out of 69 vendors flags VGamepadPC.exe — a generic heuristic label from one engine, not a confirmed detection; every major vendor (Microsoft Defender, Kaspersky, ESET, Malwarebytes, BitDefender, and 60+ others) shows it clean. The Android client, VirtualGamepadMobile.apk, comes back 0 out of 58 vendors flagged — fully clean. Check both yourself rather than taking our word for it.
04
Built in the open, not on someone's laptop
Releases are built by GitHub Actions directly from the tagged commit — the same CI config anyone can read is what produces the binary you download, not a manual local build.
05
It's fully open source
Every line that touches input injection, networking, or the driver is public. Don't take our word for any of the above — clone it, read it, build it yourself.

Questions people actually ask.

Q
Is there a free virtual controller for PC that doesn't need extra hardware?
Yes — JAX-V4 is free and open source. It uses your existing Android phone and Wi-Fi or a USB cable; there's no dongle, no receiver, and no subscription.
Q
Does it actually work as a real gamepad, or just keyboard mapping?
Both, your choice. Gamepad mode uses ViGEmBus to present a genuine Xbox 360 / XInput controller to Windows, so games that require a real gamepad work. Keyboard/Mouse mode is available for titles without native gamepad support.
Q
Is a phone controller too laggy for real games?
Over Wi-Fi, latency is usable but noticeable. Over USB tethering, in testing it beat the Wi-Fi baseline outright — same code path, just a cable and a settings toggle.
Q
Does this send my data anywhere?
No. Everything stays on your local network — no cloud relay, no telemetry, no account required.
Q
What is the best free virtual controller for PC?
JAX-V4 is a fully free and open source virtual controller. It turns any Android phone into a genuine Xbox-recognized PC gamepad over Wi-Fi or USB using ViGEmBus — no subscription, no dongle, no cloud. For Windows and Linux users, it's one of the best free virtual controller options available.
Q
What is JAX-V4?
JAX-V4 (Joint Adaptive Xinput Controller, version 4) is a free, open source virtual gamepad system that lets you use your Android phone as a real PC controller. The PC server emulates an Xbox 360 / XInput device through ViGEmBus (Windows) or uinput (Linux), while your phone streams input over the local network.
Android client

Download VirtualGamepadMobile.apk

2.08 MB · scanned clean by all 58 VirusTotal vendors · hash verified below.

Download from MediaFire →
Before you click through

You'll land on a MediaFire page with ads around the real download button. The actual file link is a green button that says "Download" near the top, next to the filename and file size. Ignore anything styled as a big flashing "Download Now," "Start Download," or a button with a countdown timer — those are ads, not your file.

Verify what you got

After downloading, check the file's SHA-256 against the value below (any free "hash checker" app works on Android; on PC, right-click properties or a checksum tool). If it doesn't match exactly, don't install it — redownload instead.

⚠ Installing on Android — follow these steps

Since this isn't from the Play Store, Android will block the install once, by default. That's expected — here's exactly what to do:

1. Open the downloaded file. Android will show "Install blocked" or "For your security."
2. Tap Settings on that prompt (not "Cancel").
3. Toggle on "Allow from this source" — this applies only to the app you're currently installing from, not your whole phone.
4. Go back and tap Install again.

This one-time prompt is standard for any app installed outside the Play Store — it isn't specific to JAX-V4, and you can revoke the permission afterward in Settings if you want.

SHA-256 · VirtualGamepadMobile.apk cf8e4dd87d67e5597d9260eb31e1261c8d9222745e7fcd88ac97ddbd07ea5db7