🍱 Lunchbox Hands

Gamepad Tester

Test controller buttons, sticks, triggers, and vibration

No controller detected yet

Connect a controller by USB or Bluetooth, then press any button — browsers hide gamepads from web pages until you press a button while the page is open.

Event log

Press a button or move a stick…

Check a controller before you blame the game: every button lights up with its analog value, each stick is plotted live inside its circle with x and y to three decimals, and a two-second drift check tells you whether a stick is really returning to centre. It recognises Xbox, PlayStation, and Switch Pro controllers and labels their buttons the way they are printed, shows the raw id, mapping, and USB vendor and product ids, and can fire a test rumble where the browser supports it — useful when buying a used pad or diagnosing a stick that creeps in-game.

Everything runs in your browser through the Gamepad API; nothing is uploaded. Testing the rest of your setup? The keyboard test checks every key and rollover, the screen test hunts for dead pixels, and the webcam test checks your camera before a stream.

Frequently asked questions

Why does the tester say no controller is detected?

Browsers deliberately hide gamepads from a web page until you press a button while the page is open — this stops sites from fingerprinting you by the hardware you have plugged in. Connect the controller by USB or Bluetooth, click into this page, and press any face button. If it still does not appear, check that the operating system sees the controller at all (Game Controllers on Windows, System Settings › Game Controllers on macOS), close apps like Steam that may take exclusive control, and try a different cable — many cheap USB cables are charge-only.

How do I test my controller for stick drift?

Put the controller down so nothing touches the sticks, then press "Check for drift". The tester samples every axis for two seconds and reports the largest deviation from centre it saw. Anything above 0.05 is flagged as possible drift (that threshold is our choice, not a manufacturer spec). Mild drift is common on worn Joy-Cons and older DualShock and Xbox pads, and a game’s dead zone often hides it — use the dead-zone slider to see how large a dead zone you would need to cancel it. Triggers that rest at −1 are recognised and not flagged.

What is a dead zone, and what value should I use?

A dead zone is a small radius around the stick’s centre where input is ignored, so a stick that does not return perfectly to zero does not make your character creep. This tester applies a radial, rescaled dead zone: inside the ring the stick reads 0, and outside it the remaining travel is stretched so full tilt still reaches 1. Most games default to somewhere between 0.05 and 0.15. Drag the slider until the dot at rest sits inside the dashed ring — that is the smallest dead zone that hides your stick’s wobble.

Why do my PlayStation or Switch buttons show generic labels?

Named labels (A/B/X/Y, ✕/○/□/△, or Nintendo’s swapped B/A/Y/X) only appear when the browser reports the controller with the "standard" mapping, which guarantees the button order. Some browser and controller combinations — Switch Pro and third-party pads on Firefox or Linux, for example — report a device-specific order instead, so the tester shows "Button 0", "Button 1" and so on rather than guessing. The layout is detected from the USB vendor id when the browser exposes it (Microsoft 045e, Sony 054c, Nintendo 057e) or from the controller’s name.

Why does the vibration test say not supported?

Rumble uses the Gamepad API’s vibrationActuator, which Chrome and Edge implement for most Xbox and PlayStation controllers. Safari on macOS has supported it since 16.4, but Firefox and Safari on iOS do not expose it, and some third-party or Bluetooth-connected pads do not report rumble motors to the browser even in Chrome. If the button is available but nothing happens, make sure the controller is charged and that no other app (such as Steam Input) is intercepting it.

Is anything sent to a server?

No. The tester reads your controller through the browser’s built-in Gamepad API and draws everything locally. Button presses, stick positions, the controller’s name and ids never leave your device, and nothing is stored after you close the tab. The only thing that pauses the tester is switching away from the tab — polling stops while it is hidden and resumes when you come back.

Get weekly dev tools and tips