6 Punkte von GN⁺ 2025-08-16 | 1 Kommentare | Auf WhatsApp teilen
  • Um die langsame Bedienung der PureGym-App und den umständlichen Einlassprozess zu beheben, wurde dieser privat für Apple Wallet optimiert
  • Der bisherige QR-Code ist ineffizient, weil man jedes Mal die App öffnen und die Informationen laden muss; der Eintritt dauert dabei etwa 47 Sekunden
  • Durch verschiedene technische Schritte wie Reverse Engineering, den Einsatz von mitmproxy und das PassKit-Framework wurde ein automatisch aktualisierbarer Wallet-Pass umgesetzt
  • Dabei wurden interne Abläufe von PureGym sichtbar, darunter Sicherheitslücken beim PIN-Code, die Struktur der API-Authentifizierung und Standortdaten der Filialen
  • Am Ende entstand eine Nutzererfahrung mit 3 Sekunden bis zum Einlass; es blieb jedoch ein persönliches Experiment und ist kein offizieller Service

47 Sekunden: der Anfang des Ärgers

  • An einem Werktag um 11:15 Uhr dauerte es am PureGym-Eingang 47 Sekunden, bis die App geöffnet war
  • Schwaches Signal, WLAN-Verbindung, App-Start, diverse Push-Benachrichtigungen und Sonderangebote mussten erst übersprungen werden, bevor der QR-Code erschien
  • Bis der eigentliche QR-Code sichtbar wurde, verging so viel Zeit, dass es vor anderen Mitgliedern unangenehm wurde
  • Bei 6 Wiederholungen pro Woche summiert sich diese ineffiziente Erfahrung auf 282 Sekunden wöchentlich
  • Verglichen mit berührungslosen Erlebnissen wie bei Amazon Fresh ist die Einlass-UX von PureGym deutlich rückständig

Das Rätsel um den 8 Jahre alten PIN

  • Der Autor verwendet seit 8 Jahren denselben 8-stelligen PIN-Code
  • Dieser PIN läuft weder ab noch wird er geändert
  • Der QR-Code in der App hingegen wird jede Minute durch einen neuen Wert ersetzt
  • Zwischen dem tatsächlichen Sicherheitsniveau und der realen Implementierung besteht also ein großer Widerspruch
  • Das PIN-Verfahren bleibt extrem lange unverändert, während nur der QR-Code streng geschützt wird – eine Art „Security Show“

PureGym mit mitmproxy verstehen

  • Zunächst wurde versucht, einen Screenshot des QR-Codes in Apple Wallet zu verwenden, was jedoch sofort scheiterte
  • Der QR-Code von PureGym wird dynamisch erzeugt, läuft ungefähr nach einer Woche ab, wird in der App aber jede Minute erneuert
  • Durch die Suche nach „PureGym“-Repos auf GitHub wurde die Struktur der API-Authentifizierung gefunden
    • Der 8-stellige PIN für den Login wird identisch als API-Passwort verwendet
    • Auch die Base64-kodierten Basis-Authentifizierungsdaten bieten nur geringe Sicherheit
  • Um den App-Traffic zu analysieren, wurden Anfragen mit Proxy-Tools wie mitmproxy abgefangen
    • Die JSON-Struktur des QR-Codes besteht aus part1 (feste id), part2 (Zeitstempel) und part3 (salt für die Erneuerung)
    • Die API gibt sogar den Zeitpunkt der Erneuerung und die Ablauflogik vor

PassKit: das Potenzial von Apple Wallet

  • Apple-Wallet-Pässe sind keine statischen Karten, sondern eher Mini-Apps mit eigener Aktualisierung, Push-Benachrichtigungen und ortsabhängigem Verhalten
  • Für eine PassKit-Implementierung werden eine JSON-Spezifikation, Bildressourcen, Zertifikatssignaturen und ein Webservice für Echtzeit-Aktualisierungen benötigt
  • Im Apple-Developer-Portal sind die Ausstellung einer Pass Type ID und eines WWDR-Zertifikats erforderlich
  • Die Zertifikatssignierung und -verwaltung ist kompliziert, ermöglicht bei Erfolg aber eine nahtlose Erfahrung auf echten Geräten

Swift-Backend aufbauen

  • Normalerweise würde dafür Node.js verwendet, hier wurde der PassKit-Webservice jedoch direkt mit Swift und Vapor umgesetzt
    • Wenn ein Pass aktualisiert werden muss, erfolgt das Update automatisch per stillem Push
    • Dadurch wird eine natürliche Pass-Aktualisierung erreicht, die der Nutzer gar nicht bemerkt

Automatisierung der PureGym-Standorte im ganzen Land

  • Apple-Wallet-Pässe können an bestimmten Orten automatisch eingeblendet werden
  • Auf der offiziellen PureGym-Website fehlen detaillierte Koordinaten, über die API ließ sich jedoch eine Liste der Koordinaten aller Filialen im Land abrufen
  • Alle Standortkoordinaten wurden geparst und jedem Pass die nächstgelegene Filiale zugewiesen
  • Nachteil: Befindet sich ein PureGym in einem Einkaufszentrum, erscheint der Pass gelegentlich schon beim bloßen Shopping

Apple-Watch-Integration

  • Apple-Wallet-Pässe werden ohne zusätzliche Arbeit automatisch mit der Apple Watch synchronisiert
  • Zweimal am Handgelenk klicken, scannen, eintreten: Das dauert nur noch 3 Sekunden
  • Damit wird eine Zeitersparnis von mehr als 93 % erreicht

Die Veränderung in Zahlen

  • Bisherige Einlasszeit mit der PureGym-App: 47 Sekunden
  • Einlasszeit mit dem Apple-Wallet-Pass: 3 Sekunden
  • Durchschnittlich gesparte Zeit pro Woche: 4,4 Minuten (3,8 Stunden pro Jahr)
  • Andere Mitglieder fragten 23-mal, ob es so eine App gebe; jedes Mal wurde erklärt, dass sie inoffiziell ist
  • Es gibt Anfragen, aber aus Urheberrechts- und Servicegründen ist keine Veröffentlichung geplant

Bonus: Home-Assistant-Integration

  • Über den Endpoint für die Anzahl der Personen im Innenbereich der PureGym-API wird die aktuelle Auslastung des Fitnessstudios in einem IoT-Dashboard angezeigt
  • So lässt sich datenbasiert entscheiden, wann man zu ruhigeren Zeiten zurückkehrt, was Effizienz und Motivation beim Training steigert

Technische Realität und Ethik

  • Ausgangspunkt war reiner persönlicher Frust, doch intern bei PureGym blieb dieser Bereich über Jahre unbeachtet
  • Ein außerhalb der Organisation entstandener Prototyp kann Probleme manchmal schneller lösen als die offizielle Roadmap
  • Offiziell könnte dies jedoch gegen die Nutzungsbedingungen verstoßen, und PureGym könnte es jederzeit blockieren
  • Es wurde niemals automatisiert oder geteilt; das Ganze blieb ein rein persönliches Experiment, wobei aus Stabilitätsgründen Prinzipien wie Caching eingehalten wurden

Nächste Schritte und Fazit

  • Künftig wären Erweiterungsideen wie „Scham-Push-Benachrichtigungen“ denkbar
  • Der praktische Nutzen mag klein sein, doch die Optimierung von jährlich 3,8 Stunden „unnötiger Bewegungen“ wird als befriedigend empfunden
  • Würde PureGym das offiziell umsetzen, könnte es den Komfort für deutlich mehr Nutzer verbessern
  • Der Fall bleibt als Beispiel für eine „inoffizielle, aber wirksame Erfahrung“ bestehen

1 Kommentare

 
GN⁺ 2025-08-16
Hacker-News-Kommentare
  • Ich finde, das ist ein wirklich unterhaltsamer und inspirierender Beitrag, der das Wesen eines Engineers gut einfängt; man merkt, dass OP ein echter Hacker ist.
    Als ich drei Monate in den USA war, habe ich mich bei PureGym angemeldet und einen PIN bekommen, später dann die Mitgliedschaft gekündigt. Danach hat Chrome mich darauf hingewiesen, dass mein PureGym-PIN geleakt wurde.
    Zwei Jahre später war ich wieder in den USA und bekam denselben PIN erneut, was ich für ein massives Sicherheitsproblem halte.
    Auch die PureGym-App und das Token waren interessant; ich habe außerdem eine Sicherheitslücke im Aktivierungssystem der Hydro-Massage-Stühle gefunden, das offenbar jeden beliebigen PIN akzeptierte.
    • Dass Chrome einen Leak des PureGym-PIN gemeldet hat, war vermutlich ein False Positive; so etwas kann passieren, wenn Chrome die HaveIBeenPwned-API verwendet.
      Zum Beispiel wird ein PIN wie 87623103 in den Hash 558B4C37F6E3FF9A5E1115C66CEF0703E3F2ADEE umgewandelt, und wenn man im HaveIBeenPwned-Hashbereich sucht, sieht man, dass er tatsächlich mehrfach in Leaks aufgetaucht ist.
  • Das ist eines dieser Probleme, über die man nur kurz nachdenken muss: ein physisches Keypad im Freien, bedeckt von britischem Wetter, Proteinshakes und Reue, womöglich auch noch per Ring-Türklingel irgendeines Hauses live auf TikTok übertragen. Und trotzdem akzeptiert es meinen alten PIN anstandslos, während ein digitaler QR-Code offenbar eine Kryptorotation braucht, die selbst die NSA beeindrucken würde.
  • Ich lese solche Geschichten mit großer Freude. Statt darauf zu warten, dass die App richtig funktioniert, merke ich mir den PIN einfach selbst. So komme ich sogar noch schneller rein als mit der von OP vorgeschlagenen Methode, und es ist bequemer, weil weder Gerät noch separater Dienst nötig sind.
  • Als ich den Satz las, dass es „Gründe gibt, warum sie Apple Wallet nicht implementieren“, hatte ich beim Blick auf Screenshots der PureGym-App den Eindruck, dass es im Grunde nur eine dünne Hülle um eine mobile Website ist oder mit etwas wie Flutter gebaut wurde. Die Wahrscheinlichkeit, dass dort intern Entwickler sitzen, die auch die Feinheiten der Apple-APIs beherrschen, wirkt sehr gering.
    • Genau das ist der Punkt. Das Kerngeschäft von PureGym ist, möglichst viele zahlende Nutzer in den Service zu bekommen und den Austritt schwierig zu machen; Entwicklung ist nicht ihr Kerngeschäft. Im besten Fall haben sie intern einen Webentwickler, der Website und Datenbank gerade so am Laufen hält, und lagern den Rest mit der Vorgabe aus, es möge sich bitte wie eine App anfühlen. Im schlechtesten Fall haben sie alles an eine Agentur ausgelagert und müssen für jede Änderung, selbst für einen einzelnen Buchstaben im Titel, extra zahlen.
    • Ich frage mich allerdings, warum sie daraus nicht lernen. Mit Google, Stack Overflow und LLMs als Werkzeugen gibt es trotzdem kaum Verbesserungen. Vermutlich kümmert sich einfach niemand um UX, oder das ursprüngliche Backend-Team ist längst weg und übrig geblieben ist nur ein Minimalteam günstiger Engineers, das alles am Leben hält.
    • Wenn man Apple Wallet hinzufügt, müsste man auch Android Wallet unterstützen, wodurch noch mehr Code gepflegt werden müsste. Trotzdem sollte man es mindestens hinbekommen, beim Öffnen der App immer sofort den QR-Code anzuzeigen.
    • Ich habe die PureGym-App ebenfalls auf meinem Handy, und sie fühlt sich tatsächlich einfach wie eine App-Hülle um die PureGym-Website an.
  • Absolut goldrichtig gesagt: Ein 8-stelliger PIN für die Studiotür ist gleichzeitig das API-Passwort, und die meisten Nutzer haben ihn nicht einmal selbst gewählt. Hoffentlich gibt es wenigstens Rate Limiting für Fehlversuche. Es wirkt so, als bekäme man mit nichts weiter als einer E-Mail-Adresse direkt API-Zugriff. Ich frage mich außerdem, ob der anforderbare Scope ordentlich eingeschränkt ist.
    • OP hier.
      Auf die Frage, ob API-Zugriff tatsächlich direkt möglich ist: ja, und ich bin weder in der App noch auf der Website jemals an Rate Limits gestoßen; das System ist bei Fehlversuchen ziemlich großzügig.
      Der im Beitrag gezeigte Scope ist derselbe, den auch die offizielle App und inoffizielle Clients auf GitHub verwenden.
      Dass es zusätzliche Scopes gibt, ist sehr unwahrscheinlich; siehe auch PureGym PHP Wrapper und PureGym Attendance Python.
  • Solche Diskussionen über die App-Roadmap von PureGym habe ich in der IT-Branche oft erlebt.
    So nach dem Motto: „Wenn wir dieses Feature bauen, müssen wir danach selbst die Verantwortung dafür tragen.“
    Und dann der übliche Witz: „Stimmt, dann packen wir es auf die Roadmap für 2028.“
    • In den Meetings meiner Abteilung ist es genauso. Wenn es um Roadmaps und Planung geht, lautet die Kernfrage immer: „Hilft uns das beim Umsatz, oder kostet es nur Geld?“
      Die eigentliche To-do-Liste und Wunschliste sind ohnehin schon lang, daher kommen neue Features kaum durch.
      Das Beste, was PureGym jetzt tun könnte, wäre meiner Meinung nach, dem Entwickler dieser App ein paar tausend Pfund und eine lebenslange Gratis-Mitgliedschaft zu geben.
  • Ich frage mich, was ein vom Apple Developer Portal ausgestelltes Pass Type ID-Zertifikat kostet.
    Ich würde gern Apple-Wallet-Pässe bauen, aber die Einrichtung des Entwicklerkontos und mögliche Zusatzkosten schrecken mich ab.
    • Soweit ich weiß, ist das im normalen Entwicklerabo enthalten; man muss das Abo allerdings jedes Jahr verlängern, damit es aktiv bleibt.
  • Ich frage mich, ob Push-Benachrichtigungen, damit man jede Minute einen neuen Code bekommt, nicht ein Batterieproblem wären.
    • Wenn man den Artikel liest, scheint der Code einmal pro Woche erneuert zu werden, also dürfte auch einmal pro Woche das Maximum sein.
    • Für Push-Benachrichtigungen gibt es einen Background-Modus, sodass sie nur verarbeitet werden, wenn das Telefon dazu bereit ist.
      Bei niedrigem Akkustand oder im Stromsparmodus werden sie gar nicht zugestellt; das ist ausdrücklich so gebaut, um den Batterieverbrauch zu minimieren.
      Wichtigere Benachrichtigungen müssen ein UI-Element anzeigen und kommen unabhängig vom Energiesparzustand an.
  • Das war ein unterhaltsamer Artikel voller technischer Details, den ich gern gelesen habe.