Zum Inhalt springen
Entwicklungstagebuch

Warum ich meine eigene Lauf-App gebaut habe

6 Min. Lesezeitvon Manuel

Mit 41 habe ich wieder mit dem Laufen angefangen, wollte kein Abo zahlen, um meine eigenen Daten zu sehen, und beschloss, die App zu bauen, die ich wirklich wollte. Hier hat alles angefangen.

Ein Live-Lauftraining auf der Apple Watch mit großer Tempo-Ziffer

Im Februar dieses Jahres habe ich wieder mit dem Laufen angefangen. Ehrlich gesagt war es meine Frau, die mich dazu angestupst hat. Ich bin 41, lebe in Lieboch bei Graz mit meiner Frau, unseren drei Kindern und unserem kleinen Zoo (einem Hund, zwei Katzen und drei Schildkröten), und irgendwann dazwischen hatte ich still und leise aufgehört, jemand zu sein, der läuft.

Was mich wirklich vor die Tür brachte, war eine Laufgruppe, das „Liebocher Lauf-Team", die sich jeden Dienstag nach der Arbeit trifft. Ehrlich, die Routine in Gang zu bringen war zäh. Mein Arbeitsalltag war fordernd, und das Einfachste der Welt wäre gewesen, es ausfallen zu lassen. Aber ein fester Termin an einem festen Tag, mit Leuten, die auf dich warten, ist eine völlig andere Art von Verbindlichkeit als der vage Plan, „irgendwann mal laufen zu gehen". Dieser fixe Dienstag-Slot ist der Grund, warum ich drangeblieben bin und langsam wieder regelmäßig zu laufen begann, Woche für Woche Tempo und Ausdauer zurückholend. Also ein echtes Dankeschön an meine Frau und an alle im Liebocher Lauf-Team, dass ihr das möglich gemacht habt. Diese App gibt es zum Teil, weil ihr das getan habt.

Womit ich nicht gerechnet hatte: Das Laufen würde zu einem Software-Projekt werden.

Nicht die Apps waren das Problem. Der Deal war es.

Ich habe die üblichen Verdächtigen ausprobiert. Es sind gute Apps, ehrlich. Aber zwei Dinge zermürbten mich.

Das Erste war die Anpassbarkeit. Ich wollte selbst entscheiden, was meine Watch mir beim Laufen zeigt, wo und wie groß. Die meisten Apps geben dir ein festes Set an Screens und ein Layout nach dem Prinzip "friss oder stirb". Ich wollte nicht mit der Vorstellung anderer Leute verhandeln, wie ein "Lauf-Screen" auszusehen hat.

Das Zweite war der Deal. Um meine eigenen Daten richtig zu sehen, sollte ich ein Abo abschließen. Noch ein monatlicher Posten, für immer, für Zahlen, die meine eigene Watch gemessen hat. Das halte ich nicht für fair. Ich finde, ein einmaliger Kauf einer App ist fair: Du zahlst einmal, sie gehört dir, und ich aktualisiere sie weiter, so lange ich es vernünftig kann. Wenn es irgendwann einen großen genug Sprung gibt, vielleicht gibt es dann eine Version 2 zu einem neuen Preis. Aber das ist eine Brücke für später. Wir werden sehen.

Datenschutz ist kein Feature. Er ist die Voreinstellung.

Das ist mir wichtiger, als es gerade modern ist. Ich glaube an die DSGVO, nicht als Compliance-Häkchen, sondern als die richtige Idee: Du erhebst die Daten, die du wirklich brauchst, und sonst nichts. Für Runara ist "die Daten, die ich wirklich brauche" heute: keine. Die App sammelt nichts. Kein Account, keine Cloud, keine Analyse deines Trainings. Deine Trainings liegen in Apple Health, auf deinen Geräten, wo sie hingehören.

Ich bin ehrlich und verspreche nicht, dass sich das nie ändert. Wenn eine künftige Funktion wirklich etwas braucht, sage ich es klar, und du bekommst die Wahl. Aber der Ausgangspunkt ist null, und ich habe vor, die Latte so hoch zu halten.

Also habe ich das Ding gebaut

Ich bin von Haus aus Ingenieur, und ich habe Runara mit viel Hilfe von Claude gebaut. Das will ich offen sagen, denn "KI-gebaute App" ist zum Synonym für billig und kaputt geworden. Das hier ist das nicht. Ich habe Claude wie einen sehr schnellen, sehr belesenen Pair-Programmer behandelt, und das Urteilsvermögen kam von mir: die Architektur-Entscheidungen, der Geschmack, das "nein, das ist falsch, und hier ist warum". Mehr zu dieser ehrlichen Bilanz im letzten Beitrag dieser Serie.

Der erste Tag gab den Ton vor. Bevor auch nur ein einziger Screen existierte, hatte ich ein striktes Projektgerüst: ein Swift-Paket namens SportsKit, damit die Watch-App keine iPhone-only-Abhängigkeiten mitschleppt, eine CI-Pipeline mit einer 80-Prozent-Testabdeckungsgrenze, selbst gehostete Schriften (Archivo Narrow für die großen Ziffern, JetBrains Mono für alles Tabellarische) und Swift 6 mit voll aufgedrehter strikter Nebenläufigkeit. Instrumenten-Disziplin ab Commit null, denn Qualität nachträglich einzubauen funktioniert nie.

Sauber war es nicht. Der allererste Folge-Commit war ein Bugfix:

fix(phase-0): bundle OFL fonts end-to-end (subset API + resource layout)

Das Schrift-Subsetting-Tool, das ich geschrieben hatte, rief eine Methode auf, die es nicht gab. Ein passender Start: Das allererste Ding, das ich baute, war schon kaputt, und das allererste, was ich tat, war es zu reparieren und weiterzumachen. Das ist ehrlich gesagt der Großteil von Softwareentwicklung.

Eine Regel, die mich später rettete

Eine frühe Entscheidung sah damals nach Paranoia aus und stellte sich als das heraus, was echte Daten rettete. Jede Information, die auf der Festplatte landet oder zwischen Watch und Telefon synchronisiert wird, muss es überstehen, von einer neueren Version der App zurückgelesen zu werden, die inzwischen neue Felder bekommen hat. Swifts automatisches Decodieren macht das nicht elegant. Also machte ich es zur harten Regel: Jeder gespeicherte Typ bekommt handgeschriebenes Decodieren, das fehlende Felder verträgt.

Wochen später war genau diese Regel der Unterschied zwischen "die App bekam ein Feature" und "die App löschte still die Einstellungen aller". Diese Geschichte erzähle ich richtig im Apple-Health-Beitrag. Für den Moment: Die langweiligen Fundamente sind die, auf die es ankommt.

Was diese Serie ist

Das hier ist das Entwicklungstagebuch. Ich gehe durch, wie Runara wirklich entstanden ist, der Reihe nach, samt der Teile, die nicht gut liefen. Die Kartenfunktion, die mich einen Tag lang bekämpfte. Das winzige Watch-Symbol, das drei Anläufe brauchte, um nicht mehr kaputt auszusehen. Der Crash, der einen On-Device-Debugger und drei Versuche zum Beseitigen brauchte. Ein Pool in meinem Garten, der zu einem echten Feature wurde.

Es waren ein paar fokussierte, intensive Wochen des Bauens, oben drauf auf einem vollen Leben. Ich bin stolz darauf, und ich will dir die Nähte zeigen. Das fühlt sich ehrlicher an als ein Hochglanz-Launch-Beitrag, und offen gesagt ist es die bessere Geschichte.

Als Nächstes: echte Zahlen aufs Handgelenk bringen und der Watch beibringen, eine Karte zu zeichnen, wo es gar keinen Empfang gibt.