Jede Wiederholung. Festgehalten.
Ein schnelles, privates Trainingslog für Krafttraining, im App Store für iPhone, iPad und Apple Watch.
Veröffentlicht am 12. Juli 2026. Ich habe Reps gebaut, weil ich es für mein eigenes Training wollte: ein Log, das still genug ist, um daneben zu trainieren, Tage, die sich sperren, wenn die Arbeit getan ist, und einen Connector, über den Claude meine Historie liest und die nächste Einheit plant, ohne die Datenbank anzufassen. Sechsunddreißigtausend Zeilen Swift und 185 Tests später erscheint es in siebzehn Sprachen. So ist es entstanden.
Kreis antippen, Tag sperren.
Ein Trainingslog hat genau eine Aufgabe: den Satz festzuhalten, bevor er vergessen ist. Reps ist das Log, das ich für mich selbst wollte. Es öffnet sich auf dem heutigen Tag, zeigt den geplanten Split und loggt einen Satz mit einem einzigen Tipp auf einen Kreis. Es gibt keinen Feed und keine Zahlen anderer Leute, weil ich beides zwischen den Sätzen ohnehin nie benutzt hätte.
Ein Satz besteht aus Gewicht und Wiederholungszahl. RPE, Pausentimer und Notizen sind da für die, die sie wollen, und bleiben allen anderen aus dem Weg. Persönliche Rekorde berechnen sich von selbst aus abgeschlossenen Sätzen: Höchstgewicht plus ein nach Brzycki geschätztes Einwiederholungsmaximum.
Das Feature, das ich behalten würde, wenn ich alles andere streichen müsste, sind gesperrte Tage. Einen Tag abschließen, sperren — und die App verweigert jede weitere Änderung, bis Sie ihn selbst wieder entsperren. Das Entsperren ist eine bewusste Handlung in der App, und eine Automatisierung, die in Ihrem Namen handelt, kann einen gesperrten Tag überhaupt nicht bearbeiten. Wenn Sie einen Monat Training durchsehen, liest sich ein gesperrter Tag genau so, wie Sie ihn eingetragen haben.
Das Geschäftsmodell folgt derselben Regel. Das Log ist kostenlos, für immer, und Ihre Aufzeichnungen liegen nie hinter einer Paywall. Das Abonnement Reps Pro verkauft genau eine Sache: verwaltete KI-Planung, für Leute, die den Planer wollen, ohne einen eigenen API-Schlüssel mitzubringen.
Handschrift auf einer Tafel.
Trainingslogs auf Papier haben eine Sache richtig gemacht: ein Datum, eine Übung und darunter hingekritzelte Zahlen. Reps behält dieses Objekt als Ganzes. Daten und Gewichte werden in Bradley Hand und Noteworthy gesetzt, die Palette bleibt bei Tinte auf Fast-Schwarz mit einem einzigen Grün, und die Trennlinien sind kein Textur-Asset. Sie wackeln, weil eine Shape aus sechzehn Linien jedes Segment leicht aus der Mittellinie rückt:
struct RepsHandDrawnLine: Shape { func path(in rect: CGRect) -> Path { var path = Path() let segments = max(Int(rect.width / 12), 8) let segmentWidth = rect.width / CGFloat(segments) path.move(to: CGPoint(x: 0, y: rect.midY)) for index in 1...segments { let x = CGFloat(index) * segmentWidth let y = rect.midY + (index.isMultiple(of: 2) ? -0.8 : 0.9) path.addLine(to: CGPoint(x: x, y: y)) } return path } }
Probieren Sie die Zeile unten aus. Sie baut die Kerninteraktion der App für diese Seite nach: Tippen Sie auf einen Kreis, um einen Satz abzuschließen, sperren Sie dann den Tag und sehen Sie zu, wie er Sie abweist.
Freitag, 12. Juni
Umgekehrtes Rudern
Tippen Sie auf die Kreise. Sperren Sie den Tag. Versuchen Sie es noch einmal.
Wo die Handschrift endet.
Zehn der siebzehn Startsprachen verwenden die handschriftlichen Schriften. Japanisch, Koreanisch, Chinesisch, Arabisch, Hindi und Thai fallen auf SF Rounded zurück, weil Bradley Hand keine Glyphen für diese Schriftsysteme enthält und eine unechte CJK-Handschrift wie ein Kostüm wirkt. Farbe folgt derselben Disziplin: Das Markengrün ist hell, deshalb dunkelt sich Akzenttext auf hellen Flächen selbst ab, um ein Kontrastverhältnis von 5.4:1 zu halten, und tvOS-Fokuszustände tragen ihre eigene Tinte. Jedes Tippziel hält Apples 44-Punkt-Minimum ein, weil Sie diese Bedienelemente zwischen den Sätzen mit müden Händen treffen, nicht am Schreibtisch.
Die Teile, die man nie sieht, kommen aus Kit941, dem SwiftUI-Designsystem, das sich die 941-Apps teilen: Abstands-, Bewegungs- und Haptik-Tokens, snapshot-getestete Komponenten und Apples Liquid Glass, hinter einem einzigen Style gekapselt. Reps ruft .glassEffect() nie direkt auf. Der Notizbuch-Look gehört Reps; das Gerüst teilen sich alle.
iPhone, iPad und Apple Watch, in siebzehn Sprachen.
Reps läuft auf iPhone, iPad und Apple Watch aus einer einzigen SwiftUI-Codebasis. Die Watch-App bleibt bewusst klein: Sie zeigt die Sätze des Tages und hakt sie vom Handgelenk aus ab, und WatchConnectivity trägt jede Änderung binnen Sekunden aufs Telefon. Im Gym schlägt eine Checkliste jede Tastatur.
Siri und Kurzbefehle docken über App Intents an. Sagen Sie „Satz loggen“, und der Satz landet im Log, ohne dass die App geöffnet wird, weil der Intent über denselben validierten Schreibpfad einreicht, den auch die UI verwendet.
- English
- Deutsch
- Español
- Français
- Italiano
- Nederlands
- Português
- Svenska
- Bahasa Indonesia
- Tiếng Việt
- 日本語
- 한국어
- 简体中文
- 繁體中文
- العربية
- हिन्दी
- ไทย
Siebzehn Sprachen ab dem ersten Tag, mit App Store-Metadaten in 22 Locales. Ein Verifikationsskript lässt jeden Build nur durch, wenn über 735 Strings hinweg kein einziger Schlüssel fehlt.
Builds für Mac und Apple TV existieren und laufen. Sie erscheinen, wenn sie fertig sind.
Eine einzige Eingangstür.
Reps liefert einen Connector mit: eine CLI und einen MCP-Server, die einem Agenten echten Zugriff auf Ihr Log geben. Claude liest Ihre Historie, bemerkt, was stagniert, und plant den Freitag. Vom Terminal aus:
$ reps last Friday, June 26 — Chest / Back [locked] Barbell Bench Press 255 lb × 6, 6, 6, 5 Weighted Pull-Up 25 lb × 5, 5, 4 Weighted Dip 60 lb × 10, 10, 10 $ claude "I started BJJ twice a week. What should change?" Reading your last 8 weeks via the reps connector… pulling volume is high for a grappling schedule. Suggesting: drop one row day, add hip hinge + neck work. Plan Friday around this?
Lese- und Schreibzugriffe nehmen verschiedene Wege. Lesezugriffe öffnen eine synchronisierte lokale Replik Ihrer Daten, schreibgeschützt, sodass eine Abfrage nichts beschädigen kann und offline funktioniert. Schreibzugriffe berühren diesen Speicher nie. Jede Mutation geht als Befehl an die App; die App validiert ihn mit denselben Regeln, die auch die UI durchsetzt, wendet ihn an, synchronisiert ihn und gibt eine Quittung zurück. Ein gesperrter Tag weist die Änderung eines Agenten genauso ab wie eine Fingerspitze.
Jeder Befehl, den der Connector akzeptiert, durchläuft dieselbe Validierung wie ein Tipp, und ein gesperrter Tag wirft einen Fehler, bevor irgendetwas den Speicher berührt:
guard let session = try sessionForDay(date, modelContext: modelContext) else { throw CommandError.validationFailed("no workout exists on \(dayLabel)") } guard !session.isLocked else { throw CommandError.dayIsLocked(dayLabel) } guard let target = (session.sets ?? []).first(where: { $0.exerciseName.caseInsensitiveCompare(exerciseName) == .orderedSame && $0.setNumber == setNumber }) else { throw CommandError.validationFailed("no set \(setNumber) of \(exerciseName)") }
Claude / CLI / Siri
Liest die synchronisierte Replik direkt, schreibgeschützt. Sendet jeden Schreibzugriff als Befehl, nie als Datenbankzugriff.
Die App
Validiert jeden Befehl mit denselben Regeln wie die UI. Gesperrte Tage weisen Änderungen ab. Jeder Schreibzugriff gibt eine Quittung zurück.
Der KI-Planer bekommt dieselbe Behandlung. Das Modell — verwaltet oder mit eigenem Schlüssel — parst nur die Absicht: welche Art Tag, was betonen, was vermeiden. Eine deterministische Engine auf dem Telefon übernimmt die eigentliche Programmierung: Sie wählt Übungen aus dem Korpus von 42 Übungen, wendet Wiederholungsschemata an, die zu Ihrem Ziel passen, steigert Lasten anhand Ihrer geloggten Historie und lintet das Ergebnis, bevor es je das Log erreicht. Die KI schreibt nie direkt ein Workout.
Zwei funktionierende Architekturen sind auf dem Weg hierher gestorben: eine dateibasierte Claude Desktop-Erweiterung, dann ein gekoppelter Server im lokalen Netzwerk mit TLS-Pinning und eigenem RPC-Bus. Jede fügte eine zweite Tür zu den Daten hinzu, also flog jede wieder raus. Die ausgelieferte App hat eine.
Der Connector stellt 23 MCP-Tools bereit, von get_exercise_history bis set_custom_program. Ich habe das Jahr damit verbracht, über Software, deren erster Leser ein Assistent ist, zu schreiben; Reps ist dieses Argument, ausgeliefert. Get Bananas hat einen MCP-Server in eine Einkaufsliste gesteckt. Reps gibt dem Agenten einen Planer in die Hand und behält die Leitplanken.
Wo die Daten liegen.
Datenschutzversprechen sind billig, deshalb hier die Store-Konfiguration selbst. Trainingsdaten spiegeln sich in Ihre private iCloud-Datenbank; Gesundheitsmetriken liegen in einem zweiten Speicher, der nie synchronisiert wird und nie in ein Backup gelangt:
// No explicit name: the synced configuration keeps the historical // default.store path, which the Mac connector reads directly. let modelConfiguration = ModelConfiguration( schema: syncedSchema, isStoredInMemoryOnly: false, cloudKitDatabase: .private("iCloud.com.941apps.Reps") ) let healthCacheConfiguration = ModelConfiguration( "Reps-healthcache", schema: localSchema, isStoredInMemoryOnly: false, cloudKitDatabase: .none )
Ihre Trainingsdaten
Liegen in Ihrer privaten iCloud-Datenbank und synchronisieren sich über Apple von Gerät zu Gerät. Reps hat kein Kontosystem und keinen Server, der Workouts speichert. Ich kann Ihre Kniebeugen-Zahlen nicht lesen.
Gesundheitsmetriken
Herzfrequenz und Kalorien, die aus Health gelesen werden, bleiben in einem zweiten Speicher: auf dem Gerät, von Backups ausgeschlossen, nie synchronisiert. Verknüpfen Sie ein Health-Workout mit einem gesperrten Tag, synchronisiert sich nur die Verknüpfung. Die Messwerte bleiben auf dem Telefon.
KI-Planung
Optional. Wenn Sie sie nutzen, geht die Plananfrage (Ihr Profil und die jüngste Historie) an den Anbieter Ihrer Wahl: den verwalteten Dienst oder Ihren eigenen API-Schlüssel. Die Engine, die jeden Plan ausarbeitet und validiert, läuft auf dem Telefon. Verzichten Sie auf KI, geht nichts an irgendeinen KI-Anbieter.
Festgehalten.
Reps ist kostenlos im App Store. Ich habe es für mein eigenes Training gebaut, und es ist das Log, das ich jeden Tag öffne; wenn Sie dasselbe wollen, es ist da. Wenn Sie für Agenten bauen, ist der Schreibpfad der Teil, den es sich zu stehlen lohnt. (Die Zahlen sind Werte vom Erscheinungstag.)