CÓMO FUNCIONA
Cómo lee JoyCheck tu mando
JoyCheck es un probador de mandos basado en el navegador que lee tu mando a través de la W3C Gamepad API, sin instalación y sin enviar nada a un servidor. Diagrama de flujo de datos en vivo y ejemplos de código más abajo.

JoyCheck es un probador de mandos basado en el navegador que lee tu mando a través de la W3C Gamepad API, sin instalación y sin enviar nada a un servidor.
6 tipos de entrada · 4 secciones · 10 min de lectura
JoyCheck lee tu mando con la W3C Gamepad API[1], una interfaz nativa del navegador que expone cada botón, cada eje analógico y cada gatillo como valores numéricos actualizados 60 veces por segundo. El navegador se encarga del handshake por USB o Bluetooth; JoyCheck consulta navigator.getGamepads() en cada fotograma de animación y muestra el estado en vivo sin enviar datos a ningún servidor.
◆ VERIFICADO
La especificación de la W3C Gamepad API define los rangos analógicos normalizados de -1.0 a +1.0 y expone cada mando conectado a cualquier navegador moderno a través de navigator.getGamepads()[1]. JoyCheck lee exactamente los mismos datos que tu navegador expondría a cualquier otra aplicación web, sin instalador, controlador ni capa de telemetría de por medio.
Actualizado el 2026-05-27 por Taimoor Bamazai, fundador de Elites Algorithm Limited (una empresa tecnológica registrada en Dublín, Irlanda) y el ingeniero detrás de JoyCheck.
Puntos clave
- JoyCheck lee mandos a través de la W3C Gamepad API, la misma interfaz nativa del navegador que usa todo juego moderno.
- El navegador muestrea los mandos al ritmo de los fotogramas de animación: 60 Hz en pantallas estándar, de 120 a 144 Hz en las de alta frecuencia de refresco.
- La Gamepad API exige un gesto del usuario antes de exponer los mandos, por eso hace falta pulsar un botón para despertar la página.
- Entre el mando y la página no hay ningún instalador, controlador ni capa de telemetría; los datos nunca salen de tu equipo.
- El soporte de navegadores es uniforme en Chrome, Edge, Firefox, Brave y Vivaldi[4]; en la háptica, Safari solo cubre una parte.

El flujo de datos en vivo tiene tres propiedades que conviene nombrar:
- Nativo del navegador. W3C Gamepad API estándar. Sin binario nativo, sin instalación de controlador. Funciona en cualquier navegador Chromium moderno, en Firefox y en Safari 16+.
- Muestreo de 60 a 144 Hz. JoyCheck lee navigator.getGamepads() en cada fotograma de animación, al mismo ritmo con que el navegador repinta, ajustado a los Hz de tu pantalla.
- Cero datos enviados. Cada entrada se procesa en el proceso de tu navegador. Sin XHR, sin fetch, sin analítica en el widget. Verificable en DevTools.
¿Qué significa “leer” un mando de juego?
JoyCheck lee seis clases de entrada de tu mando, y cada una se corresponde con un campo concreto de la Gamepad API.
- Botones (
gamepad.buttons[]). Cada botón es un objeto GamepadButton que reporta su estado de pulsación y, donde se admite, un valor analógico. - Sticks analógicos (
gamepad.axes[0..3]). El array axes es un array plano de valores flotantes. Bajo el mapeo estándar de la W3C contiene las posiciones X/Y de los sticks izquierdo y derecho. - Gatillos (
gamepad.buttons[6,7].value). Los gatillos residen en el array buttons y, bajo el mapeo estándar, se tratan como botones con un valor analógico. - Touchpad (
gamepad.touchEvents[]). El DualShock 4 y el DualSense exponen las coordenadas del touchpad como una extensión de la Gamepad API. La resolución reportada del touchpad ronda los 1920×1080, y se registran hasta dos puntos de contacto simultáneos. - Giroscopio e IMU (
gamepad.imu, propuesto). DualSense, Joy-Con y Switch Pro exponen todos datos de IMU de seis ejes. - Vibración (
gamepad.vibrationActuator.playEffect()). La interfaz vibrationActuator de un objeto Gamepad expone un método playEffect() que recibe una duración y una intensidad para cada motor, en los mandos estándar que reportan actuadores hápticos.
¿Cómo funciona realmente la W3C Gamepad API?
La Gamepad API es una interfaz de navegador estándar de la W3C que expone los mandos de juego conectados a JavaScript. Viene incluida en todos los navegadores modernos desde Chrome 21 (2012), Firefox 29 (2014), Edge 12 (2015) y Safari 14.1 (2021); consulta Can I Use para ver la matriz de soporte actual.[2]
El navegador se encarga del handshake HID subyacente por USB o Bluetooth. Tu sistema operativo vincula el mando; el navegador lo ve a través de las capas de controlador del sistema (XInput en Windows, IOHIDDevice en macOS, evdev en Linux); la página llama a navigator.getGamepads() y recibe un array de instantánea de objetos Gamepad.
Cada objeto Gamepad expone un conjunto de campos:
- id: un identificador de cadena (p. ej. “DualSense Wireless Controller (STANDARD GAMEPAD Vendor: 054c Product: 0ce6)”)
- axes[]: un array de flotantes con las posiciones de los ejes analógicos (sticks, normalmente cuatro entradas: X/Y izquierdo + X/Y derecho)
- buttons[]: un array de objetos GamepadButton, cada uno con las propiedades pressed, value y touched
- timestamp: momento de la última actualización en milisegundos
- mapping: “standard” si el mando se corresponde con la disposición de gamepad estándar de la W3C; "" en caso contrario
- vibrationActuator: una interfaz de respuesta háptica (donde se admite)
La API exige un gesto del usuario (pulsar un botón) antes de exponer los mandos conectados. Esto es el requisito de gesto: una función de privacidad que impide que las páginas hagan fingerprinting de tu mando en segundo plano. JoyCheck muestra “Pulsa cualquier botón para empezar” hasta que se produce el gesto.
Por qué JoyCheck consulta en lugar de suscribirse a eventos
La Gamepad API es de solo consulta (poll-only) en el estándar. No existe un evento onbuttonpress al que puedas suscribirte: tu código consulta navigator.getGamepads() y obtiene una instantánea del estado actual. JoyCheck consulta mediante requestAnimationFrame[5], que dispara la retrollamada a la frecuencia de refresco de la pantalla (normalmente 60 Hz, hasta 240 Hz en pantallas de alta frecuencia).
Consultar al ritmo de la frecuencia de refresco es la cadencia correcta porque:
- El sistema operativo actualiza el estado del mando aproximadamente a ese ritmo (el HID por USB muestrea a 1 kHz; el navegador submuestrea)
- El renderizado ocurre a la frecuencia de refresco, así que cualquier consulta extra produciría fotogramas duplicados sin diferencia visual
- Mantiene el uso de CPU al mínimo: la retrollamada de consulta es una llamada de función por fotograma
Consultar más rápido (con setInterval o setTimeout) desperdicia CPU y produce instantáneas duplicadas. Consultar más despacio (p. ej. 30 Hz) se salta pulsaciones rápidas en pantallas de alta frecuencia. requestAnimationFrame coincide con la pantalla, que a su vez coincide con lo que realmente ves.
¿Por qué JoyCheck no envía datos y cómo puedo comprobarlo?
Lo decimos tres veces porque importa:
-
JoyCheck no transmite ningún dato del mando a ningún servidor, nunca.
-
La Gamepad API se ejecuta por completo dentro del proceso de tu navegador. El estado del mando nunca sale de la página.
-
Consulta el código fuente del widget: cada llamada a la API se resuelve en una retrollamada de requestAnimationFrame que solo actualiza nodos del DOM. No hay llamadas fetch(), ni XMLHttpRequest, ni accesos a WebSocket que transporten datos del mando.
Puedes comprobarlo tú mismo en menos de un minuto: abre JoyCheck en cualquier navegador, abre DevTools (F12), haz clic en la pestaña Red, limpia el registro y usa el widget durante 30 segundos. La pestaña Red permanece vacía en cuanto a peticiones de estado del mando. Explicación completa en la página de privacidad.
¿Por qué usar un probador de navegador en lugar de una aplicación de escritorio?
Tres razones:
Sin fricción de instalación. La Gamepad API ya es lo bastante fiable como para que pedir a los usuarios que descarguen y ejecuten un binario sea un peaje innecesario. Cargar una página es más rápido que un instalador; un navegador es más universal que una distribución .exe solo para Windows.
Multiplataforma y gratis. La misma página funciona en Windows, macOS, Linux y ChromeOS sin compilaciones por plataforma. Un probador de navegador se publica una sola vez.
Auditable en 30 segundos. La actividad de red y el almacenamiento de una página web se pueden inspeccionar con las DevTools del navegador, por cualquier usuario y en cualquier momento. Para la actividad de red de una aplicación de escritorio hacen falta tcpdump, Wireshark o lsof y permisos de root. La historia de la auditoría importa.
“A lo largo de años de trabajo de diagnóstico de hardware en periféricos de PC y mandos de juego, los probadores basados en navegador han detectado cerca de dos tercios de las averías que una utilidad de diagnóstico de escritorio nunca habría sacado a la luz. El navegador lee lo que el mando reporta físicamente, y eso es una capa de verdad distinta de la que expone cualquier controlador basado en instalador.”
Taimoor Bamazai, fundador, Elites Algorithm Limited
¿Cuáles son las limitaciones conocidas de JoyCheck?
Lista honesta de lo que JoyCheck no hace:
-
Sin acceso HID directo. Leer el descriptor HID por USB en bruto requeriría WebHID, una especificación de la W3C aparte con un soporte de navegadores menos uniforme (hoy solo Chrome y Edge).
-
Mandos anteriores a la Gamepad API. Los mandos solo con DirectInput de la época anterior a XInput no aparecen en el navegador. Necesitarían WebHID más una capa de traducción.
-
El soporte de vibración varía según el navegador. Firefox va por detrás de Chrome en vibrationActuator; Safari tiene soporte limitado. JoyCheck señala la limitación con claridad.
-
La presión de los gatillos en mandos Xbox depende de la capa de controlador. Algunas vinculaciones por Bluetooth reportan gatillos binarios (solo encendido/apagado, sin rango analógico). Una conexión por USB con cable suele solucionarlo.
Para rutas de diagnóstico específicas de cada plataforma más allá de lo que el navegador puede ver, el tutorial dedicado cubre patrones de fallo que requieren intervención en el lado del hardware.
Para tutoriales de diagnóstico específicos de cada mando que usan esta misma capa de lectura basada en navegador, la guía de emparejamiento del Switch Pro Controller, el tutorial de calibración del DualSense y la guía de calibración del mando de PS4 cubren peculiaridades de emparejamiento específicas de cada plataforma que la Gamepad API por sí sola no puede resolver.
Fuentes y referencias
-
Especificación de la W3C Gamepad API. El estándar de la W3C que define los rangos de valores normalizados de los sticks analógicos (-1.0 a +1.0), la interfaz de consulta y el requisito de gesto del usuario que todo navegador moderno implementa para los mandos conectados.
-
MDN Web Docs: Gamepad API. La referencia para desarrolladores de Mozilla que cubre la lectura de mandos nativa del navegador, la cadencia de consulta por fotograma de animación y la extensión Haptic Actuator[3] que se usa para el soporte de vibración.
-
Referencia de la Gamepad Haptic Actuator API (MDN). Referencia de MDN sobre la extensión Haptic Actuator, el soporte de los fabricantes de navegadores en los mandos DualSense, Xbox Series X|S y Switch Pro, y la cobertura parcial de Safari.
-
Matriz de soporte de la Gamepad API en caniuse.com. Desglose actual del soporte de navegadores en Chrome, Edge, Firefox, Brave, Vivaldi, Safari e iOS Safari, incluida la versión en la que la háptica pasó a estar disponible.
-
Guía de web.dev sobre la Gamepad API. La referencia de plataforma web de Google que cubre los eventos de conexión, los patrones de consulta y la integración recomendada con requestAnimationFrame que JoyCheck usa internamente.
Observaciones sobre la frecuencia de muestreo de JoyCheck (medidas en 2026-05)
Los navegadores limitan la lectura de la Gamepad API a la cadencia de requestAnimationFrame. En nuestro análisis medimos los mismos mandos en condiciones de pantalla idénticas. Todas las lecturas: sesión nueva de Chrome 120, conexión USB salvo que se indique lo contrario, ventana deslizante de 5 segundos.
| Mando | Muestreo nativo del hardware | Medido por JoyCheck (pantalla de 60 Hz) | Notas |
|---|---|---|---|
| PS5 DualSense (USB) | 250 Hz | 59, 60 Hz | Limitado por rAF |
| PS5 DualSense (Bluetooth) | 250 Hz | 59, 60 Hz | Limitado por rAF |
| Mando Xbox Series (USB) | 125 Hz | 59, 60 Hz | Limitado por rAF |
| 8BitDo Pro 2 (Bluetooth) | 125 Hz | 59, 60 Hz | Limitado por rAF |
| Switch Pro Controller (Bluetooth) | 200 Hz | 59, 60 Hz | Limitado por rAF |
| Logitech G29 (USB) | 100 Hz | 59, 60 Hz | Limitado por rAF |
Medido con el muestreador integrado en el navegador de JoyCheck. Las pantallas de 144 Hz elevan el límite de forma proporcional; las lecturas se normalizaron a una línea base de 60 Hz para comparar entre navegadores.
Preguntas frecuentes sobre cómo funciona JoyCheck
¿Qué es la Gamepad API?
La W3C Gamepad API es una interfaz nativa del navegador que permite a JavaScript leer mandos USB y Bluetooth conectados. Expone cada botón como un estado de pulsación 0 o 1, cada stick analógico como coordenadas X/Y de -1.0 a 1.0 y los gatillos como valores de presión analógica de 0.0 a 1.0. Disponible en Chrome, Edge, Firefox y Safari 14.1+.
¿Necesita JoyCheck permiso para leer mi mando?
No se requieren permisos a nivel de sistema, pero el navegador exige un gesto del usuario (cualquier pulsación de botón en el mando) antes de exponer su estado. Es una función de privacidad y de ahorro de energía de la especificación de la Gamepad API, no una limitación de JoyCheck.
¿Con qué frecuencia lee JoyCheck mi mando?
JoyCheck consulta navigator.getGamepads() en cada fotograma de animación mediante requestAnimationFrame. Eso coincide con la frecuencia de refresco de tu pantalla: 60 Hz en un monitor estándar, 120 o 144 Hz en una pantalla de alta frecuencia. El hardware puede muestrear más rápido, pero el navegador no puede exponerlo a JavaScript.
¿Por qué mi mando solo aparece después de pulsar un botón?
Según la especificación, la Gamepad API oculta los mandos conectados hasta que el usuario realiza una entrada. Esto evita el fingerprinting pasivo y reduce el uso de CPU en segundo plano. Pulsa cualquier botón para despertar la API; el mando pasa a ser visible para JoyCheck en un fotograma de animación.
¿Puede JoyCheck leer mi teclado y ratón?
Solo mediante la pestaña Teclado: las entradas de teclado pasan por la API estándar KeyboardEvent, no por la Gamepad API. Las entradas de ratón quedan fuera del alcance de JoyCheck.
¿Funciona esto en Chromebooks?
Sí. ChromeOS admite la Gamepad API en Chrome (y en cualquier navegador basado en Chromium instalado desde la Play Store).
¿Por qué no todos los mandos reportan vibración?
La extensión Gamepad Haptics depende del navegador y del mando. Chrome/Edge/Firefox la admiten en la mayoría de los mandos modernos (DualSense, Xbox Series X|S, Switch Pro). El soporte en Safari es parcial. Algunos mandos antiguos no reportan ningún actuador háptico.
SEGUIR LEYENDO
Sigue adelante
Preguntas frecuentes
Preguntas frecuentes sobre JoyCheck, seguridad, privacidad, mandos compatibles y resolución de problemas.
Privacidad en JoyCheck
Cero datos enviados. Verificable en las DevTools de tu navegador en cinco líneas.
Deriva de stick, diagnosticada en 30 segundos
Qué es realmente la deriva de stick, qué mandos derivan más y qué hacer al respecto.
Prueba tu mando en el navegador
Sin instalación, sin cuenta. Tus entradas nunca salen de tu dispositivo.