6 pontos por GN⁺ 2025-08-16 | 1 comentários | Compartilhar no WhatsApp
  • Para resolver a lentidão do app da PureGym e a inconveniência do processo complexo de entrada, foi feita uma otimização pessoal com o Apple Wallet
  • O QR code existente exige abrir o app e carregar as informações toda vez, um método de entrada ineficiente que leva cerca de 47 segundos
  • Por meio de vários processos técnicos, como engenharia reversa, uso do mitmproxy e do framework PassKit, foi implementado um passe do Wallet com renovação automática
  • Nesse processo, foram confirmados na web detalhes do funcionamento interno da PureGym, como falhas de segurança no código PIN, a estrutura de autenticação da API e informações de localização das unidades
  • No fim, foi criada uma experiência de uso que permite entrar em 3 segundos, deixando claro que se trata apenas de um experimento pessoal e não de um serviço oficial

47 segundos: o começo do incômodo

  • Em um dia útil, às 11:15 da manhã, levou 47 segundos para abrir o app na entrada da PureGym
  • O sinal era fraco, foi preciso conectar ao Wi‑Fi, abrir o app e passar por várias notificações push, ofertas especiais e outras telas até o QR code aparecer
  • O QR code demorava muito para surgir, gerando até constrangimento diante dos outros membros
  • Repetindo isso 6 vezes por semana, eram desperdiçados 282 segundos por semana em uma experiência ineficiente
  • Em comparação com experiências sem atrito como a da Amazon Fresh, a UX de entrada da PureGym parecia muito defasada

O mistério do PIN de 8 anos

  • O autor usa o mesmo PIN de 8 dígitos há 8 anos
  • Esse PIN não expira nem é alterado
  • Já o QR code no app é trocado por um novo valor a cada minuto
  • Existe uma grande contradição entre o nível real de segurança e a implementação na prática
  • O método do PIN permanece por tempo excessivamente longo, enquanto apenas o QR code é rigidamente protegido, em um verdadeiro "teatro de segurança"

Entendendo a PureGym com mitmproxy

  • A ideia inicial era colocar um screenshot do QR code no Apple Wallet, mas isso não funcionou de imediato
  • O QR code da PureGym é gerado dinamicamente, expira em cerca de 1 semana, mas no app é renovado a cada 1 minuto
  • Ao buscar no GitHub por repositórios relacionados a "PureGym", foi descoberta a estrutura de autenticação da API
    • O PIN de 8 dígitos usado no login também era usado como senha da API
    • As credenciais de autenticação básica codificadas em Base64 também ofereciam pouca segurança
  • Para analisar o tráfego do app, foram interceptadas requisições com ferramentas de proxy como o mitmproxy
    • A estrutura JSON do QR code era composta por part1 (id fixo), part2 (timestamp) e part3 (salt para renovação)
    • A própria API informava inclusive o momento de renovação e as condições de expiração

PassKit: o potencial do Apple Wallet

  • Um passe do Apple Wallet não é apenas um cartão estático, mas uma estrutura de miniapp capaz de se atualizar sozinha, receber notificações push e reagir à localização
  • A implementação com PassKit exige especificação em JSON, recursos de imagem, assinatura com certificado e um web service para atualização em tempo real
  • No portal de desenvolvedores da Apple, é necessário emitir um Pass Type ID e um certificado WWDR
  • A assinatura e o gerenciamento de certificados são trabalhosos, mas, quando funcionam, proporcionam uma experiência fluida no dispositivo real

Construindo um backend em Swift

  • Embora o comum seja usar Node.js, o autor implementou diretamente o web service do PassKit com Vapor, baseado em Swift
    • Quando o passe precisa ser atualizado, uma push silenciosa fornece a atualização automática
    • Isso permite uma renovação natural do passe, sem que o usuário perceba

Automação das localizações da PureGym no país inteiro

  • Um passe do Apple Wallet pode ser exibido automaticamente em locais especificados
  • O site oficial da PureGym não traz coordenadas detalhadas, mas pela API foi possível obter a lista de coordenadas de todas as unidades do país
  • Todas as coordenadas das unidades foram parseadas para definir, em cada passe, a academia mais próxima
  • Desvantagem: quando a PureGym fica dentro de um shopping, o passe pode aparecer mesmo em uma simples ida às compras, causando um pequeno incômodo

Integração com Apple Watch

  • O passe do Apple Wallet é sincronizado automaticamente com o Apple Watch sem trabalho extra
  • Com dois cliques no pulso, escaneamento e entrada, o tempo caiu drasticamente para 3 segundos
  • Foi alcançada uma redução de mais de 93% no tempo

A mudança em números

  • Tempo anterior de entrada com o app da PureGym: 47 segundos
  • Tempo de entrada com o passe do Apple Wallet: 3 segundos
  • Tempo médio economizado por semana: 4,4 minutos (3,8 horas por ano)
  • Pessoas ao redor perguntaram 23 vezes "esse app existe?", e sempre foi explicado que era algo não oficial
  • Apesar dos pedidos, não há plano de distribuição por questões de direitos autorais e políticas de serviço

Bônus: integração com Home Assistant

  • Por meio do endpoint de ocupação interna da API da PureGym, a lotação atual da academia é exibida em um dashboard de IoT
  • Com base nos dados, é possível decidir voltar em horários mais vazios, melhorando a eficiência e a motivação nos treinos

Realidade da engenharia e ética

  • Embora tenha começado como uma solução para um incômodo pessoal, era uma área que a PureGym não havia melhorado por anos internamente
  • Um protótipo criado fora da organização às vezes resolve o problema mais rápido que o roadmap oficial
  • Oficialmente, isso pode violar os termos de uso, e a PureGym pode bloquear a qualquer momento
  • Não houve qualquer automação ou compartilhamento; foi usado apenas como experimento pessoal, respeitando princípios como uso de cache para manter a estabilidade

Próximos passos e conclusão

  • No futuro, seria possível propor ideias de expansão, como uma "notificação push da vergonha"
  • A utilidade prática pode ser pequena, mas há satisfação em ter otimizado 3,8 horas anuais de "ações desnecessárias"
  • Se a PureGym implementasse isso oficialmente, poderia oferecer mais conveniência a muitos usuários
  • Fica registrado como um caso de criação de uma "experiência não oficial, mas eficaz"

1 comentários

 
GN⁺ 2025-08-16
Comentários do Hacker News
  • Acho que este é um texto realmente divertido e inspirador, captura muito bem a essência da engenharia, e deixa claro que o OP é um hacker de verdade
    Quando fiquei nos EUA por 3 meses, me inscrevi na PureGym e recebi um PIN, depois cancelei a assinatura, mas mais tarde o Chrome me avisou que meu PIN da PureGym tinha vazado
    Dois anos depois voltei aos EUA e recebi o mesmo PIN, e achei isso um problema de segurança gravíssimo
    O app e os tokens da PureGym também eram interessantes, e eu ainda encontrei uma falha de segurança no sistema que ativa as cadeiras de hidromassagem, já que aceitava qualquer PIN
    • O aviso do Chrome sobre o vazamento do PIN da PureGym provavelmente foi um falso positivo, isso pode acontecer quando o Chrome usa a API do HaveIBeenPwned
      Por exemplo, um PIN como 87623103 vira o hash 558B4C37F6E3FF9A5E1115C66CEF0703E3F2ADEE, e ao pesquisar no intervalo de hashes do HaveIBeenPwned dá para ver que ele de fato já apareceu em vazamentos várias vezes
  • É o tipo de coisa que basta pensar uma vez: um teclado físico deixado do lado de fora fica coberto pelo clima britânico, shakes de proteína e arrependimento, e ainda pode até acabar sendo transmitido ao vivo no TikTok por alguma Ring doorbell de uma casa qualquer. Mesmo assim, ele aceita meu PIN antigo sem problema, enquanto um QR code digital aparentemente precisa de uma rotação criptográfica que faria a NSA aplaudir
  • Eu adoro ler histórias assim, em vez de esperar o app funcionar direito, eu simplesmente decoro o PIN. Então consigo entrar ainda mais rápido do que pelo método sugerido pelo OP, e é até mais prático porque não preciso de dispositivo nem de serviço extra
  • Quando vi o texto dizendo “há um motivo para não implementarem Apple Wallet”, pela captura de tela do app da PureGym, parece basicamente um site mobile com uma camada bem fina por cima, ou então algo feito com Flutter. Parece muito improvável que eles tenham um desenvolvedor interno capaz de lidar até com as partes mais sutis das APIs da Apple
    • Esse é o ponto central, o negócio principal da PureGym é conseguir o máximo possível de assinantes e dificultar o cancelamento, não desenvolvimento. Com sorte, eles têm um desenvolvedor web interno que mal consegue manter o site e o banco de dados funcionando, e terceirizam o resto pedindo “façam isso parecer um app”; com azar, todo o trabalho web foi terceirizado e até para mudar uma letra no título precisam pagar extra
    • Mesmo assim, fico pensando por que eles não conseguem aprender, com tantas ferramentas como Google, Stack Overflow e LLM. Acho que provavelmente ou não existe ninguém nem um pouco preocupado com UX, ou a equipe de backend foi embora há muito tempo e o que sobrou foi manutenção com o menor número possível de engenheiros baratos
    • Se fossem adicionar Apple Wallet, também precisariam dar suporte ao Android Wallet, então isso aumentaria o código a ser mantido. Ainda assim, pelo menos daria para fazer o app sempre mostrar o QR code assim que abrir
    • Eu também tenho o app da PureGym no meu celular, e realmente parece só um app que empacota o site da PureGym
  • Isso é ouro puro: o PIN de 8 dígitos da porta da academia também é a senha da API, e a maioria dos usuários nem escolheu esse PIN. Só espero que exista rate limiting para tentativas falhas. Parece que basta saber o endereço de e-mail para conseguir acesso à API na hora. Também fico curioso se o escopo das permissões que dá para pedir é bem restrito
    • OP aqui
      Sobre a pergunta se o acesso à API é realmente imediato: sim, é isso mesmo, e usando o app e o site eu nunca esbarrei em rate limiting, eles são bem generosos com tentativas falhas
      O scope mostrado no post é o mesmo usado pelo app oficial e pelos clientes não oficiais no GitHub
      A chance de existirem scopes adicionais é muito baixa; vale olhar também PureGym PHP Wrapper e PureGym Attendance Python
  • Já participei muito de discussões sobre roadmap de apps da PureGym no setor de TI
    Algo como: “se a gente fizer essa funcionalidade, vamos ter que assumir a responsabilidade por ela”
    E a piada recorrente é: “faz sentido, então vamos colocar isso no roadmap de 2028”
    • As reuniões do meu departamento são iguais, quando o assunto é roadmap e planejamento, o ponto principal é “isso ajuda nossa receita ou só gera custo?”
      Já existe trabalho demais e wishlist demais, então quase nunca entra funcionalidade nova
      Acho que a melhor coisa que a PureGym poderia fazer agora seria dar algumas milhares de libras e uma assinatura vitalícia grátis para o desenvolvedor que fez isso
  • Fiquei curioso sobre o custo do certificado Pass Type ID emitido pelo Apple Developer Portal
    Quero criar um passe para o Apple Wallet, mas a configuração da conta de desenvolvedor e os custos extras me desanimam
    • Pelo que eu sei, isso já está incluído na assinatura básica de desenvolvedor, mas você precisa renovar a assinatura todo ano para continuar mantendo isso
  • Se chegasse uma notificação push a cada minuto para receber um código novo, isso não seria um problema de bateria?
    • Pelo texto principal, a atualização do código acontece uma vez por semana, então imagino que uma vez por semana seja o máximo
    • Notificações push têm algo chamado modo em segundo plano, então só são processadas quando o telefone está pronto
      Em caso de bateria baixa ou modo de economia de energia, elas nem são entregues, justamente para minimizar o consumo de bateria
      Notificações mais importantes precisam mostrar elementos de UI obrigatoriamente e chegam independentemente dessas condições
  • Foi uma leitura divertida, cheia de detalhes técnicos