Gamepad Tester
Every button, trigger and stick on your controller, live, with drift and circularity.
Runs entirely in your browser
Loading the tool…
Plug in or pair a controller, then press any button on it. Browsers keep controllers hidden from a page until a button is pressed, so an empty page before then is expected, not a fault.
Connect a controller by cable or Bluetooth and press any button. Browsers keep controllers hidden from a page until one is pressed, so that a site cannot tell what you own just by being opened. After that, everything on it appears here and moves as you do.
Every button lights as it goes down and stays marked once it has worked, so after a run through, the one still blank is the one that is not reaching the computer. Triggers show how far they are pressed, from 0 to 1, which is how to tell a trigger that is worn from one that is simply light.
Stick drift is a stick that reports movement when nobody is touching it. Let go of both sticks and read the figure under each: a healthy stick rests within a few hundredths of the centre. Anything above about 0.15 is past the deadzone most games ignore, and is the drift that makes a character walk on its own.
Then roll each stick slowly round its edge. The page draws the outline it reached and scores it against a perfect circle. A good stick sits within a few percent. Some controllers report a rounded square on purpose, which shows as corners, and a worn one shows as flat spots in the directions you use most.
How to use it
- Connect the controller and press any button on it.
- Press every button, and let go of the sticks to check for drift.
- Roll each stick slowly round its edge to score its circularity.
Questions
Why does nothing happen when I connect my controller?
Press a button. Browsers deliberately hide controllers until you press something on one while the page is open, so connecting it alone shows nothing. If it still does not appear, check the operating system sees it, try a cable instead of Bluetooth, and try Chrome or Edge, which recognise the most controllers.
How do I know if my stick has drift?
Let go of it completely and read the figure under the stick. A few hundredths is normal. Above 0.15 the stick is reporting movement no game will ignore. Drift usually comes from worn potentiometers inside the stick; compressed air around the base fixes some cases, and the rest need the stick module replaced.
What is a good circularity score?
Under about 10 percent average error is typical for a healthy controller, and good ones read in low single figures. Many controllers are deliberately a little square at the diagonals so that full tilt reaches 1 in every direction, which raises the score without anything being wrong. What matters is flat spots in one direction that the others do not have.
Why are some buttons named by number?
Because the browser did not recognise the controller's layout. Controllers it knows, including Xbox and PlayStation pads, are mapped to a standard layout and named here. Anything else is passed through as numbered buttons and axes, which still shows whether each one works, just not what it is called.
Does the vibration test work on every controller?
No. It depends on the browser as well as the pad: Chrome and Edge rumble most Xbox and PlayStation controllers, and other browsers support fewer. The button only appears when the browser reports that the connected controller can vibrate.
My PlayStation controller shows Xbox button names.
The standard layout numbers buttons by position, not by symbol, and each name here gives both: A / Cross is the bottom face button on either pad. The position is what a game reads, so it is the same button whichever symbol is printed on it.
Is anything sent anywhere?
No. The controller is read by the browser in this tab and drawn on the page, and that is all. The page is served with a header that forbids it opening a connection to anywhere.
Your data stays on your device
Everything above runs inside your browser as WebAssembly compiled from Rust. Nothing you type is uploaded, logged or stored on a server. You can load this page once, go offline, and it still works.
This page makes no requests at all, to anywhere. That is not a promise in the copy: it is a Content-Security-Policy header your browser enforces, and connect-src on it is none. Open the network tab and watch nothing happen.