Gamepad Tester
Test every button, trigger and stick the browser reports. The drift check measures resting stick offset, not stick wear. You can also trace the stick range and try rumble when this browser exposes it.
Plug it in with USB or pair it over Bluetooth, then press a face button. Browsers hide controllers until you press something on them (a privacy rule), so nothing shows up before that. Everything runs locally in your browser.
How to read your controller test
What the drift check measures
Drift on this page is the resting offset: how far the stick axes sit from 0 while you are not touching them. The check averages that position for 3 seconds. It does not open the controller, so it cannot tell wear, dust or a bad calibration apart. A driver may also snap small offsets to 0 before the browser sees them.
On many pads the stick reads position with two potentiometers, and a worn or dirty track is one reason a resting offset shows up. Hall-effect and TMR sticks sense a magnet instead, so the track does not rub in the same way. Whatever the mechanism, the number above is only what the Gamepad API reported.
Reading the drift numbers
Axis values run from -1 to 1, with 0 at the centre. The drift check reports the distance of the average resting position from centre. Under 0.05 is a small offset, 0.05 to 0.15 is a mild one, and above 0.15 many games will treat the stick as moved. Peak is the largest distance in a single sample during the window, which shows jitter rather than a steady offset. A reading of 0.000 can mean the driver already recentred the axes, so it does not prove the mechanism is centred.
For the circularity trace, error is the average gap between the furthest point reached in each sampled direction and a circle of radius 1. A round range often lands under about 10%. The trace is the shape the browser reported, not a measure of wear.
Deadzone advice
A deadzone is the distance a game ignores. Set the ring to the value your game uses. If the dot rests outside that ring, the game can treat the rest position as movement. A ring just above the resting offset hides a mild offset, with less fine movement near centre. A very large ring makes small aim movements feel dead, so treat that as a workaround, not a repair.
Platform notes
What you see is whatever this browser's Gamepad API exposes. Chrome and Edge usually provide the standard mapping, and dual-rumble, for DualSense, DualShock 4 and Xbox pads over USB or Bluetooth. Firefox often reads buttons and sticks but does not expose rumble. Safari on recent macOS and iOS reads many Xbox, PlayStation and MFi pads. An official Switch Pro Controller's ZL and ZR are digital, so those values jump between 0 and 1. Touchpads, gyros and DualSense adaptive triggers are not in the API this page can read. The page never reports a USB polling rate.
If the resting offset is high
Things people try next
This page cannot see why the offset is high. Recalibrating is a common first step: Windows has a game controller calibration tool, Steam has per-controller calibration, and the Switch has one under System Settings. Cleaning around the stick base with a little isopropyl alcohol or compressed air, then testing again, is another. If the offset is still high and the pad is under warranty or inside a return window, a screenshot of the reported numbers is a record you can show the seller. It is not a lab report. Stick modules can be replaced, and Hall-effect upgrades exist for many pads.
Related tools
Check a phone or tablet with the touch screen test, see whether your keyboard drops keys with the keyboard ghosting test, test buttons and scroll with the mouse tester, and time your reflexes with the F1 reaction test.
Frequently asked questions
What does this gamepad tester read?
It reads the Gamepad API: the pressed, touched and value fields of each button, and each axis the browser reports for connected pads. It does not read a USB packet rate, battery level, gyro, touchpad or adaptive triggers. Those are not in this API.
What does the drift number mean?
Drift here is the resting offset. After a 1 second pause the page averages each stick for 3 seconds while you are not touching it, then reports how far that average sits from centre. Under 0.05, 0.05 to 0.15, and above 0.15 are bands for that offset. The number is not a test of stick wear, and it cannot tell dust, calibration and a driver deadzone apart.
Why does nothing show until I press a button?
Browsers hide gamepads until a button press or a stick move. That is a privacy rule, not a dead controller. Connect it over USB or Bluetooth, click this page, then press a face button. A reload can also hide a pad that was already connected until you press something again.
Why are some buttons numbered instead of A, B, Cross or Circle?
Those names are used only when the browser reports the standard mapping and the controller id matches a PlayStation, Xbox, Nintendo, Logitech or 8BitDo layout. If the mapping is missing or not standard, the same index can be a different physical button, so the diagram shows indexes only. The raw table lists every index the pad sent.
How does rumble work here?
The page calls vibrationActuator.playEffect with the dual-rumble effect for about 700 ms. Weak maps to the high-frequency motor and strong maps to the low-frequency motor, which is what that API effect means, not a frequency the page measured. If the browser does not expose playEffect, the controls stay hidden. A refused or interrupted effect shows a short message.
Can the circularity percentage come out blank or infinite?
No. Error is the average distance from radius 1 among directions you reached, and coverage is how many of those direction bins got a sample. An empty sweep gives 0, not a divide-by-zero result. Samples that are not finite numbers are skipped. The figure describes the shape the browser reported. It does not measure wear, and a square or octagonal gate will not look like a circle.
Is the controller data uploaded?
No. Readings stay in this page. The deadzone slider is saved in localStorage on this browser so the ring comes back next time. Nothing is sent to a server. Leaving the page stops the polling loop and clears its timer and listeners.