navigator.getGamepads · axes · buttons · live

Live gamepad tester

Connect any USB or Bluetooth controller and see axes, buttons, and pressure values update in real time. Runs entirely in your browser via the Gamepad API.

Gamepad Tester
Press any button to wake controller
Connected
0
gamepads
Buttons
0
total
Axes
0
total
Mapping
—
first pad
Standard mapping: left stick = axes 0/1, right stick = axes 2/3.
input · hardware

Plug in or pair a controller, then press any button (browser security wakes it).

Tested with Xbox, PlayStation DualShock/DualSense, Nintendo Pro Controller, and Stadia.

This view polls via requestAnimationFrame at the browser's display rate.

output · pads (0)

No gamepads detected

Quick Start

How to test a gamepad

The Gamepad API exposes navigator.getGamepads() polled per frame, plus connect/disconnect events.

  1. 01

    Connect

    Plug in USB or pair over Bluetooth.

    Inputs are treated as UTF-8 throughout the pipeline and validated client-side as you type — nothing dispatches until the value is well-formed.

    connectinpututf-8client-sidevalidated
    pad · textin · set
    USB / BT pair
    loaded · parsedclient-side
  2. 02

    Wake it

    Press any button — browsers hide pads until first input.

    Each toggle re-computes through a memoised hook, so flipping options never resets your input and the UI stays snappy on large inputs.

    wakeoptionslivememoisedtoggles
    wake · memoisedpress · live
    press any
    options set · memoisedlive
  3. 03

    Read axes

    Sticks report -1..+1 per axis at frame rate.

    Randomness — where used — comes from crypto.getRandomValues, never Math.random. Heavy work sits in useMemo.

    axescomputeinstantlocaldeterministic
    axes · instant0..3 · computed
    L 0,1 · R 2,3
    computed · instantinstant
  4. 04

    Watch buttons

    Each button shows pressed + analog value (triggers).

    Copy writes through navigator.clipboard and downloads use a Blob — zero network traffic. Same input plus same options always yield the same bytes.

    buttonscopydownloadzero-networkreproducible
    ok · copiedlive · copied
    b0..bN
    shipped · ready to shipsuccess
Pro tips

Pro tips for everyday utilities

Reach for crypto.getRandomValues

Cryptographically random for IDs, tokens, salts. Math.random is for animation and games, not security.

Sort IDs lexicographically

UUID v4 has no time ordering. Use ULID or UUID v7 if you need sorted IDs.

Mock data with seeds

Faker-style libraries can be seeded so tests are reproducible. Embed the seed in the fixture file.

Reference cards beat memory

Cheatsheets for Vim, Git, Docker, Linux signals are faster than man pages when you’re mid-flow.

Browser APIs vary

Touch events, gamepads, and clipboard differ across vendors. Feature-detect before use.

Persist in the right place

localStorage for user preferences, sessionStorage for transient state, IndexedDB for structured data.

Use Cases

When to test gamepads

Game dev, accessibility, hardware QA.

Web game dev

Verify mappings before wiring controls. Random values come from crypto.getRandomValues — cryptographically secure for tokens, salts, and session IDs. Math.random is deterministic enough for animations but predictable enough to be a security bug.

CSPRNG-backed

Stick calibration

See drift on used controllers. Pair with hashids, ULID, or UUID v7 when you need both random and sortable — useful for primary keys, public-facing IDs, and event log ordering without a sequence column.

reproducible

Trigger throw

Confirm analog triggers report full range. Output is deterministic given the same seed, so fixtures and tests stay reproducible across CI runs and contributor machines. Embed the seed in the fixture file for full replay.

snappy

Bluetooth pairing

Verify pairing without launching a game. Heavy work runs through useMemo so the UI stays snappy on large inputs. Same input + same options yields identical bytes — the kind of stability snapshot tests rely on.

feature-detected

Latency check

Eyeball lag between press and on-screen feedback. Storage tools persist to the right backend: localStorage for user preferences, sessionStorage for transient state, IndexedDB for structured data. Pick the right shelf and quota worries disappear.

deterministic

Accessibility

Try alternate controllers for adaptive setups. Browser feature detection: clipboard, fullscreen, gamepad, and Web Bluetooth APIs gracefully fall back when unavailable. No surprise white screens on Safari or older Firefox.

a11y
FAQ

Frequently asked questions

Press any button — browsers hide gamepads until the user interacts to prevent fingerprinting.
Standard maps face buttons, sticks, and triggers to known indices. Non-standard pads report a vendor-specific layout.
Rumble (force feedback) is a separate API and only works on supported pads in Chrome.
Sticks are polled, not eventful — we tick every frame for live values.
No. Everything runs locally in your browser.
Suggest a tool

Something missing?

Tell us what you need. We ship the top requests every two weeks.

Sent straight to the maintainers · no account needed
47 in queue·8 shipped this month
Request queued. Thanks!