GoPilates — a French-first Pilates app on the App Store. ~13k LOC of SwiftUI, a 37-screen onboarding funnel, RevenueCat-powered subscriptions, HealthKit integration, Lottie animations, and Tenjin attribution. iPhone-only, iOS 17+, shipped for the client (DRF GROUP LLC). This repo is the public archive of the build.
Build a Pilates app for francophone users that feels less like a fitness tracker and more like a guided studio — emotional onboarding, body-zone targeting, weight-projection visuals, and a subscription that converts because users have already invested 37 screens into their plan. RevenueCat handles the paywall, HealthKit logs the workouts, Tenjin tracks the install attribution. Apple's App Store, no Android.
| 37-screen onboarding funnel | Goal, body-type, current/target weight, fitness level, daily life, difficulty, emotional drivers, affirmations, future pacing, social proof — the full BetterMe-style conversion arc. Implementations live under GoPilates/Onboarding/. |
| RevenueCat subscriptions | Centralised in SubscriptionManager. Free trial → paid plans configured via RevenueCat's dashboard, not hardcoded in the app. StoreKit config for local testing in Configuration.storekit. |
| HealthKit integration | HealthKitManager — workouts log into the Apple Health app, contributing to Activity rings. Read + write usage strings declared in Info.plist. |
| Tenjin attribution | TenjinService — install attribution + event tracking for paid ads. Per-event guard against the deprecation warnings the SDK throws on iOS 17+. |
| Workout player | WorkoutPlayerView — timed exercise loops with audio cues, WorkoutTimerService drives the countdown, Lottie animations on visual states. |
| AudioManager | AudioManager — plays through .mixWithOthers so a Pilates session doesn't clobber the user's music. |
| XcodeGen project | project.yml → .xcodeproj regenerated from spec. Easier for code review, easier for CI. |
| Xcode Cloud CI scripts | ci_scripts/ — pre-build hooks for App Store builds. |
| iPhone only | TARGETED_DEVICE_FAMILY = "1" — no iPad layouts, no Mac Catalyst. Portrait only. |
SwiftUI · Swift 5 · iOS 17+ · iPhone-only / portrait
RevenueCat · subscription paywall
HealthKit · Apple Health write-through
Lottie · animated illustrations
Tenjin SDK · install attribution
AVFoundation · audio session + cue playback
XcodeGen + Xcode Cloud · project + CI
GoPilates/
├── App/GoPilatesApp.swift @main entry; AVAudio + RevenueCat init
├── Onboarding/ 37 screens + OnboardingFlow.swift + OnboardingData.swift
├── Dashboard/ home + day/streak progress
├── Workout/ LazyWorkoutView + WorkoutPlayerView
├── Profile/ user profile + settings
├── Library/ program / exercise library
├── Models/ UserProfile + persistence
├── Services/
│ ├── SubscriptionManager.swift RevenueCat wrapper
│ ├── HealthKitManager.swift read/write Apple Health
│ ├── TenjinService.swift attribution + events
│ ├── AudioManager.swift AVAudio session + cues
│ ├── WorkoutTimerService.swift countdown engine
│ └── LottieAnimationService.swift Lottie playback helper
├── Design/ tokens, styles, reusable views
└── Resources/ Assets.xcassets · Info.plist (fr-FR primary)
Configuration.storekit local StoreKit testing config
project.yml XcodeGen spec
ci_scripts/ Xcode Cloud hooks
# 1. Generate the .xcodeproj from project.yml (if XcodeGen isn't installed):
brew install xcodegen
xcodegen generate
# 2. Open in Xcode
open GoPilates.xcodeproj
# 3. RevenueCat: the publishable iOS API key in GoPilatesApp.swift is the
# PUBLIC key (designed for client-side use, like a Stripe publishable
# key). For your own builds, swap it for your own app key.
# 4. For local subscription testing, use the bundled Configuration.storekit
# file as the StoreKit configuration in the run scheme.Requires Xcode 16+. Runs on iOS 17+ devices (project deployment target is 18.0; App Store binary serves 17.0+).
🟢 Live on the App Store, shipped to production. Engagement complete; this repo is the public archive of the build.
All Rights Reserved — Source-Visible.
This is not an open-source repository. The code is on GitHub for the limited purpose of letting you read it — evaluate the engineering, study the architecture, see the build quality. That's it.
Not allowed: running it, deploying it, copying it into another project, redistributing it, modifying it, sublicensing it, or commercially exploiting it — even for free. "Free" doesn't equal "permitted."
If you want a commercial licence or a custom build, get in touch.
/// OPEN FOR NEW WORK /// CONTRACT & FREELANCE /// REMOTE WORLDWIDE ///