6 puntos por GN⁺ 2025-08-16 | 1 comentarios | Compartir por WhatsApp
  • Para resolver la lentitud de uso y lo engorroso del proceso de entrada de la app de PureGym, la optimicé personalmente con Apple Wallet
  • El código QR existente era una forma de acceso ineficiente: cada vez había que abrir la app y cargar la información, lo que tomaba unos 47 segundos
  • A través de varios procesos técnicos, como ingeniería inversa, uso de mitmproxy y el framework PassKit, implementé un pase de Wallet con renovación automática
  • En el proceso confirmé el funcionamiento interno de PureGym expuesto en la web, como fallas de seguridad del código PIN, la estructura de autenticación de la API y la información de ubicación de las sucursales
  • Al final logré una experiencia de acceso de 3 segundos, y dejé claro que fue solo un experimento personal y no es un servicio oficial

47 segundos: el inicio de la incomodidad

  • Un día de semana a las 11:15 a. m., me tomó 47 segundos abrir la app en la entrada de PureGym
  • La señal era débil, había que conectarse al Wi‑Fi, abrir la app y saltarse varias notificaciones push y ofertas especiales antes de que apareciera el QR
  • Tardaba mucho en mostrarse el código QR real, y eso te hacía sentir observado por otros miembros
  • Repetido 6 veces por semana, era una experiencia ineficiente que consumía 282 segundos cada semana
  • Comparada con experiencias sin fricción como Amazon Fresh, la UX de entrada de PureGym estaba muy atrasada

El misterio del PIN de 8 años

  • El autor ha usado el mismo código PIN de 8 dígitos durante 8 años
  • Ese PIN ni expira ni se cambia
  • En cambio, el código QR dentro de la app se reemplaza por un valor nuevo cada minuto
  • Existe una gran contradicción entre el nivel de seguridad real y la implementación efectiva
  • El método del PIN se mantiene durante un tiempo absurdamente largo, mientras que solo el código QR está protegido con rigor: un verdadero "show de seguridad"

Entendiendo PureGym con mitmproxy

  • Al principio intenté usar una captura del código QR dentro de Apple Wallet, pero no funcionó de inmediato
  • El código QR de PureGym se genera dinámicamente, expira aproximadamente en una semana, pero la app lo renueva cada minuto
  • Buscando repositorios relacionados con "PureGym" en GitHub, encontré la estructura de autenticación de la API
    • El PIN de 8 dígitos para iniciar sesión se usaba exactamente como la contraseña de la API
    • La información de autenticación básica codificada en Base64 también tenía poca seguridad
  • Para analizar el tráfico de la app, intercepté solicitudes con herramientas proxy como mitmproxy
    • La estructura JSON del código QR estaba compuesta por part1 (id fijo), part2 (timestamp) y part3 (salt para renovación)
    • La API incluso indicaba el momento de renovación y las condiciones de expiración

PassKit: el potencial de Apple Wallet

  • Los pases de Apple Wallet no son tarjetas estáticas, sino una especie de miniapp capaz de renovarse sola, enviar notificaciones push y reaccionar a la ubicación
  • Para implementar PassKit se necesitan una especificación JSON, recursos de imagen, firma con certificados y un servicio web para actualizaciones en tiempo real
  • Se requiere emitir un Pass Type ID y un certificado WWDR desde el portal de desarrolladores de Apple
  • La firma y la gestión de certificados son complejas, pero cuando funciona, la experiencia en el dispositivo real es muy fluida

Construcción del backend en Swift

  • Normalmente usaría Node.js, pero implementé directamente el servicio web de PassKit con Vapor basado en Swift
    • Cuando el pase necesitaba actualizarse, ofrecía actualización automática mediante push silencioso
    • Así logré una renovación del pase natural, sin que el usuario siquiera lo notara

Automatización de ubicaciones de PureGym en todo el país

  • Los pases de Apple Wallet pueden mostrarse automáticamente en ubicaciones específicas
  • El sitio oficial de PureGym no tenía coordenadas detalladas, pero pude obtener desde la API una lista con las coordenadas de todas las sucursales del país
  • Analicé todas las coordenadas y asigné a cada pase la sucursal más cercana
  • Desventaja: si el PureGym está dentro de un centro comercial, el pase puede aparecer incluso cuando solo vas de compras, lo que resulta en una pequeña molestia

Integración con Apple Watch

  • Los pases de Apple Wallet se sincronizan automáticamente con el Apple Watch sin trabajo adicional
  • Con dos clics en la muñeca, escanear y entrar, el proceso se redujo a 3 segundos
  • Se consiguió una reducción de tiempo de más del 93%

El cambio en cifras

  • Tiempo de entrada con la app original de PureGym: 47 segundos
  • Tiempo de entrada con el pase de Apple Wallet: 3 segundos
  • Tiempo promedio ahorrado por semana: 4.4 minutos (3.8 horas al año)
  • Personas alrededor me preguntaron 23 veces "¿existe una app así?", y a todas les expliqué que era algo no oficial
  • Aunque hubo solicitudes, no hay planes de distribuirlo por temas de derechos de autor y políticas del servicio

Bonus: integración con Home Assistant

  • A través del endpoint de ocupación interior de la API de PureGym, mostré el nivel actual de congestión del gimnasio en un dashboard de IoT
  • Eso permite decidir volver en horarios más tranquilos con base en datos, mejorando la eficiencia y la motivación para entrenar

Realidad y ética de la ingeniería

  • Empezó como una solución puramente personal a una molestia, pero era un área que dentro de PureGym no habían mejorado durante años
  • A veces, un prototipo creado fuera de la organización resuelve un problema más rápido que la hoja de ruta oficial
  • Aun así, oficialmente esto podría violar los términos de uso, y PureGym podría bloquearlo en cualquier momento
  • Nunca lo automaticé ni lo compartí; fue únicamente para experimentación personal, y seguí principios como el uso de caché por estabilidad

Próximos pasos y cierre

  • En el futuro podrían proponerse ideas de expansión, como "notificaciones push de vergüenza"
  • La utilidad práctica puede ser pequeña, pero me satisface haber optimizado 3.8 horas al año de "acciones innecesarias"
  • Si PureGym lo implementara oficialmente, podría mejorar la comodidad de muchos más usuarios
  • Queda como un caso de una "experiencia no oficial pero efectiva"

1 comentarios

 
GN⁺ 2025-08-16
Comentarios de Hacker News
  • Me parece un texto realmente divertido e inspirador; captura muy bien la esencia de un ingeniero y deja claro que el OP es un hacker de verdad.
    Cuando estuve 3 meses en EE. UU. me inscribí en PureGym y me dieron un PIN; después cancelé la membresía, pero más tarde Chrome me avisó que el PIN de PureGym se había filtrado.
    Dos años después volví a EE. UU. y me dieron el mismo PIN, y me pareció un problema de seguridad gravísimo.
    La app y el token de PureGym también eran interesantes, y además encontré una falla de seguridad en el sistema que activa las sillas de hidromasaje; aceptaba cualquier PIN.
    • Lo de que Chrome avisara sobre la filtración del PIN de PureGym probablemente fue un falso positivo; esto puede pasar cuando Chrome usa la API de HaveIBeenPwned.
      Por ejemplo, un PIN como 87623103 se convierte al hash 558B4C37F6E3FF9A5E1115C66CEF0703E3F2ADEE, y si lo buscas en el rango de hashes de HaveIBeenPwned, efectivamente aparece como filtrado varias veces.
  • Es uno de esos temas que hay que pensar aunque sea una vez: un teclado físico puesto al aire libre, cubierto por el clima británico, batidos de proteína y arrepentimiento, y hasta potencialmente transmitido en TikTok Live por el Ring Doorbell de alguna casa. Y aun así acepta sin problema mi PIN viejo; en cambio, un QR digital supuestamente necesita una rotación criptográfica digna de impresionar a la NSA.
  • Me encanta leer historias así. En vez de esperar a que la app funcione bien, simplemente me aprendo el PIN. Así puedo entrar todavía más rápido que con el método que propone el OP, y además es más práctico porque no necesito dispositivo ni servicio adicional.
  • Cuando vi el texto de “hay razones por las que no implementan Apple Wallet”, al ver las capturas de la app de PureGym da la impresión de que poco más que envuelve un sitio web móvil o usa algo como Flutter. Parece muy poco probable que tengan desarrolladores internos capaces de manejar hasta los detalles sutiles de las APIs de Apple.
    • Ese es el punto clave. El negocio principal de PureGym es conseguir la mayor cantidad posible de suscriptores y hacer difícil que se den de baja; desarrollar software no es su actividad principal. Con suerte, tienen a algún desarrollador web interno apenas manteniendo el sitio y la base de datos, y tercerizan el trabajo para que “se vea como una app”; con mala suerte, subcontratan todo lo relacionado con web y hasta cambiar una palabra del título cuesta extra.
    • Pero igual queda la duda de por qué no aprenden. Hay Google, Stack Overflow, LLM y muchas otras herramientas, y aun así no mejora. Supongo que es porque no hay absolutamente nadie pendiente de la UX, o porque el equipo backend se fue hace tiempo y lo que queda es mantenimiento con el mínimo personal y con ingenieros baratos.
    • Si agregaran Apple Wallet, también tendrían que dar soporte a Android Wallet, así que aumentaría el código a mantener. Aun así, por lo menos podrían hacer que al abrir la app siempre se muestre el código QR de inmediato.
    • Yo también tengo la app de PureGym en mi teléfono, y sí se siente como una app que simplemente envuelve el sitio web de PureGym.
  • Una verdad absoluta: el PIN de 8 dígitos de la puerta del gym también es la contraseña de la API, y la mayoría de los usuarios ni siquiera la configuró por su cuenta. Espero que al menos haya rate limiting para los intentos fallidos. Parece que con solo saber la dirección de correo ya tienes acceso a la API. También me pregunto si el alcance de los permisos que se pueden pedir está realmente bien restringido.
    • Soy el OP.
      Sobre si el acceso a la API es inmediato: sí, lo es. De hecho, usando la app y el sitio nunca me he topado con rate limiting, y parece bastante permisivo con los intentos fallidos.
      El scope que mencioné en el post es el mismo que usan la app oficial y los clientes no oficiales en GitHub.
      Es muy poco probable que existan scopes adicionales; también vale la pena revisar PureGym PHP Wrapper y PureGym Attendance Python.
  • He vivido muchísimas discusiones de roadmap de apps como la de PureGym en la industria de TI.
    Eso de “si construimos esta función, entonces nosotros tendremos que hacernos responsables de ella”.
    Y también el clásico chiste de “cierto, entonces lo metemos al roadmap de 2028”.
    • En las reuniones de mi área es exactamente igual: cuando se habla de roadmap y planeación, la pregunta clave es “¿esto ayuda a los ingresos o solo cuesta dinero?”.
      Ya hay demasiadas tareas pendientes y wishlist acumulada, así que casi nunca entran funciones nuevas.
      Creo que lo mejor que podría hacer PureGym ahora mismo sería darle a la persona que hizo esta app unas cuantas miles de libras y membresía gratis de por vida.
  • Me da curiosidad cuánto cuesta el certificado Pass Type ID que se emite en el Apple Developer Portal.
    Quiero crear un pase para Apple Wallet, pero me pesa el costo de configurar la cuenta de desarrollador y cualquier cargo adicional.
    • Hasta donde yo sé, viene incluido en la suscripción básica de desarrollador; eso sí, tienes que renovarla cada año para seguir manteniéndolo.
  • Me pregunto si no habría problemas de batería si llegaran notificaciones push cada minuto para recibir un código nuevo.
    • Por lo que dice el texto principal, el código se actualiza una vez por semana, así que supongo que una vez por semana sería el máximo.
    • Las notificaciones push tienen algo llamado modo en segundo plano, así que solo se procesan cuando el teléfono está listo.
      Si la batería está baja o está en modo ahorro de energía, ni siquiera se entregan, justamente para minimizar el consumo de batería.
      Las notificaciones más importantes sí requieren que se muestre un elemento de UI y llegan independientemente del estado de ahorro de energía.
  • Fue muy entretenido leerlo; está lleno de detalles técnicos.