Einige werden es schon gesehen haben:
Seit Juli existiert dieser Blogbeitrag, doch dieser war bislang nicht mit einem einzigen Wort gefüllt und wurde einfach als leerer Korpus auf der Startseite des Blogs angezeigt. Hintergrund, dass ich getreu der 80-20-Regel das Projekt „YourStats“ nach den ersten Experimenten mit Swift(-UI) und Statistiken begann, einen kleinen Testflight-Kreis von Freund:innen aufbaute und für knapp vier Wochen fast täglich die App zu 80% fertig stellte. Dann folgte ein stressiger August und ehe ich mich versah, war Ende November und das Projekt stand fast fertig, mit dem Blogbeitrag angelegt und den nächsten App-Idden schon im Hinterkopf, immer noch am Einstauben auf meinem Systemspeicher.

Das Logo von YourStats

Anfang Dezember nahm ich mir dann eine Woche, um die fehlenden Features hinzuzufügen, knapp zwanzig Bugs zu beheben und das Projekt ENDLICH im AppStore einzureichen. Nach der Woche war die Submission im Appstore auch bereit, so wie es das Naturgesetz will, wurde die erste Iteration der App-Submission natürlich mit vollkommen Wilden Gründen abgelehnt. Nachdem ich eine if-condition und einen Wording-String änderte, ging die zweite Iteration jedoch durch und so wurde am 08.12. meine App „YourStats – Health Analytics“ im App Store veröffentlicht. Prompt reichte ich den Release-Patch ein, welcher am 10.12. im App Store verfügbar wurde und dafür für mich den offiziellen App-Start markierte.
Dieser Blogbeitrag ist ein kleiner Überblick über die App, was ich beim Entwickeln gelernt habe mit einigen Hintergrundinfos und was als nächstes folgt im App-Bereich.

Prolog

YourStats wurde aus der Not geboren, dass ich für meine Arbeit bei Stanford Biodesign Digital Health im Juli mich mit den Dimensionen von HealthKit Records beschäftigte. HealthKit ist das zentrale Framework von Apple zur Speicherung von Gesundheitsdaten. Nativ speichern in dieses die Apple Watch und das iPhone ein, jedoch speichern auch andere Fitness-Tracker (Garmin) und sogar smarte Wagen in diesen zentralen Speicherort; über die Jahre finden sich dort viele, viele Datensätze zu allen Daten von „Schritte in Zeitraum“ bis zu „Händewaschaktivität“ und „Lautstärkebelastung“. Wie viele genau das wären, wollte ich im Juli nun herausfinden und fand dafür keine einfache Lösung. HealthKit kann tatsächlich einen gesamt-export aller verfügbaren Daten machen, das resultiert jedoch in einer so großen XML-Datei (bei mir knapp vier Gigabyte) das auch handelsübliche Zähl-Tools nicht damit umgehen konnten. Und bevor ich nun ein Skript schrieb um das Problem zu lösen, war mir viel lieber, einfach on-device die Daten zu zählen. Und so begann die App-Entwicklung von Cardiolytics (so war der Arbeitstitel), und schon am ersten Abend konnte ich herausfinden, dass ich in meiner HealthKit-Umgebung 2957 Workouts gespeichert hatte mit insgesamt 6.496.441 einzelnen Health-Einträgen.

Dass die Entwicklung so schnell ging, auch dank dem Modul-Ökosystem Stanford Spezi (welches in der Arbeitsgruppe, in der ich aktuell forsche, entwickelt wird) und den guten Tools in der Swift-Welt, motivierte mich, weitere Features mir tagsüber zu überlegen und Ideen abends nach der Arbeit umzusetzen.

Der Avery Recreation Pool, der Ort, wo fast alle Features von YourStats entstanden sind.

Sicherlich eine der lebendigsten Erinnerungen an diesen Sommer ist es, in der Mittagspause vom Clark-Centre auf dem Stanford-Campus im Arrillaga Center for Sports and Recreation für eine Stunde Bahn für Bahn zu schwimmen und dabei mir zu überlegen, was die App noch alles machen könnte. Schnell kam Schlaf als Metrik hinzu, dann ein Share-Feature, dann HealthKit-Metaanalysen, und und und…

Die App

Long story short: YourStats ist eine App, die Gesundheitsdaten aus HealthKit ausliest und in eigenen, neuen Funktionen analysiert: „Wie viele Schritte bin ich dieses Jahr gegangen“? „Was war mein schnellstes Workout“? „Wie viele Stunden habe ich diese Woche geschlafen?“ All diese Fragen kann YourStats beantworten. Dabei werden sowohl für zusammenzählende Statistiken (z.B. Radkilometer diesen Monat) als auch für Höchstwerte (schnellstes Workout) und für gesamterunngenschaften Daten ausgewertet. 

Die App hat drei unterschiedliche Kategorien: Zeitabhängige Statistiken (Analytics), Höchstwerte (High Scores) und Auszeichungen (Achievements). Dazu gibt es eine Einstellungsseite, bei der z.B. die Einheit gewechselt werden kann. 

Eine Funktionsübersicht, wie sie sich für ein Handbuch gehört:

  1. Mehrschritt-Onboarding mit Erklärung der Tiles und Datenanalyse
  2. Tile-Ansicht mit zeitabhängigen Statistiken – bei Klick auf die Statistik wird ein Graph generiert zur Zeitabhängigkeit der Werte mit hoffentlich interessanten Vergleichswerten
    1. Auswählbarer Zeitraum Woche-Monat-Jahr, inkl. All-Time (hier mit eigenem Warte-Screen) und benutzerdefiniertem Zeitraum
    2. Statistiken zu Workouts: Radfahren, Schwimmen, Laufen und Ski
    3. Statistiken zum Schalfen: Gesamtschlaf, Tiefschlaf, REM-Schlaf
    4. Statistiken zum Herz: Gesamtherzschläge aufgezeichnet, Stehzeit
    5. Weitere Statistiken: Schritte, Aktive Energie verbrannt, Gesamtzeit Workouts, Durchschnittschlafzeit
  3. Höchstwert-Ansicht
    1. Höchste Herzrate
    2. Schnelle Laufgeschwindigkeit
    3. Höchste Laufenergie in Watt
    4. Längstes Laufworkout
    5. Längstes Radworkout
    6. Längstes Schwimmtraining
    7. Längstes Workout
    8. Meiste Schritte an einem Tag
    9. Meiste Kalorien verbrannt an einem Tag
    10. Meiste Trainingsminuten an einem Tag
    11. Längster aufgezeichneter Schlaf
    12. Meister Tiefschlaf an einem Tag
    13. Meister REM-Schlaf an einem Tag
    14. Längste Zeit mit durchgehenden Schlaf-Aufzeichnungen
  4. Auszeichnungs-Ansicht
    1. Sechs Medaillen für Laufen
    2. Sieben Medaillen für Radfahren
    3. Sieben Medaillen für Schwimmen
    4. Sechs Medaillen für Gehen
    5. Sieben Medaillen für die Cardiogesundheit
    6. Sieben Medaillen für das Herz
    7. Sechs Medaillen für Schlaf
    8. Dreizehn weitere Medaillen
  5. Statistiken für Nerds-Ansicht
    1. Datenübersicht
    2. Workout-Aufteilung
    3. HealthKit-Performance
    4. Zeitstempelübersicht
    5. Datenquellenübersicht
    6. Hardwarequellenübersicht
    7. Gerätesoftwarekombinationsquellenübersicht
    8. Softwarequellenübersicht
  6. Widget für Homescreen
  7. Rewind-Feature (YourStats Unwrapped) mit den folgenden Infos: 
  8. Drei Eastereggs

Nächste Pläne

Was steht nach YourStats an? YourStats 2.0? Nein, erstmal nicht. Auch wenn ich total Lust hätte, Dinge wie die SharDB2 implementierung weiterzuführen und noch mehr Features verfügbar zu machen, werde ich mein Interesse was iOS-Apps anbelangt erstmal anderen Themen widmen. Was das genau ist, will ich noch nicht jetzt verraten, nur schonmal so viel: Die nächste App wird für chaotische Personen ein treuer Begleiter werden.

Xcode ist mir während dem Projekt doch sehr ans Herz gewachsen.

Postscriptum

Was mir derweil besonders aufgefallen ist. Die Zeit, die man in ein Feature steckt, ist häufig vollkommen disjunkt davon, wie viel Zeit die Nutzer am Ende in diesem Feature verbringen werden: Ich habe für den Selektor des Benutzerdefinierten Zeitraums sicherlich fünf bis zehn Stunden verbracht, auch wenn vielleicht alle Nutzer der App jemals zusammen diesen Selektor für zehn Minuten sehen werden. Ich hoffe, diese Nutzer freuen sich über die intuitive Bedienung :).

Die gesamte App (Stand Version 1.2.0) hat übrigens 15.502 Zeilen Swift-Code und 2381 Zeilen JSON-Dokument, in dem App-Metadaten und die Sätze für die „Did you know“-Section des Graphviews gespeichert werden. Diese habe ich in rund 200 Stunden geschrieben (inkl. Deployment und Grafiken).

Ich habe sehr gute Erfahrungen mit XCode Cloud zum Builden und Publishen der App gemacht, diese wird einfach auf Commit to Main getriggert und Baut erst, und veröffentlicht dann den neuen Build direkt in Testflight.

AI driven Development in the Age of Swift-Native Apps

Wer bis hierhin gelesen hat, interessiert sich wahrscheinlich auch zu meiner Meinung und den Erfahrungen mit künstlicher (generativer) Intelligenz bei dem Swift-Projekt war.

Als Hintergrund: Ich vor dem Projektstart dem Thema und Coding-Tools wie Cursor und Claude Code relativ kritisch gegenüber gestellt, da ich in komplexen Projekten häufig gesehen habe, wie KI die Projekte nahezu zerreisst und Bugs durch die gesamte Codebase streut. In dem Projekt habe ich mehrmals versucht, mit Claude Code einzelne Features zu implementieren (vor allem den Selektor für den benutzerdefinierten Zeitraum, da mir bei diesem die Geduld nach drei Stunden des Versuchens langsam entging).

Diese Versuche waren meist dann von Erfolg begleitet, wenn ich sehr genaue Anweisungen geben konnte (vor allem mit direkten Code-Funktionsverweisen) und nicht auf die Kreativfähigkeit des neuronalen Netzes setzen musste.

KI-Tools funktionieren aus meiner Sicht besonders dann, wenn bereits ein gutes Verständnis der Codebasis besteht, Features genau abgetrennt werden können und ein möglichst genaues Konzept der Umsetzung bereits existiert.

Wenn ich mal versucht habe, ein etwas gröberes Feature (z.B. Caching der Statistiken) mit den Tools umzusetzen, hat mir Claude Code direkt angefangen irgendwelche grundlegenden Konzepte neu schreiben zu wollen. Von einem so einem Versuch sind noch hunderte Emojis zur Debugging-Ausgabe (mein bester Indikator für KI-Code) in der Codebase, die ich nach und nach erst entferne.

Dank

Ein Dank, damit die App überhaupt so gedeihen konnte, gehört mehreren Personen:

Lukas Kollmer, der mich bei allen möglichen Swift Weh-Wehwehchen beraten hat und das gesamte Stanford Spezi- und Digital Health-Team. Es ist mir jeden Tag aufs neue eine Ehre, in einem so tollen Team arbeiten zu dürfen. Außerdem will ich allen Testnutzern für das Feedback danken, allen voran: Linda, Lasse, Johannes und Leony.