Zum Inhalt springen
Kontakt
Case Study · Consumer · Fitness

Klaimo: Fahrrad-Tracking, bei dem man echte Gebiete erobert

Gamifizierte Fahrrad-Tracking-App für iOS & Android – beim Fahren erobert man reale Gebiete auf der Karte, mit Live-Karte, Ranglisten und Teams. Eine Eigenentwicklung von SB-Techworks.

FlutterGo / Cloud RunMapboxGarmin APIRevenueCat
Fahrrad-Tracking-App Klaimo von SB-Techworks: Live-Karte mit eroberten Territorien
500.000+App-Downloads
24 hAntwort-Zeit (Mo–Fr)
100 %Code-Eigentum bei dir
1Ansprechpartner von Anfrage bis Launch

Die Herausforderung

Eine Fitness-App muss eine Fahrt aufzeichnen und auswerten. Eine gamifizierte Fahrrad-App, in der beim Fahren reale Gebiete erobert werden, muss aus derselben Aufzeichnung etwas grundlegend anderes machen: aus einer Linie eine Fläche – und diese Fläche gegen alles rechnen, was auf der Karte bereits jemandem gehört. Damit verschiebt sich der Schwerpunkt vom Frontend in die Geometrie: Polygone bilden, zusammenfassen, verschneiden, voneinander abziehen. Genau dieser Teil entscheidet über Spielgefühl und Betriebskosten.

Erschwerend kommt hinzu, dass GPS-Rohdaten kein sauberer Streckenzug sind. Positionen driften, springen in enger Bebauung, kommen in ungleichmäßigen Abständen und brechen in Tunneln oder bei Signalverlust ab. Wer aus so einer Punktfolge unmittelbar ein Polygon bildet, erhält Selbstüberschneidungen, Ausreißer und geometrisch ungültige Formen – und ungültige Geometrie bringt jede darauf aufbauende Verschneidung zu Fall. Vor der eigentlichen Spielmechanik steht deshalb Datenaufbereitung.

Dazu kommt die Frage der Verbindlichkeit: Sobald es Ranglisten und Teams gibt, muss das Ergebnis für alle dasselbe sein. Ein Weltzustand, den jedes Endgerät für sich berechnet, wäre weder konsistent noch überprüfbar. Und der Aufwand verhält sich anders als bei reinem Tracking: Eine Streckenaufzeichnung kostet immer ungefähr gleich viel, das Verschneiden neuer Flächen mit einer zunehmend gefüllten Karte nicht. Geodaten in Echtzeit zu verarbeiten und trotzdem eine flüssige Live-Karte zu zeigen, war die eigentliche Aufgabe – zusätzlich zu Abos über zwei Stores, Wearable-Anbindung und Store-Launch, alles aus einer Hand.

Der Ansatz

Die erste Entscheidung war der Schnitt zwischen App und Server. Die Flutter-App erfasst und stellt dar; was gilt, entscheidet das Backend. Die rechenintensive Geo-Mathematik – Flächen, Polygone, Überschneidungen – läuft in einem Go-Dienst auf Google Cloud Run, der bei Last automatisch skaliert. Damit beruht die Karte auf einer einzigen Quelle, Ranglisten und Team-Wertungen sind vergleichbar, und die Rechenlast liegt nicht auf einem Gerät, das parallel über eine ganze Fahrt hinweg Positionen aufzeichnen soll.

Go passt zu dieser Art Arbeit, weil Polygonoperationen CPU-gebunden sind und nicht auf Ein- und Ausgabe warten: kompilierter Code, kurze Startzeiten, geringer Speicherbedarf, Nebenläufigkeit ohne großen Überbau. Cloud Run ergänzt das um lastabhängige Autoskalierung – in Ruhephasen laufen entsprechend weniger Instanzen, bei Andrang kommen welche dazu. Das Lastprofil einer Freizeit-App ist erwartbar ungleichmäßig (Feierabend, Wochenende, gutes Wetter), und genau dafür ist eine anfragebasierte Autoskalierung gebaut. Die Kehrseite: Der Dienst muss zustandslos sein, jeder Zustand gehört in die Datenhaltung.

Auf der Karte werden die eroberten Territorien über eigene Mapbox-Layer gezeichnet statt über einzelne, auf die Karte gesetzte Overlay-Objekte. Der Unterschied liegt im Rendering: Flächen als Layer werden vom Karten-Renderer selbst gezeichnet und gestylt und bleiben beim Zoomen und Verschieben Teil der Karte, statt als wachsende Menge einzelner Elemente über ihr zu schweben. Live-Karte, Ranglisten und Teams greifen dabei auf denselben serverseitigen Stand zu.

Alles, was nicht den Kern ausmacht, wurde angebunden statt gebaut: Abos laufen plattformübergreifend über RevenueCat, sodass es einen Abostatus gibt statt zweier getrennter Zustandsautomaten für App Store und Play Store; Fitnessdaten kommen über die Garmin-API herein, damit die gewohnte Aufzeichnungshardware weiter genutzt werden kann. Die Leitlinie dahinter: selbst entwickeln, was das Produkt ausmacht – Geo-Logik, Spielmechanik, Kartendarstellung – und für den Rest etablierte Dienste nehmen. Architektur, Backend und Launch in App Store und Play Store lagen dabei in einer Hand.

Was entstanden ist

  • Echtzeit-Eroberung von Territorien
  • Interaktive Live-Karte (Mapbox)
  • Ranglisten & Teams
  • Abo-Modell (RevenueCat)
  • Garmin-Anbindung
  • Go-Geo-Backend auf Cloud Run

Technische Entscheidungen

Flächenberechnung im Backend statt auf dem Gerät

Lokal zu rechnen wäre in der Rückmeldung schneller und im Betrieb günstiger – aber der Spielstand wäre dann nur so verlässlich wie das Endgerät, und jedes Telefon hätte seinen eigenen Weltzustand. Für die Verschneidung mit fremden Territorien braucht es ohnehin Daten, die nur serverseitig vollständig vorliegen. Der Preis dafür ist Netzabhängigkeit: Das endgültige Ergebnis einer Fahrt steht erst mit der Antwort des Backends fest, und die App muss diesen Zwischenzustand sinnvoll überbrücken.

Go auf Cloud Run statt Dauerbetrieb-Server

Die Alternativen waren eine dauerhaft laufende VM – planbar, aber unter Spitzen zu klein und in Ruhephasen bezahlter Leerlauf – oder Kubernetes mit voller Kontrolle und entsprechendem Betriebsaufwand, der dauerhaft an einer Person hängen bliebe. Cloud Run nimmt einen Container entgegen und skaliert selbst; Go liefert dazu kurze Startzeiten und einen kleinen Speicher-Fußabdruck, was in genau dieser Umgebung unmittelbar zählt. Der Preis: Zustandslosigkeit ist Pflicht, längere Berechnungen müssen in beantwortbare Einheiten zerlegt werden, und Kaltstarts gehören beim Zuschnitt des Dienstes mitgedacht. Hinzu kommt ein schmaleres Geo-Ökosystem als etwa im Python-Umfeld – dafür schreibt man mehr selbst.

Eigene Mapbox-Layer statt Standard-Overlays

Naheliegend wäre gewesen, jedes eroberte Gebiet als einzelnes Polygon-Overlay auf die Karte zu legen. Das trägt bei wenigen Formen und wird unangenehm, sobald viele Flächen gleichzeitig sichtbar sind und sich beim Zoomen ständig ändern. Eigene Layer verlagern Zeichnen und Styling dorthin, wo Vektordaten hingehören: in den Karten-Renderer. Der Preis ist eine engere Bindung an einen kommerziellen Kartendienst samt nutzungsabhängiger Kosten und dessen SDK-Zyklus – Stile und Datenquellen werden dann in seinem Modell gedacht, nicht in dem des UI-Frameworks.

Eine Flutter-Codebasis statt zwei nativer Apps

Zwei native Apps wären bei Plattformtreue und beim Zugriff auf neue Betriebssystemfunktionen im Vorteil, bedeuten aber doppelte Entwicklung und dauerhaft doppelte Wartung – bei schlanker Aufstellung der falsche Preis. Mit Flutter gibt es eine Codebasis und einen Releasezyklus für iOS und Android. Der Preis zeigt sich genau an den plattformnahen Stellen: Kartendarstellung und Standorterfassung hängen an nativen SDKs, dort ist man auf die Qualität der Anbindungen angewiesen, und neue Plattformfunktionen stehen erst zur Verfügung, wenn diese nachziehen.

Tech-Stack

FlutterGo / Cloud RunMapboxGarmin APIRevenueCat

Ergebnis

Eigenentwicklung von SB-Techworks – von der Architektur über das Go-Backend bis zum Launch, veröffentlicht im App Store und im Play Store. Klaimo zeigt, dass auch rechenintensive Consumer-Apps mit Live-Geodaten als Solo-Projekt in Produktion gehen können.

Was das für ähnliche Projekte bedeutet

Für vergleichbare Vorhaben – überall dort, wo Bewegungs- oder Sensordaten zu einem verbindlichen Ergebnis werden – ist die entscheidende Frage nicht, wie sich GPS aufzeichnen lässt, sondern wo entschieden wird, was gilt. Sobald Ranglisten, Wettbewerbe oder Belohnungen im Spiel sind, gehört diese Berechnung auf den Server; nachträglich lässt sich das kaum reparieren, weil vergangene Zustände ohne serverseitige Quelle nicht rekonstruierbar sind. Ebenso lohnt der frühe Blick auf das Wachstumsverhalten: Aufzeichnen kostet konstant, das Verschneiden von Geometrie wird mit jedem zusätzlichen Datenbestand teurer. Ein zustandsloser, autoskalierender Rechendienst neben der eigentlichen Anwendung ist dafür ein tragfähiges Muster – und zwar nicht nur bei Geodaten.

Der zweite verallgemeinerbare Punkt betrifft den Zuschnitt: Jede selbst gebaute Nebenfunktion – Abrechnung, Abo-Verwaltung, Kartenrendering, Anbindung an Fremdplattformen – ist dauerhafte Wartung, und Wartung wächst mit, während die Entwicklungskapazität es nicht tut. Erfahrungsgemäß entscheidet bei gamifizierten Fitness-Apps weniger die Spielidee über die Machbarkeit als die Frage, wie viel rundherum selbst gebaut wird. Sinnvoller ist, die Eigenentwicklung auf den Teil zu konzentrieren, der das Produkt unterscheidbar macht, und für alles andere etablierte Dienste zu akzeptieren – einschließlich der Abhängigkeit, die man sich damit einhandelt.

Häufige Fragen

Warum läuft die Flächenberechnung nicht direkt in der App?

Weil das Ergebnis verbindlich sein muss. Ranglisten und Team-Wertungen setzen voraus, dass alle denselben Kartenstand sehen und dass die Berechnung nicht vom einzelnen Endgerät abhängt. Hinzu kommt, dass die Verschneidung einer neuen Fläche mit bereits eroberten Gebieten Daten braucht, die nur serverseitig vollständig vorliegen – und dass die Rechenlast nicht auf dem Telefon liegen sollte, das gleichzeitig die Fahrt aufzeichnet.

Wie wird aus einer gefahrenen Strecke ein erobertes Gebiet?

Eine Aufzeichnung ist zunächst nur eine Folge von Positionen, also eine Linie. Daraus wird eine Fläche abgeleitet und anschließend mit dem bestehenden Kartenstand verrechnet: Polygone werden vereinigt, überschnitten und voneinander abgezogen. Der Aufwand steckt weniger in der Aufzeichnung als in diesen Mengenoperationen und in der vorgelagerten Bereinigung der Rohdaten, denn ungültige oder selbstüberschneidende Geometrie macht jede weitere Berechnung unbrauchbar.

Warum ein Go-Backend und nicht ein Backend in der Sprache der App?

Eine Sprache weniger wäre bequem, aber die Aufgabe ist CPU-gebundene Geometrie und kein Warten auf Datenbank oder Netzwerk. Go ist kompiliert, startet schnell, braucht wenig Speicher und bringt Nebenläufigkeit ohne viel Überbau mit; in einer Umgebung, die pro Anfrage skaliert, wirkt sich das direkt aus. Der Nachteil ist ein schmaleres Geo-Ökosystem als etwa im Python-Umfeld und eine zweite Sprache, die gepflegt werden will.

Wie funktionieren Abos, wenn eine App in beiden Stores liegt?

App Store und Play Store haben je eigene Kaufabwicklung, eigene Belegprüfung und eigene Ereignisse für Verlängerung, Kündigung, Zahlungsverzug, Erstattung und Tarifwechsel. Wer das selbst abbildet, pflegt dauerhaft zwei Zustandsautomaten, die sich mit jeder Store-Generation ändern können. In Klaimo übernimmt RevenueCat diese Vermittlung, sodass ein plattformübergreifender Abostatus existiert – zum Preis eines Drittanbieters im Zahlungsweg und laufender, nutzungsabhängiger Kosten.

Wie kommen Daten von Garmin-Geräten in die App?

Über die Garmin-API, nach Verknüpfung des jeweiligen Kontos. Wichtig ist die richtige Erwartungshaltung: Fremdplattformen liefern Daten in ihrem eigenen Takt und ihrem eigenen Datenmodell, nicht als Live-Stream auf Zuruf. Für die Umsetzung heißt das, Aktivitäten zuverlässig zuzuordnen, Dopplungen zu vermeiden und die App so zu bauen, dass sie auch dann sinnvoll funktioniert, wenn externe Daten verzögert oder gar nicht eintreffen.

Lässt sich diese Architektur auf andere Anwendungen übertragen?

Das Muster trägt überall dort, wo aus Roh- oder Sensordaten laufend abgeleitete Ergebnisse entstehen: schlanke App für Erfassung und Darstellung, ein separater zustandsloser Rechendienst für die teuren Operationen, Darstellung über Vektor-Layer statt über viele Einzelobjekte. Ob dabei Geodaten in Echtzeit verarbeitet, Flächen ausgewertet oder große Messreihen aggregiert werden, ändert an der Aufteilung wenig. Unterschiedlich ist vor allem die Fachlogik im Rechendienst.

Ähnliches Projekt geplant?

SB-Techworks entwickelt individuelle Apps für iOS und Android – vom MVP bis zur skalierbaren Business-App, direkt aus der Entwicklung. Du bekommst innerhalb von 24 Stunden (Mo–Fr) eine ehrliche Einschätzung zu Machbarkeit und Kosten.

Kostenlose Einschätzung anfordern  App entwickeln lassen →