Linus Fritz
Projekt · 2026

Grit

Gym-Tracker für iPhone

Die App schreibt Krafttraining mit und rechnet daraus die nächsten Schritte. Kein Konto, kein Server, keine Anmeldung. Alles liegt auf dem Gerät.

01 Version 1.4 im App Store

Was die App macht

Der Katalog hat 90 Geräte. Für jedes schreibt die App Satz für Satz mit: Gewicht, Wiederholungen und wie schwer der Satz war. Daraus schlägt sie das nächste Gewicht vor, setzt die Pausenlänge, baut Aufwärmsätze und rechnet die Statistik.

Fünf Bereiche: Heute, Geräte, Statistik, Cardio, Profil. Der Heute-Tab zeigt, was heute dran ist. Trainings- und Körpergewicht gehen an Apple Health.

Version
1.4, live seit 10.10.2026
Erste Fassung
15.07.2026
Mindestsystem
iOS 17
Größe im Store
5,3 MB
Code
94 Swift-Dateien, davon 47 Services und 34 Views
Tests
447 grün, in 46 Testdateien
Sprachen
Deutsch und Englisch, 843 Schlüssel
Bundle-ID
de.linusfritz.grit
Heute-Tab mit Vorschlag und Erholung je Muskel
Heute-Tab mit Tagesvorschlag
Geräteliste nach Muskelgruppen
Geräteliste, 90 Einträge
Statistik, Thema Woche, mit Serie, Wochenziel und Sätzen
Statistik und Bestwerte
SwiftSwiftUISwiftDataHealthKitWidgetKitActivityKitSwift Testing
02

Der Aufbau

Die App hat drei Schichten. Views zeigen an. Models halten die Daten in SwiftData. Services rechnen.

Die Regel dahinter gilt für das ganze Projekt: ein Service rechnet und kennt das System nicht. Uhr, Ton, Haptik und HealthKit werden als Protokoll hineingegeben. Im Test steht dort ein Ersatz. Deshalb braucht kein Test ein Gerät, eine Uhrzeit oder eine echte Gesundheitsdatenbank.

Das ist der Grund für die 447 Tests. Sie prüfen keine Oberfläche, sondern Rechnungen mit festen Eingaben. Ein Fehler im Gewichtsvorschlag ist damit in Sekunden reproduzierbar statt erst im Gym.

Was gerechnet wird

Das ist der Kern der App. Jede Zeile ist ein eigener Service mit eigenen Tests.

RechnungWas sie macht
ProgressiveOverloadGewichtsvorschlag. Plus 2,5 kg, wenn alle Sätze gehalten wurden. Ein Deload-Schalter erzwingt leichtere Vorschläge.
OneRepMaxGeschätztes Ein-Wiederholungs-Maximum nach Epley, je Satz und über den Verlauf.
RestByRPEPausenlänge. Basis plus Zuschlag nach empfundener Anstrengung: fordernd 30 s, am Limit 60 s. Liefert auch die Erklärzeile unter dem Timer.
WarmupSuggestionZwei Aufwärmsätze als Rampe aus dem Arbeitsgewicht.
MuscleReadinessErholung je Muskelgruppe aus dem eigenen Verlauf. Basis der Gruppe mal Satzzahl mal Anstrengung.
WeeklySetTargetArbeitssätze je Muskelgruppe diese Woche gegen den Richtwert.
FatigueTrendErkennt steigende Anstrengung über die letzten Trainingstage.
WeightTrendKilo pro Woche als Regressionssteigung aus dem Health-Gewichtsverlauf.
DailySuggestionDer Tagesvorschlag. Fasst Erholung, Anstrengungstrend, offene Wochensätze und Planhistorie zu einem Satz zusammen.
Entscheidung: local-first und kein Backend

Ein Backend hätte Synchronisation über mehrere Geräte gebracht. Es hätte auch Konto, Passwort, Server, laufende Kosten und eine Datenschutzerklärung für Trainingsdaten bedeutet. Die App braucht nichts davon, um ihre Aufgabe zu erfüllen. SwiftData auf dem Gerät reicht. Der Server-Pfad liegt im Code und ist in Version 1 abgeschaltet.

Entscheidung: Erholung ohne Apple Watch

Ausgangsfrage war, ob der Hinweis „deine Muskeln brauchen noch Zeit" eine Apple Watch braucht. Für den Körper-Score schon. Er braucht Schlaf, Ruhepuls und Herzratenvariabilität. Für die Muskeln nicht. Wann eine Gruppe zuletzt wie hart dran war, steht längst im eigenen Trainingsverlauf. Es fehlte nur die Rechnung. Beide Werte bleiben getrennt, weil sie Verschiedenes messen.

Entscheidung: Geräte ausblenden statt löschen

Wer ein Gerät aus seiner Liste nimmt, blendet es aus. Gelöscht wird nichts. Löschen würde den Namen aus allen alten Einträgen nehmen, und damit wäre der Verlauf kaputt. Die Auswahl-Listen zeigen deshalb nur die behaltenen Geräte, die Nachschlage-Stellen den vollständigen Katalog.

Neu in 1.4

Version 1.4 ordnet Heute, Statistik und Profil nach Themen, ein Thema pro Bildschirm.

Zweite Plattform

Es gibt Grit auch für Android. Die Fassung ist der Vollständigkeit halber gebaut und hinkt hinterher: kein Play-Eintrag, keine Gesundheitsdaten, keine Widgets. Die Rechenregeln teilen sich beide Apps trotzdem.

Zur Android-Fassung