Hi, I'm David. I'm a software engineer that loves to workout. Like many, I'm using AI to create my gym programs. I've used Anthropic Fable to build me the perfect workout app that takes in a Gemini/Claude/ChatGPT workout plan in full text and generate a workout program to track reps/sets/weights. I'm very pleased with the results. The app is extensively using iOS 27 APIs so will be available (for free) in September upon the new OS releases.
A strength-training app for iPhone and Apple Watch, built exclusively on the iOS 27 / watchOS 27 SDKs. Paste any workout program as plain text and on-device Apple Intelligence turns it into a structured, trackable plan.
"Fortiche" is French slang for someone who's really good at something.
- Text → program: paste a program in any reasonable format ("Bench 3x5 @ 80kg", rep ranges, AMRAP, %1RM, RPE, rest times). Parsed on-device with the FoundationModels framework — nothing leaves the phone. A deterministic parser covers devices without Apple Intelligence.
- Live workouts on either device: full iPhone-only mode, or a watch-run session with heart rate. During watch workouts the phone shows a live, editable mirror — change weight/reps/sets from whichever device is closer.
- Quick workouts ⚡: crunches in front of the TV count too. Two steps — pick an exercise (recents first), confirm sets × reps — and you're in a real live session with rest timer and Live Activity, no program needed. Short sessions with logged sets always save. Or just tell Siri: "Start 3 sets of 20 crunches in Fortiche."
- Built for sweaty hands: one giant action per screen, Digital Crown weight adjustment, Double Tap to complete a set, no fiddly gestures.
- Rest timer with watch haptics, phone notifications, and a Live Activity countdown in the Dynamic Island.
- Live Activity with interactive Done Set / Skip Rest / Pause buttons.
- Apple Health: workouts save with one
HKWorkoutActivityper exercise; they count toward your rings. - Siri / App Intents: "Start my push day", "Log 8 reps at 80 kilos", "Skip my rest" — hands-free while lifting.
- History: personal records (estimated 1RM), weekly volume chart, last-session ghost while lifting, plate calculator, kg/lb.
| Piece | Role |
|---|---|
FortichePack/ |
Shared SwiftPM package: SwiftData models, the workout engine, parsing, sync protocol, stats, App Intents |
Fortiche/ |
iOS app |
ForticheWatch/ |
watchOS app |
ForticheWidgets/ |
Live Activity + widgets |
Key design decisions:
- Command-sourced workout engine (
ActiveWorkoutEngine): every mutation is a sequence-numbered command. The watch is authoritative during watch sessions; the phone applies edits optimistically and reconciles against echoed snapshots. State journals to disk on every command, so a crash restores mid-set. - Transports: live sync rides
HKWorkoutSessionmirroring on real devices, with a WatchConnectivity fallback for simulators (mirroring's Rapport link doesn't exist between paired simulators — seedocs/SPIKE-M1.5.md). Templates push phone → watch viaapplicationContext; finished workouts return dual-channel and upsert by UUID. - Weights are always stored in kilograms;
WeightUnitconverts only at display/input boundaries. - CloudKit-ready SwiftData models: optional/defaulted properties, no unique constraints, explicit order fields.
Requires Xcode 27 (the project targets the iOS 27 / watchOS 27 SDKs) and XcodeGen.
xcodegen generate # regenerate Fortiche.xcodeproj after editing project.yml
open Fortiche.xcodeprojTests live in the package:
swift test --package-path FortichePackSet DEVELOPMENT_TEAM in project.yml for device builds. See CLAUDE.md
for CLI build commands and simulator caveats.
This repo is deliberately structured so that AI coding agents can contribute at full quality. If you're pointing an agent (Claude Code or similar) at it:
- Start at the repo root.
CLAUDE.mdcarries the build commands, simulator caveats, and the hard rules; agents that respect it avoid the expensive mistakes. - Load the skill library.
.claude/skills/contains the project's institutional memory: a debugging playbook, the failure archaeology (every trap that cost real time, with the evidence that settled it), the architecture contract, diagnostic scripts, and a decision-gated campaign for the hardest open problem (real-device live-sync verification). Have your agent loadfortiche-change-controlbefore making any change, and the relevant sibling skill before touching a subsystem. - Prove it, don't eyeball it. Tests green
(
swift test --package-path FortichePack), both platforms building, and PRs that include the evidence — test output, screenshots, log lines. UI claims need screenshots; sync claims need logs; and nothing about watch↔phone mirroring may be claimed from simulator runs (it can't work there — seedocs/SPIKE-M1.5.md). - Don't hand-edit generated artifacts. The Xcode project comes from
project.yml(xcodegen generate), icons fromScripts/generate_icon.swift, the exercise dataset fromScripts/import_exercises.py.
Humans: same rules, fewer tokens. Full details in CONTRIBUTING.md. If the skill library ever drifts from reality, regenerate it by handing your agent docs/SKILL_LIBRARY_PROMPT.md.
Exercise data from free-exercise-db (public domain), originally derived from exercises.json by Ollie Jennings.





