CTRLCHK

Timestamp cadence

The update rate your browser can actually see.

We measure distinct Gamepad.timestamp deltas and refuse to call that USB polling rate. Competitors who print 1000 Hz in a tab are not measuring what they claim.

Move a stick or press buttons if timestamps are frozen at rest. The live panel shows observed Hz or an explicit “no timestamp” state.

Device

No controller detected

Waiting
Live controller input visualization

Connect a controller over USB or Bluetooth, then press any button to begin.

Standby

Live readout

Every axis and button, measured in real time.

Nothing untouched is treated as a failure. This is a viewer, not a verdict — run a health check when you want scored measurements.

LX+0.00 
LY+0.00 
RX+0.00 
RY+0.00 
L radial0.0% 
R radial0.0% 
L2N/AUnmapped
R2N/AUnmapped
Buttons observed0 / 0

Polling rate is a USB story. This is a browser story.

A high-end wired controller can interrupt the host a thousand times a second. Your browser does not get those interrupts. It gets a Gamepad object, refreshed when the user-agent feels like it, usually aligned with animation frames. Gamepad.timestamp is a millisecond clock of the last change the browser noticed. The reciprocal of the median delta between distinct timestamps is a browser-observed update rate. That is the only honest Hz figure a website can print.

CTRLCHK records those deltas while the pad is live. Eight or more advances are required before we publish Hz, so a single connect event cannot become “125 Hz.” Jitter is the 5–95 percentile spread of the same deltas. If timestamps never advance — a still DualSense on several browsers — we print that fact. Capture for drift and range keeps running, because samples are timestamped with the animation clock, not with the frozen Gamepad field. That distinction is also why the hands-off countdown no longer stalls when you set the pad down.

How to read the live label

Overview shows Hz in the status strip. Move a stick if you want more timestamp advances; a perfectly still pad may never tick. Demo mode (?demo=true) advances every frame because it synthesizes timestamps from performance.now(). Real hardware will not match demo Hz, and it should not.

If you came here to debug input delay in a cloud game, this number is a ceiling for what JavaScript saw, not a diagnosis of the stream. If you came here because a store listing said “1000 Hz polling” and a web tester “confirmed” it, treat that confirmation as marketing. For drift, circularity and snapback — measurements this API can support — use the guided gamepad tester.

FAQ

Questions people actually ask

Can a website measure 1000 Hz USB polling?

No. A tab sees Gamepad.timestamp at about display refresh, typically near 60 Hz, and only when the browser updates that field. Anyone printing 1000 Hz from JavaScript is not measuring the USB endpoint.

Why does Hz say “No timestamp” while the pad works?

Many browsers freeze Gamepad.timestamp when axes and buttons are unchanged. CTRLCHK still samples on the animation clock. We label the missing timestamp instead of reporting 0 Hz.

What jitter means here

The spread between the 5th and 95th percentile of timestamp deltas, in milliseconds. It is browser-scheduling jitter, not analog-stick jitter.

Should I buy a new cable if Hz looks low?

Not based on this number. Use the OS or a dedicated USB tool if you need wired poll-rate proof. Use this page to confirm the browser is seeing updates at all.