Installed 1.5.6 (127): photo stencil at50% adjustable opacity and Photo Session with one step per photo in the latest daily folder, including repeated/unassigned types.436host tests, native generated-image/crypto checks, lint, metadata and build inspection pass. Real camera framing/mirror/timer and UI await owner review. See implementation and device evidence.
Import memory correction 1.5.5 (126), installed on iPhone: actual synthetic imports pass at32MiB (peak47MiB) and500MiB (peak55MiB), compared with146MiB before correction for32MiB. Export disk-full was confirmed SQLite13/13 and resolved by the owner freeing space. The owner confirms the original import now succeeds. See measurements and scope.
Local candidate 1.5.4 (123): optional complete encrypted vault backup. Source implementation, 427 host tests, strict lint, 13 metadata checks and native bundle inspection pass. Installed on the iPhone after a requested retry; postflight confirms 1.5.4 (123) with the same signer, certificate and entitlements. The owner reports PASS for the native synthetic backup checks. Direct report readback is pending because USB is disconnected; real Files/Face ID and personal-media acceptance remain pending. See implementation record.
Reps is a native, local-first iPhone workout app built for focused training, clear progression, and full ownership of your data.
It is written with SwiftUI, SQLite, and Apple system APIs. There is no account, backend, analytics, advertising, or in-app runtime network dependency.
Plan your workouts, prepare your added weight, follow each set, rest with Dynamic Island, and review your progress — all offline.
The latest published IPA, Reps 1.5.3 (120), is available from Releases. Reps is the new name of Sport. Local build 1.5.3 (122) is installed on the owner's iPhone and completes the encrypted movie index so the visible end of cropped videos is respected without reencoding. Four native cropped-video regressions, including reordered frames and HEVC, pass precise duration and exact decoded-frame checks. The owner confirms both additional original videos now import without errors. Detailed import errors and strict validation remain. The release also includes the previously delivered correction keeping deletion swipe backgrounds red. Delivery and verification are tracked in the current plan. Historical release binaries retain the display name they were built with.
Public IPAs are built locally on Linux in Release configuration and distributed unsigned. Sign the IPA with your own Apple account and a compatible sideloading tool before installing it. Downloading the file alone does not install the app. No personal development certificate or provisioning profile is included.
Requires iOS 26.0 or later on iPhone. Dynamic Island appears on supported devices; rest activities also work on the Lock Screen.
Each release provides the IPA directly. See building and distribution for the exact workflow.
- Create and edit workouts, choose their day, and order exercises.
- Set the number of sets per exercise in each workout, such as two push-up sets on Tuesday and four on Saturday, using a compact menu or custom input.
- Track repetitions or timed holds, including free-duration exercises.
- Set precise repetition and added-weight goals.
- Exercise edits update future goals automatically; unavailable weight compositions still require review.
- Progress shows each exercise’s main workout goal, selected by its total target volume.
- Edit timed goals directly, including switching between a duration and untimed holds.
- Edit the backpack’s own weight in kilograms from the same grouped settings section as Maximum Objects. Manage its available load combinations. Set unit weight and available quantity for identical objects; compositions show grouped copies such as Book × 10 without duplicate totals. Set Maximum Objects in Added Weight (10 by default, excluding the backpack). Choices prioritize fewer physical copies before applying the 0.5 kg spacing, then appear by ascending weight.
- Review your goals and the actual items needed before starting.
- One warm-up movement derived from the first working exercise.
- A full-target bodyweight warm-up for weighted goals, or two half-target sets for bodyweight goals.
- Half rest between warm-up sets, followed by full rest before working sets.
- A cancellable 3–2–1 countdown for timed holds.
- Record completed repetitions, duration to the nearest tenth of a second, added weight, and exercise effort (Feeling).
- Correct a recorded set without restarting the rest timer.
- Resume a workout after leaving the app.
- Finish with one timed stretch movement, selected in preparation; each hold stops automatically at its target duration.
- Turn Stretching off in Settings → Training to skip stretches in every new workout while keeping warm-ups.
- See the real total workout time, including rest and stretching.
- Persistent rest deadlines between sets and between exercises, with pause, resume, and skip.
- Live Activities on the Lock Screen and Dynamic Island.
- Pause and resume directly from the activity.
- Native minutes/seconds rest picker with 30-second increments.
- Optional 🏋️♂️ workout and 📸 monthly photo reminders, with a test notification in Settings.
- A weekly body-weight reminder with a chosen day and time; recording that day’s weight removes its reminder.
- Workout and exercise history, with manual entry and corrections.
- Body-weight tracking in kg: one measurement per day, editable history, and a date-based chart.
- Renaming a recorded workout preserves its explicit load decision.
- Shared 3-month, 6-month, and 1-year chart periods.
- Connected charts for average volume, repetitions and work time per set, plus maximum added weight.
- Drag on charts to inspect individual session totals and set counts.
- Period totals, including total isometric work time, and a GitHub-style activity grid from the first completed workout or progress-photo date.
- A current Streak in calendar days, including rest days; it breaks after one current week’s worth of consecutive missed scheduled workouts and restarts on the next completion.
- Tap the streak value in Progress to choose Days or Largest Unit (15 days → 2 weeks; 372 days → 1 year).
- Neutral filler cells, crosses for missed scheduled workouts and white camera icons on progress-photo days, without a legend. Missed days use the current enabled schedule and exclude today; photos do not count as completed workouts.
- Explicit next-session suggestions based on completed sets, your goals, effort, and available weight.
- Added-weight choices favor fewer objects even at nearby different weights, then require at least 0.5 kg between choices. For example, 10.2 kg using one object is preferred over 10 kg using five. Existing valid selections and recorded compositions stay intact.
- Review added-weight increases or decreases directly when moving to the next exercise or stretching.
- Choose Update Goal or Keep Current Goal for load changes; an explicitly chosen different load keeps its associated targets.
- At completion, future goals follow the latest session containing that exercise across all workouts, including actual per-set hold durations. Each workout keeps its set count. Targets use the ceiling-average repetitions or seconds at the highest load actually used in that session. At the same load, recorded performance refreshes the target even when a load increase is declined.
- Warm-up and stretch results remain separate from working-set progression.
- Follow Handstand, L-sit, Planche and Front Lever roadmaps, including optional advanced goals.
- Read offline instructions and open optional demonstration sources in your browser.
- Create your own skills and steps, or duplicate a built-in roadmap.
- Add independent skill blocks to each workout, before strength by default or afterward.
- Practice independently with free practice, timed holds or repetitions; pause and resume saved activity.
- Record attempts, optional notes and declared best holds separately from strength statistics.
- Choose your current step and mark first success or consistent performance yourself.
- Preserve skill configuration, results and active state in JSON backups; CSV replacement keeps skill practices.
- A Face ID-protected Private Vault with Physique photos and movement videos.
- Encrypted originals and thumbnails using CryptoKit AES-GCM.
- Immediate locking when leaving the vault or backgrounding the app, with its preview covered.
- Photo dates and counts remain visible in Progress while images stay locked. Older photo days appear after the next normal vault unlock.
- Date-based photo stacks: Front Relaxed, Front Flexed, Back, and Other.
- Compare matching poses, zoom, and switch between comparison photos.
- Explicit photo export and confirmed deletion.
- Movement folders automatically show Skills you follow, alongside custom movements saved only in the vault.
- Import dated MOV/MP4 videos from Photos, up to 5 minutes and 500 MiB, without changing the original.
- Review technique at 1×, 0.5× or 0.25×; align and compare two videos with shared or separate playback.
- Videos stack by day. Open a stack, then long-press or swipe a clip left for confirmed deletion.
- Imported vault copies permanently omit audio without recompressing the video. Existing clips are converted after the next Face ID unlock; an interrupted or unsupported conversion keeps the encrypted original and retries on a later unlock. Photos originals stay unchanged.
- Saved videos remain available after their Skill is completed, archived or deleted.
The vault uses a device-bound key protected by the current biometric enrollment. In Import and Export, Include Private Vault adds every photo, video, thumbnail and movement to a password-encrypted portable backup. Without that option, or with an empty vault, export remains a training JSON with no password. The biometric key is never exported. See security.
- Import from Files and Export to Files, with an optional Include Private Vault toggle. Training-only/empty-vault exports remain password-free JSON. A nonempty vault produces one encrypted
.repsbackupfile after Face ID and password confirmation; losing the password makes that backup unrecoverable. - The JSON archive includes calisthenics skills, personal roadmaps, practice results and resumable active state, alongside workouts, working sets, historical goals, warm-up/stretch results, catalogue, schedule, inventory, goals, body-weight measurements and training settings. Legacy CSV import remains supported.
- CSV import replaces training history after preview and confirmation, preserving your configuration.
- JSON restore replaces training data and settings after preview and confirmation.
- No account or server.
- No analytics, advertising, tracking, or cloud database.
- No application network requests.
- No third-party runtime SDKs.
- Local SQLite storage with transactional migrations.
- Explicit camera, Face ID, and photo-export permissions.
- Private media stay excluded from training-only transfers and automatic system backups. Including the vault in an explicit export encrypts the complete archive, including training.
Reps itself does not upload your data or contact a server. Training data may be included in iOS device backups according to your system settings; the private vault is explicitly excluded. Complete encrypted exports and saving a photo to Photos are user-controlled. Legacy JSON/CSV imports preserve the current vault; complete encrypted restores replace both training and vault after preview and confirmation. The source repository and release IPAs contain no on-device history, private photos, signing keys, or personal provisioning profiles.
Reps favors native iOS components, familiar navigation, system typography, SF Symbols, restrained haptics, and useful animations.
Its visual identity uses Icy Cyan #4DD9E8 with neutral system surfaces. The layered .icon app icon gives iOS the foreground shapes and material settings needed for native depth and glass rendering.
The app stays in portrait throughout, including full-screen presentations.
The interface is currently English. Exercise names and other personal content are preserved as entered.
| UI | SwiftUI |
| Persistence | SQLite |
| Language | Swift 6.4 |
| Build system | Swift Package Manager + xtool on Linux |
| Minimum OS | iOS 26.0 |
| Rest activities | ActivityKit, WidgetKit, App Intents |
| Photo protection | CryptoKit, Keychain, LocalAuthentication |
| App icon | Layered .icon, compiled locally |
| Runtime package dependencies | None |
| Backend / application network access | None |
The development workflow uses Linux and an already-configured Swift Apple SDK and xtool installation. No macOS build runner or Xcode project is required.
git clone https://github.com/raaaton/Reps.git
cd Reps
bash scripts/release-local.shThe script produces a verified, unsigned IPA in dist/, named with the version from the app plist. It does not sign, install, or upload anything.
The icon and App Intents metadata steps use the configured Linux tools described in BUILD.md. An Apple SDK is required but is not redistributed here.
The current suite contains 411 host tests for the real Swift domain and SQLite code, plus 13 metadata, branding and Skills style checks. Builds and package inspections also check the real app and widget.
The tests exercise scenarios such as reopening saved data, migrations, rollback, duplicate actions, stale commands, paused rest timers, malformed imports, and workout transitions. Assertions compare the results of those scenarios with the required behavior.
These checks do not run SwiftUI or prove Face ID, notifications, haptics, or Live Activity rendering on an iPhone. Physical-device testing is still required. See TESTING.md for examples and current limits.
Sources/
├── Reps/ # App, native views and platform services
├── RepsCore/ # Domain, SQLite and transitions
├── RepsLiveSupport/ # Shared activity state and adapters
├── RepsRestWidget/ # WidgetKit extension
└── CSQLite/ # System SQLite module
Resources/RepsIcon.icon/ # Editable vector icon layers
Tests/Host/ # Linux domain and persistence tests
Tests/Metadata/ # App Intents metadata regression tests
scripts/ # Local build, metadata and release verification
Issues are welcome. This remains a personal app; there is no commitment to a public support schedule.
See LICENSE. The app icon adapts a Phosphor silhouette; its MIT notice is retained in Resources/IconSources and included in the app.
Reps
Native. Offline. Focused.
Reps updates the same installed app. Its technical bundle/keychain identity and backup markers intentionally retain the legacy name, preserving local training, Face ID vault access, reminders and existing exports. The sport:// workout-link alias remains supported alongside reps://.
The user confirms the video-import alert crash is resolved. Original-file import still fails; 1.5.5 (114) now preserves and displays the precise original diagnostic in the import form. 411 host tests, 13 metadata checks, native builds and USB delivery pass; direct inspection confirms 114 with unchanged identity/signer/entitlements. The original file's acceptance remains unresolved. See the current investigation.