- 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
Comentários do Hacker News
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
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
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
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”
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
Quero criar um passe para o Apple Wallet, mas a configuração da conta de desenvolvedor e os custos extras me desanimam
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