Chaque rép. Noir sur blanc.
Un carnet d'entraînement rapide et privé pour la musculation, sur l'App Store pour iPhone, iPad et Apple Watch.
Sorti le 12 juillet 2026. J'ai construit Reps parce que je le voulais pour mon propre entraînement : un carnet assez discret pour s'effacer sous la barre, des journées qui se verrouillent une fois le travail accompli, et un connecteur qui permet à Claude de lire mon historique et de planifier la séance suivante sans toucher à la base de données. Trente-six mille lignes de Swift et 185 tests plus tard, il sort en dix-sept langues. Voici comment il a pris forme.
Touchez un cercle, verrouillez la journée.
Un carnet d'entraînement n'a qu'un seul travail : capturer la série avant de l'oublier. Reps est le carnet que je voulais pour moi. Il s'ouvre sur aujourd'hui, affiche le split que j'ai prévu et consigne une série d'un seul toucher sur un cercle. Pas de fil d'actualité, pas les chiffres des autres : je n'allais utiliser ni l'un ni l'autre entre deux séries.
Une série, c'est une charge et un nombre de répétitions. Le RPE, les minuteurs de repos et les notes existent pour ceux qui en veulent et restent à l'écart pour tous les autres. Les records personnels se calculent d'eux-mêmes à partir des séries terminées : charge maximale, plus un max estimé sur une répétition selon la formule de Brzycki.
La fonctionnalité que je garderais s'il fallait couper tout le reste, ce sont les journées verrouillées. Terminez une journée, verrouillez-la, et l'app refuse toute modification tant que vous ne la déverrouillez pas vous-même. Le déverrouillage est un geste explicite dans l'app, et une automatisation agissant en votre nom ne peut en aucun cas modifier une journée verrouillée. Quand vous relisez un mois d'entraînement, une journée verrouillée se relit exactement comme vous l'avez consignée.
Le modèle économique suit la même règle. Le carnet est gratuit, pour toujours, et votre historique ne se retrouve jamais derrière un paywall. L'abonnement Reps Pro vend exactement une chose : la planification IA gérée, pour ceux qui veulent le planificateur sans apporter de clé API.
De l'écriture manuscrite sur un tableau noir.
Les carnets d'entraînement papier ont vu juste sur un point : une date, un exercice et des chiffres griffonnés dessous. Reps garde l'objet tout entier. Les dates et les charges s'affichent en Bradley Hand et Noteworthy, la palette s'en tient à de l'encre sur un fond presque noir avec un seul vert, et les séparateurs ne sont pas un asset de texture. Ils ondulent parce qu'un Shape de seize lignes décale chaque segment de la ligne médiane :
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 } }
Essayez la rangée ci-dessous. Elle reconstruit pour cette page l'interaction centrale de l'app : touchez un cercle pour terminer une série, puis verrouillez la journée et regardez-la vous dire non.
Vendredi 12 juin
Rowing inversé
Touchez les cercles. Verrouillez la journée. Réessayez.
Là où l'écriture manuscrite s'arrête.
Dix des dix-sept langues de lancement utilisent les polices manuscrites. Le japonais, le coréen, le chinois, l'arabe, le hindi et le thaï se replient sur SF Rounded, parce que Bradley Hand ne porte aucun glyphe pour ces écritures et qu'une police CJK qui imite l'écriture manuscrite fait déguisement. La couleur suit la même discipline : le vert de la marque est clair, donc le texte d'accent sur les surfaces claires s'assombrit de lui-même pour tenir un ratio de contraste de 5.4:1, et les états de focus sur tvOS portent leur propre encre. Chaque cible tactile respecte le minimum de 44 points d'Apple, parce que vous touchez ces commandes entre deux séries, la fatigue dans les mains, pas à un bureau.
Les parties que vous ne voyez jamais viennent de Kit941, le design system SwiftUI que partagent les apps 941 : des tokens d'espacement, de mouvement et d'haptique, des composants testés par snapshot, et le Liquid Glass d'Apple enveloppé derrière un seul style. Reps n'appelle jamais .glassEffect() directement. L'allure carnet appartient à Reps ; l'ossature est partagée.
iPhone, iPad et Apple Watch, en dix-sept langues.
Reps tourne sur iPhone, iPad et Apple Watch à partir d'une seule base de code SwiftUI. L'app Watch reste volontairement petite : elle affiche les séries du jour et les marque comme faites depuis le poignet, et WatchConnectivity porte chaque changement vers le téléphone en quelques secondes. En salle, une liste à cocher bat un clavier.
Siri et Raccourcis se branchent via App Intents. Dites « consigne une série » et la série atterrit sans ouvrir l'app, parce que l'intent passe par le même chemin d'écriture validé que l'interface.
- English
- Deutsch
- Español
- Français
- Italiano
- Nederlands
- Português
- Svenska
- Bahasa Indonesia
- Tiếng Việt
- 日本語
- 한국어
- 简体中文
- 繁體中文
- العربية
- हिन्दी
- ไทย
Dix-sept langues dès le premier jour, avec des métadonnées App Store en 22 locales. Un script de vérification conditionne chaque build à zéro clé manquante sur 735 chaînes.
Les builds Mac et Apple TV existent et tournent. Ils sortiront quand ils seront prêts.
Une seule porte d'entrée.
Reps est livré avec un connecteur : une CLI et un serveur MCP qui donnent à un agent un vrai accès à votre carnet. Claude lit votre historique, repère ce qui stagne et planifie vendredi. Depuis le terminal :
$ 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?
Lectures et écritures empruntent des routes différentes. Les lectures ouvrent une réplique locale synchronisée de vos données, en lecture seule : une requête ne peut rien corrompre et fonctionne hors ligne. Les écritures ne touchent jamais ce magasin. Chaque mutation arrive à l'app sous forme de commande ; l'app la valide avec les mêmes règles que l'interface, l'applique, la synchronise et renvoie un reçu. Une journée verrouillée refuse la modification d'un agent exactement comme elle refuse un doigt.
Chaque commande acceptée par le connecteur passe par la même validation qu'un toucher, et une journée verrouillée lève une erreur avant que quoi que ce soit ne touche le magasin :
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
Lit directement la réplique synchronisée, en lecture seule. Envoie chaque écriture sous forme de commande, jamais un accès direct à la base.
L'app
Valide chaque commande avec les mêmes règles que l'interface. Les journées verrouillées refusent les modifications. Chaque écriture renvoie un reçu.
Le planificateur IA reçoit le même traitement. Le modèle, géré ou avec votre propre clé, ne fait qu'interpréter l'intention : quel type de journée, quoi accentuer, quoi éviter. Un moteur déterministe sur le téléphone fait la vraie programmation : il choisit les mouvements dans le corpus de 42 exercices, applique des schémas de répétitions adaptés à votre objectif, fait progresser les charges à partir de votre historique consigné et contrôle le résultat avant même qu'il n'atteigne le carnet. L'IA n'écrit jamais une séance directement.
Deux architectures fonctionnelles sont mortes en chemin : une extension Claude Desktop basée sur des fichiers, puis un serveur appairé en réseau local avec épinglage TLS et son propre bus RPC. Chacune ajoutait une seconde porte vers les données, alors chacune a sauté. L'app livrée n'en a qu'une.
Le connecteur expose 23 outils MCP, de get_exercise_history à set_custom_program. J'ai passé l'année à écrire sur le logiciel dont le premier lecteur est un assistant ; Reps, c'est cet argument livré. Get Bananas a mis un serveur MCP dans une liste de courses. Reps tend à l'agent un planificateur et garde les garde-fous.
Où vivent les données.
Les promesses de confidentialité ne coûtent rien, alors voici la configuration du magasin elle-même. Les données d'entraînement se reflètent dans votre base privée iCloud ; les métriques de santé vivent dans un second magasin qui ne se synchronise jamais et n'entre jamais dans une sauvegarde :
// 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 )
Vos données d'entraînement
Elles vivent dans votre base privée iCloud et se synchronisent d'appareil à appareil via Apple. Reps n'a ni système de compte ni serveur qui stocke les séances. Je ne peux pas lire vos chiffres au squat.
Métriques de santé
La fréquence cardiaque et les calories lues depuis Santé restent dans un second magasin : sur l'appareil, exclu des sauvegardes, jamais synchronisé. Liez un entraînement Santé à une journée verrouillée et seul le lien se synchronise. Les mesures restent sur le téléphone.
Planification IA
Optionnelle. Si vous l'utilisez, la demande de plan (votre profil et votre historique récent) part vers le fournisseur que vous avez choisi : le service géré ou votre propre clé API. Le moteur qui développe et valide chaque plan tourne sur le téléphone. Sans IA, rien ne part vers aucun fournisseur d'IA.
Noir sur blanc.
Reps est gratuit sur l'App Store. Je l'ai construit pour mon propre entraînement et c'est le carnet que j'ouvre chaque jour ; si vous voulez la même chose, il est là. Si vous construisez pour des agents, c'est le chemin d'écriture qui mérite d'être volé. (Les chiffres sont ceux du jour de lancement.)