commits
TrimResult now includes the new HKWorkout object. The upload step
passes the trimmed copy to Strava rather than the original workout.
- Replace alert-based save flow with guided 3-step UI: trim & save,
upload to Strava (optional), remove original in Fitness
- Steps 2-3 visible but dimmed before saving, so user sees the full
process upfront with explainer text about what is preserved
- Remove delete button (users delete via Fitness to avoid ambiguity)
- Strava OAuth now opens the Strava app directly instead of in-app
browser, with URL callback handled via onOpenURL
- Reduce Strava scope to activity:write only
- Register overrun:// URL scheme in Info.plist for OAuth callback
- Add HKObserverQuery for live workout list updates when HealthKit
changes externally
- Add String Catalogs (Localizable.xcstrings, InfoPlist.xcstrings)
for internationalization — all UI strings auto-extracted by Xcode
- Activity type names use LocalizedStringResource
- Animated gradient header cycling through icon colors
- Update README with guided flow, Strava setup, localization guide
Read client ID and secret from Info.plist at runtime, populated via
Secrets.xcconfig build settings. Template file included for reference.
Also adds .gitignore for secrets, xcuserdata, and .claude/.
Move workout activity addition before samples for proper association,
fix min(end, end) shadowing bug, add error handling. Document that
Apple Fitness only shows splits for Apple's native Workout app (since
iOS 14) — no API or workaround exists.
- Add StravaManager with OAuth login, TCX generation, and upload via
Strava API (client ID/secret are placeholders)
- Add Strava connect/upload/disconnect UI to workout edit view
- Copy HKWorkoutActivity objects during trim so Apple Fitness can
display splits
- Expand authorization and migrated sample types (running dynamics,
effort scores, basal energy, step count, VO2 max)
- Fetch effort scores by time range and relate via special iOS 18 API
- Document all HealthKit and Strava platform limitations in README
Always create the trimmed copy, then attempt to delete the original.
If deletion fails (workout from another source), show an alert
explaining the copy was saved and guiding the user to delete the
original in Apple Fitness via "Delete Workout & Data".
Previously trimming deleted the original and created a blank workout,
losing all heart rate, energy, distance samples, routes, and events.
Now saveTrimmedWorkout fetches associated data, recreates it on the
new workout, and builds routes before deleting the original.
- Screenshots of workout list and detail view side by side
- Document all features: search, sort, pagination, trimming
- Highlight destructive nature of workout trimming with data loss details
- Add segmented sort picker (Date/Longest/Shortest) below title
- Use Section header for "Overrun" title to align with row text
- Hide nav bar to reduce top spacing
- Replace 4 hardcoded samples with 200 workouts across 10 activity types
- Add deleteAllWorkouts() to reset sample data cleanly
- Auto-insert samples on launch when fewer than 200 exist
- Paginate workout loading in batches of 50 with loadMoreWorkouts()
- Group workouts by month/year with section headers
- Add searchable filter by activity type name
- Show loading indicator at bottom for infinite scroll
- Add ActivityGraphView (Swift Charts line/area graph with dimming overlays)
- Add RangeSliderView (two-thumb slider for selecting trim range)
- Rewrite WorkoutEditView: graph, slider, time labels, activity picker
- Expand HealthKitManager with HR/energy/distance queries and realistic sample data
- Add destructive action warning to save confirmation
- Remove WorkoutAddView (not a use-case)
- Convert HealthKitManager to @Observable with async/await, replace deprecated HKWorkout initializer with HKWorkoutBuilder
- Replace NavigationView with NavigationStack, use modern toolbar and .alert APIs
- Fix fullScreenCover/EmptyView navigation hack with @Environment(\.dismiss)
- Add pull-to-refresh, empty state, duration display, date+time pickers, inline validation
- Expand activity types from 3 to 20, improve privacy descriptions
- Replace alert-based save flow with guided 3-step UI: trim & save,
upload to Strava (optional), remove original in Fitness
- Steps 2-3 visible but dimmed before saving, so user sees the full
process upfront with explainer text about what is preserved
- Remove delete button (users delete via Fitness to avoid ambiguity)
- Strava OAuth now opens the Strava app directly instead of in-app
browser, with URL callback handled via onOpenURL
- Reduce Strava scope to activity:write only
- Register overrun:// URL scheme in Info.plist for OAuth callback
- Add HKObserverQuery for live workout list updates when HealthKit
changes externally
- Add String Catalogs (Localizable.xcstrings, InfoPlist.xcstrings)
for internationalization — all UI strings auto-extracted by Xcode
- Activity type names use LocalizedStringResource
- Animated gradient header cycling through icon colors
- Update README with guided flow, Strava setup, localization guide
- Add StravaManager with OAuth login, TCX generation, and upload via
Strava API (client ID/secret are placeholders)
- Add Strava connect/upload/disconnect UI to workout edit view
- Copy HKWorkoutActivity objects during trim so Apple Fitness can
display splits
- Expand authorization and migrated sample types (running dynamics,
effort scores, basal energy, step count, VO2 max)
- Fetch effort scores by time range and relate via special iOS 18 API
- Document all HealthKit and Strava platform limitations in README
- Add ActivityGraphView (Swift Charts line/area graph with dimming overlays)
- Add RangeSliderView (two-thumb slider for selecting trim range)
- Rewrite WorkoutEditView: graph, slider, time labels, activity picker
- Expand HealthKitManager with HR/energy/distance queries and realistic sample data
- Add destructive action warning to save confirmation
- Remove WorkoutAddView (not a use-case)
- Convert HealthKitManager to @Observable with async/await, replace deprecated HKWorkout initializer with HKWorkoutBuilder
- Replace NavigationView with NavigationStack, use modern toolbar and .alert APIs
- Fix fullScreenCover/EmptyView navigation hack with @Environment(\.dismiss)
- Add pull-to-refresh, empty state, duration display, date+time pickers, inline validation
- Expand activity types from 3 to 20, improve privacy descriptions