すべてのレップが、記録に残る。
速くてプライベートな、レジスタンストレーニングのためのワークアウトログ。iPhone、iPad、Apple Watch向けにApp Storeで配信中です。
2026年7月12日リリース。Repsを作ったのは、自分のトレーニングに使いたかったからです。リフティングの邪魔をしない静かなログ、その日の仕事が終わればロックされる日々、そしてデータベースに触れることなくClaudeが履歴を読んで次のセッションを計画できるコネクタ。36,000行のSwiftと185本のテストを経て、17言語でリリースしました。ここでは、その成り立ちを紹介します。
丸をタップして、その日をロックする。
ワークアウトログの仕事はひとつ。忘れる前にセットを記録することです。Repsは自分のために欲しかったログです。開けば今日の画面になり、計画したスプリットが表示され、丸をひとつタップするだけでセットが記録されます。フィードもなければ、他人の数字もありません。セットの合間にそのどちらかを使うことは、自分には決してなかったからです。
セットとは、重量とレップ数のことです。RPE、休憩タイマー、メモは、必要な人のために用意され、それ以外の人の邪魔にはなりません。自己ベストは完了したセットから自動的に計算されます。最高重量に加えて、Brzycki式の推定1RMも算出されます。
他のすべてを削るとしても残したい機能が、日のロックです。その日を終えてロックすれば、自分でロックを解除するまでアプリは一切の編集を拒否します。ロック解除はアプリ内での明示的な操作であり、代理で動く自動化はロックされた日をまったく編集できません。ひと月分のトレーニングを振り返るとき、ロックされた日は記録したままの姿で読み返せます。
ビジネスモデルも同じルールに従っています。ログは永久に無料で、あなたの記録がペイウォールの向こうに置かれることはありません。Reps Proのサブスクリプションが売るのはただひとつ、マネージドのAIプランニングです。APIキーを持ち込まずにプランナーを使いたい人のためのものです。
黒板の上の手書き文字。
紙のトレーニングノートには、正しかった点がひとつあります。日付と種目、その下に走り書きされた数字です。Repsはその全体をそのまま受け継いでいます。日付と重量はBradley HandとNoteworthyで描画され、パレットはほぼ黒に近い地にインク、そして緑一色に抑えられています。区切り線はテクスチャ素材ではありません。揺れているのは、16行のShapeがすべてのセグメントを中心線から少しずつずらしているからです:
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 } }
下の行を試してみてください。アプリの中核となる操作をこのページ用に再現したものです。丸をタップしてセットを完了し、その日をロックして、編集が拒否される様子を確かめてください。
6月12日(金)
インバーテッドロウ
丸をタップ。この日をロック。もう一度触ってみてください。
手書きが止まるところ。
ローンチ時の17言語のうち、10言語が手書き書体を使います。日本語、韓国語、中国語、アラビア語、ヒンディー語、タイ語はSF Roundedにフォールバックします。Bradley Handにはこれらの文字のグリフがなく、偽物の手書き風CJKフォントは仮装にしか見えないからです。色も同じ規律に従います。ブランドの緑は明るいため、明るい面の上のアクセントテキストは自ら暗くなって5.4:1のコントラスト比を保ち、tvOSのフォーカス状態は専用のインクを持ちます。タップターゲットはすべて、Appleが定める44-pointの最小サイズを守っています。これらのコントロールに触れるのは、机の前ではなく、手が疲れ切ったセットの合間だからです。
目に見えない部分は、941系アプリが共有するSwiftUIデザインシステムKit941から来ています。スペーシング、モーション、ハプティクスのトークン、スナップショットテスト済みのコンポーネント、そしてひとつのスタイルの背後に包まれたAppleのLiquid Glass。Repsが.glassEffect()を直接呼ぶことはありません。ノートの見た目はRepsのもの。骨格は共有されています。
iPhone、iPad、Apple Watchで、17言語。
Repsは単一のSwiftUIコードベースからiPhone、iPad、Apple Watchで動きます。Watchアプリは意図的に小さく保っています。その日のセットを表示し、手首から完了をマークするだけ。WatchConnectivityが変更のひとつひとつを数秒でiPhoneに届けます。ジムでは、キーボードよりチェックリストです。
SiriとショートカットはApp Intents経由でつながります。「セットを記録して」と言えば、アプリを開かずにセットが記録されます。インテントは、UIが使うのと同じ検証済みの書き込み経路を通じて送信されるからです。
- English
- Deutsch
- Español
- Français
- Italiano
- Nederlands
- Português
- Svenska
- Bahasa Indonesia
- Tiếng Việt
- 日本語
- 한국어
- 简体中文
- 繁體中文
- العربية
- हिन्दी
- ไทย
初日から17言語でリリースし、App Storeのメタデータは22ロケールに対応しています。検証スクリプトがすべてのビルドをゲートし、735個の文字列に欠落キーがひとつもないことを保証します。
MacとApple TVのビルドは既に存在し、動いています。準備が整ったときにリリースします。
玄関はひとつ。
Repsにはコネクタが付属します。エージェントにログへの本物のアクセスを与えるCLIとMCPサーバーです。Claudeは履歴を読み、停滞している種目に気づき、金曜日のメニューを計画します。ターミナルからはこうです:
$ 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?
読み取りと書き込みは別々の道を通ります。読み取りは、同期されたローカルレプリカを読み取り専用で開きます。クエリが何かを壊すことはできず、オフラインでも動きます。書き込みがそのストアに触れることはありません。すべての変更はコマンドとしてアプリに送られ、アプリはUIが強制するのと同じルールで検証し、適用し、同期し、レシートを返します。ロックされた日は、指先を拒むのとまったく同じようにエージェントの編集を拒みます。
コネクタが受け付けるすべてのコマンドは、タップと同じ検証を通過します。ロックされた日は、何かがストアに触れる前に例外を投げます:
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
同期レプリカを読み取り専用で直接読みます。すべての書き込みはコマンドとして送信し、データベースには決して触れません。
アプリ
各コマンドをUIと同じルールで検証します。ロックされた日は編集を拒否します。すべての書き込みはレシートを返します。
AIプランナーも同じ扱いを受けます。モデルは、マネージドでも自分のキーでも、意図の解析だけを行います。どんな日にするか、何を重視するか、何を避けるか。実際のプログラム作成は、端末上の決定論的なエンジンが行います。42種目のコーパスから種目を選び、目標に合ったレップスキームを適用し、記録された履歴から負荷を漸進させ、ログに届く前に結果をリントします。AIがワークアウトを直接書き込むことは決してありません。
ここに至るまでに、動作していたアーキテクチャがふたつ廃案になりました。ファイルベースのClaude Desktop拡張、次にTLSピンニングと独自のRPCバスを備えたペアリング式ローカルネットワークサーバーです。どちらもデータへの2つ目の扉を増やすものだったので、どちらも取り除きました。出荷されたアプリの扉はひとつです。
コネクタはget_exercise_historyからset_custom_programまで、23個のMCPツールを公開しています。この1年、最初の読者がアシスタントであるソフトウェアについて書き続けてきました。Repsはその主張を実際に出荷したものです。Get Bananasは買い物リストにMCPサーバーを載せました。Repsはエージェントにプランナーを渡し、ガードレールを守り続けます。
データの居場所。
プライバシーの主張は安っぽくなりがちなので、ストア構成そのものを示します。トレーニングデータはあなたのiCloudプライベートデータベースにミラーリングされ、健康指標は決して同期されずバックアップにも入らない2つ目のストアに置かれます:
// 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 )
あなたのトレーニングデータ
あなたのiCloudプライベートデータベースに保存され、Apple経由でデバイス間を同期します。Repsにはアカウントシステムも、ワークアウトを保存するサーバーもありません。私にはあなたのスクワットの数字を読むことができません。
健康指標
「ヘルスケア」から読み取った心拍数とカロリーは2つ目のストアに保存されます。デバイス上のみ、バックアップから除外、同期は一切なし。ヘルスケアのワークアウトをロックされた日にリンクしても、同期されるのはリンクだけです。測定値は端末に残ります。
AIプランニング
オプションです。使う場合、プランのリクエスト(プロフィールと直近の履歴)は選んだプロバイダー、つまりマネージドサービスまたは自分のAPIキーの先に送られます。すべてのプランを展開して検証するエンジンは端末上で動きます。AIを使わなければ、どのAIプロバイダーにも何も送られません。
記録に残る。
RepsはApp Storeで無料です。自分のトレーニングのために作り、いまも毎日開いているログです。同じものが欲しいなら、そこにあります。エージェント向けに開発しているなら、盗む価値があるのは書き込み経路の部分です。(数値はローンチ当日のものです。)