- Xcode 16+ (current
project.pbxprojuses object version 77) - iOS 17+ device or simulator (SwiftData)
- Apple ID (free signing works for personal use)
- Open
StepBack.xcodeprojin Xcode - Select the
StepBacktarget → Signing & Capabilities- Check Automatically manage signing
- Team: your Apple ID
- Bundle Identifier: change to something unique, e.g.
com.yourname.stepback
- Plug in your iPhone
- Select your device in the run destination
- Cmd+R
project.yml is the source of truth — StepBack.xcodeproj is generated from it by XcodeGen. CI verifies the two stay in sync.
brew install xcodegen
xcodegen generateRe-run xcodegen generate after editing project.yml, then commit both project.yml and the regenerated project files. If you only ever edit code, you don't need XcodeGen installed locally.
On the phone, the first time: Settings → General → VPN & Device Management → trust your dev account.
The target bundles these usage descriptions:
| Key | Reason |
|---|---|
NSPhotoLibraryUsageDescription |
Read videos from Photos for practice playback |
NSPhotoLibraryAddUsageDescription |
(Phase 2) Save ghost-overlay recordings back to Photos |
NSCameraUsageDescription |
(Phase 2) Ghost-overlay recording |
NSMicrophoneUsageDescription |
(Phase 2) Audio during ghost-overlay recording |
- Free signing expires every 7 days. Re-plug your phone and hit Cmd+R to refresh.
- Free accounts are limited to 3 sideloaded apps per device and 10 App IDs per week. Don't churn bundle identifiers.
- A paid Apple Developer account ($99/yr) lifts both limits.
.github/workflows/ci.yml runs on every push and PR:
- SwiftLint (
--strict) - xcodebuild build + test on
iPhone 15simulator, iOS latest
The build step is guarded: until the Xcode project is committed, the job no-ops so CI stays green during initial scaffolding.
For development, keep a handful of short (10–30s) clips in your Photos library covering:
- Well-defined drums (for beat detection sanity)
- Swing/blues with syncopation (tests half-time/double-time fallback)
- Low-volume or phone-mic-quality audio (realistic event footage)