Skip to content

chore(main): release 1.0.0 - #2

Closed
github-actions[bot] wants to merge 131 commits into
mainfrom
release-please--branches--main
Closed

chore(main): release 1.0.0#2
github-actions[bot] wants to merge 131 commits into
mainfrom
release-please--branches--main

Conversation

@github-actions

@github-actionsgithub-actionsBot commented Dec 24, 2025

Copy link
Copy Markdown

🤖 I have created a release beepboop

1.0.0 (2026-07-30)

Features

  • add animations and polish across the app (#8) (bace270)
  • add CI/CD workflows for build and release processes (1567675)
  • Add core features and structure for BetterFit iOS app, including main app entry, content view, and project configuration (fa8957e)
  • adrs: add ADR for Supabase authentication and data persistence strategy (8069632)
  • adrs: add architecture decision records and template for documentation (66a0424)
  • agent: add Plan Agent for structured implementation planning (5d60505)
  • agents: add philosophy section to outline coding principles (79fb9c0)
  • app-search: add settings category and detail view (efe4925)
  • app-search: enhance AppSearchView with improved search bar and navigation handling (12968a2)
  • app-search: enhance AppSearchView with improved section layouts and search functionality (c9471f4)
  • app-search: refactor search categories and results structure for improved organization (a7a77fd)
  • app-search: simplify search bar implementation and enhance navigation handling (13860f6)
  • app: enhance guest mode warning with sign-in prompt (d1f1444)
  • assets: add app icon and image asset generation files for iOS and watchOS (313d37e)
  • assets: add app icon asset catalog for iOS (d802fbd)
  • assets: add app icon images and include asset catalog in project configuration (4badcfc)
  • assets: update app icon images for various resolutions (49f80cc)
  • auth: implement Google OAuth sign-in and URL handling (bcb6e47)
  • auth: integrate user authentication and display name handling (1f79561)
  • betterfit: implement active workout retrieval in BetterFit class (40621ed)
  • build: update CI workflow to use macOS 26 for builds and tests (a684d4d)
  • build: update CI workflow to use ubuntu-latest for SwiftPM and macOS-latest for iOS builds (1e9c0af)
  • docs: add AGENTS.md for workflow and architecture documentation (2cca638)
  • docs: add API reference and usage examples documentation (b073c4d)
  • docs: add CONTRIBUTING.md for development setup and guidelines (a684d4d)
  • docs: add TabView patterns documentation for iOS 17+ and iOS 26+ (3d086cb)
  • docs: update README to enhance clarity and structure of core features (95ee2b5)
  • env: streamline Supabase credential management and update project setup scripts (848d019)
  • exercise-picker: add exercise picker view with filtering and sorting (23720d5)
  • exercise: add ExerciseDetailSheet for detailed exercise management (f713b8f)
  • exercise: consolidate exercise templates into a single library (30990ed)
  • floating-nav-bar: add circle background with glass effect for improved UI (dc0f826)
  • floating-nav-bar: enhance search functionality and improve tab navigation experience (4594424)
  • floating-nav-bar: enhance search functionality with animated background and improved UI (b28b10e)
  • fonts: add custom BBHHegarty fonts to iOS and Watch app Info.plist and project.yml (b853657)
  • healthkit: add HealthKit capabilities and entitlements for workout tracking (5d16490)
  • healthkit: add usage descriptions for health data access (f2842ad)
  • healthkit: integrate HealthKit for workout tracking and health data synchronization (d1ada19)
  • healthkit: update HealthKit entitlements and access permissions for workout tracking (75554f2)
  • ios: align illustrations and flow to BetterFit design system (#13) (59b1863)
  • iOS: redesign BetterFit workout experience (#11) (7ec043f)
  • ios: unify vector illustration system (#20) (ff1e3a7)
  • iOS: update entitlements and Info.plist for HealthKit background delivery support (f67b635)
  • lint: add SwiftLint configuration and update lint task in mise.toml (1bd2b0d)
  • mise: add linting task and update tools section in mise.toml (027aa56)
  • navigation: hide navigation bar in RootTabView for improved UI experience (6759e34)
  • persistence: implement PersistenceProtocol and SupabasePersistenceService for data management (f6f3d85)
  • persistence: implement user-specific data handling in Supabase service and add migration scripts (9040455)
  • plan: implement plan view with weekly schedule and AI suggestions (23720d5)
  • preview: add preview for StreakSummarySheetView with sample workouts (fde2eca)
  • profile: add contribution heatmap and expand/collapse functionality (216e1f2)
  • profile: add ProfileView for user settings and theme selection (5a77be9)
  • profile: enhance profile view with demo data and health stats (c5671d8)
  • recovery: implement RecoveryView to display recovery status and workouts (5a77be9)
  • recovery: refactor RecoveryView to use ScrollView and enhance UI components (fec7d72)
  • release: configure release-please with manifest and config files (4196520)
  • root-tab-view: improve layout and safe area handling in RootTabView (f67d910)
  • root-tab-view: refactor RootTabView to use enum for tabs and improve navigation structure (0aa6a7c)
  • root-tab: add start workout button with styling and safe area inset (64c3ced)
  • root-tab: enhance guest mode handling with Supabase configuration (249ec92)
  • search: add AppSearchView and integrate search functionality across multiple views (189a21a)
  • search: integrate search functionality across multiple views and add demo mode support (8c48835)
  • simctl: add timeout option for simulator query and improve error handling (6dabd54)
  • skills: add new skills for ADR writing, agent skills authoring, app icon generation, and Swift iOS teaching (716ba48)
  • skills: add Swift & iOS teaching skill documentation for React/Next.js developers (d9ed117)
  • social: add last workout date retrieval in SocialManager (40621ed)
  • streak: add StreakSummarySheetView for displaying workout streaks (5a77be9)
  • supabase: add scripts for local environment setup and loading credentials (f61d20a)
  • swift-ios-teaching: enhance interactive teaching guidelines (8b9c7f4)
  • tabs: create RootTabView to manage main navigation and tabs (5a77be9)
  • tabs: replace recovery tab with profile tab and update navigation (23720d5)
  • tests: add comprehensive tests for AppConfiguration and integration tests for BetterFit functionality (f6f3d85)
  • theme: implement theme management with multiple options and UI components (0c153d4)
  • theme: introduce semantic color tokens, light/dark, and appearance preference (#9) (2bd7e6b)
  • theme: introduce ThemePickerView for selecting app themes (5a77be9)
  • theme: update color gradients and add custom BBHHegarty font candidates (6168cb5)
  • trends: add weekly volume and recovery trend sections with mock data (c6fd88b)
  • trends: create TrendsView with placeholder for future trend features (5a77be9)
  • ui: add search functionality and improve navigation in RootTabView (40621ed)
  • uikit-swiftui-advisor: add comprehensive guidance for UIKit vs SwiftUI usage (10f3a2e)
  • ui: refactor AppSearchView and WorkoutHomeView for improved section organization and add custom heatmap range feature (91c9d4f)
  • ui: replace buttons with BFChromeIconButton for consistent styling and add theme support (87a5964)
  • vscode: add commit message generation instructions for conventional format (60cab27)
  • watch-app: add app icons and update Info.plist for BetterFit Watch app (af55de0)
  • watch-app: add BetterFit Apple Watch app with workout tracking and reminders (28a872d)
  • watch-app: add watch app setup instructions and scripts for simulator management (e3f7a35)
  • wire Profile PRs, Yearly Wrapped, exercise replacement (eedde33)
  • workout-home: enhance streak display and auto-scroll functionality (b1efdaf)
  • workout: add guest sign-in prompt and related functionality (d605246)
  • workout: add workout control features and UI updates (cb0097f)
  • workout: add workout planning and tracking features (6c76eb9)
  • workout: enhance workout preview with static exercise timeline (bf63941)
  • workout: enhance WorkoutHomeView with streak tracking and vitals display (40621ed)
  • workout: implement workout timer and elapsed time display updates (f514fee)
  • workout: isolate workout card stack to prevent re-renders on swipe gestures (74d412b)
  • workout: update default username to 'Guest' in WorkoutHomeView (2d3e74b)
  • workout: update exercise equipment requirements and muscle groups for workouts (ab2c406)

Bug Fixes

  • agents: update linting instructions for clarity in workflow section (dcf5042)
  • app: update display name in Info.plist from 'BetterFit Dev' to 'BetterFit' (a9d7ac5)
  • art: replace stick-figure athlete with the BetterFit mark (#16) (4e1d964)
  • auto-tracking: improve workout tracking logic and add current workout retrieval (40621ed)
  • ci: remove platform-dependent build failures (#21) (b496e3a)
  • design: drop cyberpunk category gradients and decorative warm colors (#15) (5aea84d)
  • healthkit: remove unnecessary HealthKit access and background delivery keys (c5f258e)
  • position Start Workout button correctly in tab bar (2e4647e)
  • preview: update theme in preview from forest to defaultTheme (0f548e3)
  • project: update iOS deployment target from 26.0 to 17.0 (c47acb2)
  • skip HealthKit for demo workouts to prevent polluting user health data (adda14e)
  • ui: change heatmap range default from month to year in WorkoutHomeView and ensure scrolling behavior (75554f2)
  • watch-app: correct formatting and structure in Info.plist (a3f04b6)
  • workout: clean up timer logic and ensure proper invalidation (1f63c9f)

This PR was generated with Release Please. See documentation.

johnnyhuyand others added 16 commits December 7, 2025 01:20
…e features
Co-authored-by: johnnyhuy <27847622+johnnyhuy@users.noreply.github.com>
Co-authored-by: johnnyhuy <27847622+johnnyhuy@users.noreply.github.com>
…g main app entry, content view, and project configuration
feat(docs): add CONTRIBUTING.md for development setup and guidelines
chore(docs): remove outdated iOS README and update links in main README
chore(docs): create new documentation for running the app and troubleshooting
chore(docs): enhance API and usage examples with additional details
chore(mise): update build commands to streamline project generation and building
…r-betterfit
Implement BetterFit iOS strength training coach core framework
@github-actions
github-actionsBotforce-pushed the release-please--branches--main branch from 6fc32c7 to 9023db0CompareDecember 24, 2025 15:48
@github-actions
github-actionsBotforce-pushed the release-please--branches--main branch from 9023db0 to 1dd2356CompareDecember 26, 2025 14:35
- TabNavigationUITests: verify all 4 tabs accessible, Start Workout button
visible and positioned correctly on each tab, transition to active workout state
- ProfileJourneyUITests: cover Profile header, Health Overview, Weekly Targets,
Personal Records (empty state + View All sheet), Achievements, Yearly Wrapped
- Add UI interruption monitor to handle system permission dialogs in tests
@github-actions
github-actionsBotforce-pushed the release-please--branches--main branch from 7b7b0e1 to f671423CompareMay 11, 2026 12:31
@github-actions
github-actionsBotforce-pushed the release-please--branches--main branch from f671423 to 17915beCompareMay 17, 2026 02:06
* feat: add animations across the app
- AnimatedCounter: count-up animation on appear for weekly goals and PR values in Profile (0→target over 0.8-1.0s)
- FitnessIcon: gentle pulse scale animation (1.0→1.1) on fitness/exercise icons throughout the app
- StartWorkoutGlow: The Finals style shine/shimmer effect on the yellow Start Workout button
- Previous commit already fixed HealthKit demo data pollution (skip saving demo workouts to Apple Health)
- Fixed CI: move iOS-only AuthService.swift to iOS app (was breaking Ubuntu CI with ObservableObject)
- Remove iOS 26-only API usage (glassEffect) from shared preview code — fallback to shadow overlay
- Replace GlassEffectContainer with plain HStack/VStack for iOS < 26
* fix: AppConfigurationTests cString optional unwrap for Linux CI
@github-actions
github-actionsBotforce-pushed the release-please--branches--main branch from 17915be to 512c226CompareMay 18, 2026 13:33
…nce preference (#9)
- Adds AppearancePreference (system/light/dark) backed by AppStorage.
- Refactors AppTheme to expose scheme-aware tokens:
textPrimary/Secondary/Tertiary, cardBackground(for:),
cardStroke(for:), backgroundGradient(for:), accentSurface(_:for:),
shadowColor/Radius(for:).
- Resolves the Classic accent from a generic .blue to a fixed RGB so
all themes have deterministic colors.
- Adds view modifiers: bfTextPrimary/Secondary/Tertiary and bfBackground.
This is the foundation for migrating every screen to light/dark
support and consistent text contrast across the five themes.
Co-authored-by: opencode-agent <noreply@opencode.ai>
@github-actions
github-actionsBotforce-pushed the release-please--branches--main branch from 512c226 to 96e6523CompareJune 21, 2026 10:33
@github-actions
github-actionsBotforce-pushed the release-please--branches--main branch from 96e6523 to d3d7ea7CompareJuly 24, 2026 08:12
* feat(iOS): add Fitbod design system and restyle screens
Introduces a token-based Design System (BFColors, BFTypography, BFSpacing,
BFButtonStyles, BFComponents) that replaces the old theme gradients
with flat dark surfaces and a Fitbod-style ember accent.
Adds AppearancePreference so users can pick System / Light / Dark, plus
a pair of new core files (AccentSurfaceOpacity, AppearancePreference) and
a default-theme storage key.
Restyles every screen to the new tokens: dark surfaces, hairline
borders, uppercase section labels, monospaced-digit stat tiles, generic
athletic outfit, no Nike, no Rogue/REP text on plates, no gradient
page backgrounds.
Fixes plan-sync on Start Workout: prefer today's plan, fall back to
the recommended workout, then mirror the started workout into the plan
so the home preview and Plan tab show the same exercises.
Wires ExerciseDetailSheet onDelete / onUpdate to the active workout
or today's plan. Adds updateActiveWorkout to BetterFit (the new
mid-session editor). Renders home rep motion from the active workout
when one is running, falling back to the plan.
Removes the unused ActiveWorkout / NumpadInputView / WorkoutExercise
DetailView files (dead code; the compact home rep card replaced them).
Tightens StaticTimelineRow layout so exercise names fit, removes the
redundant trailing category icon, and makes the row size to its
content instead of clipping at a fixed 80pt height.
* feat(watch): add WatchTheme and restyle watch screens
Adds Apps/iOS/BetterFitWatchApp/WatchTheme.swift with a token-based
palette (ember accent, near-black surfaces, plain outfit, 6 mm thick
Cinder block-style text) and applies it to WorkoutListView,
ActiveWorkoutView, NotificationsView, and ContentView. Uses
fal-style on-tab color and embeds WatchTheme as the source of truth
for the watch app's color system.
Locks large tap targets (> 44pt), keeps the existing font sizes, and
removes inline hardcoded colors. Same character across the watch app
matches the iOS app, so demos look consistent between devices.
* feat(core): expose updateActiveWorkout for mid-session edits
Adds BetterFit.updateActiveWorkout(_:) and
AutoTrackingService.updateCurrentWorkout(_:). These let the app
mutate the active workout in place (add, remove, or edit exercises)
without cancelling the session, which the iOS app's ExerciseDetailSheet
delete / update handlers and AddExerciseSheet now rely on.
The update is a no-op when no workout is active, and clamps the
exercise index back into range so the existing auto-tracking loop
can't go out of bounds.
* feat(pipeline): add exercise demo video generator
scripts/exercise-video-pipeline/ generates 5-second looping rep
videos for each exercise in the catalogue, two angles per exercise.
Pipeline:
Stage 1 (anchors) fal-ai/flux-2/flash generates a start-pose image
per exercise per camera. The prompt freezes a
CHARACTER_SCENE_BLOCK (man + outfit + studio)
and injects an equipment_block per exercise
(Rogue / REP / bar type, plate count, total
weight, real dimensions).
Stage 2 (videos) fal.ai animates one rep. Default backend is
xai/grok-imagine-video/reference-to-video for
speed; override with FAL_VIDEO_ENDPOINT to
use Veo 3.1 first-last-frame (tighter consistency
on bar / plate count, slower, pricier).
Cross-exercise character consistency: a master character reference
(_character__<angle>.jpg) is generated once and passed to every video
as the character ref. Per-exercise start-pose anchors stay unique so
the rep motion is correct, but the man + outfit + studio stay
identical.
Equipment specs:
- Iron cast plates (17.5 in / 1.3 in thick) for lighter loads
(90 to 225 lb exercises: curls, RDL, bench, OHP).
- Black rubber bumper plates (17.7 in / 2.9 in thick) for heavier
loads (270+ lb: squat, deadlift, trap bar deadlift).
- Mixed-diameter stacks for OHP, RDL, bench (45 + 25 + 10 per
side, 17.5 in then 11 in then 9 in) - exactly how a real bar
looks when a lifter loads it for working sets.
- Bar types: Rogue Ohio Power Bar (straight), Rogue ZEUS (W-shaped
EZ-curl), Rogue TB-1 (hexagonal trap bar), Rogue Monster Lite
(flat bench). No text or brand markings on plates.
Prompts: forbid 'no text, letters, numbers, or labels on the plates
or bar'. Embeds the same equipment and pose description into both the
anchor and the video prompt so the start frame and the video's first
frame match.
Caching: skip-if-exists on anchors, character refs, and videos so
re-runs only refresh the entries whose source file changed.
Generated images and videos are .gitignore'd (anchors/, videos/,
archive-*/); re-run the script to regenerate locally.
* feat(app): wire generated demo videos into exercise details
Bundles 8 short demo videos (one per exercise) into the app via
Apps/iOS/BetterFitApp/Resources/Videos/. Videos are the front45 outputs
from scripts/exercise-video-pipeline/ (barbell curl, EZ curl, back
squat, bench press, conventional deadlift, overhead press, Romanian
deadlift, trap bar deadlift).
Adds a DemoVideoPlayer component (SwiftUI + AVKit) that auto-plays
and loops the bundled video when present, or falls back to the
existing gradient placeholder. Uses AVPlayerItemDidPlayToEndTime
notification to seamlessly loop the short rep videos.
Adds a DemoVideoLibrary enum that fuzzy-matches the exercise name
against known slugs ('Standing Barbell Curl' -> 'barbell-curl',
'Back Squat' -> 'back-squat', etc.) and returns the bundled URL.
ExerciseDetailSheet now embeds the video player in place of the static
gradient. ~14.7 MB added to the binary.
* feat(app): add ActiveSessionView workout tracker
Adds a minimal set-tracker sheet that opens when the user pauses
an active workout. Lets the lifter:
- See each exercise in the workout as a card with name and 'Set N
of M' indicator
- Tap weight and reps (pre-filled from the existing target weight
and rep count on the workout model)
- Tap 'Log Set' to record the set — persists back to the
BetterFit model via updateActiveWorkout, advances the per-set
counter, and shows the set in a 'Completed sets' list with a
green checkmark
- Tap 'End' in the toolbar to complete the workout (via
completeWorkout which sets isCompleted and computes duration)
The Pause button on the floating workout controls now opens this
sheet on the first tap (and any subsequent Pause press); the
existing Resume flow resumes without opening the sheet. Same
SessionId-style data flows through BetterFit.updateActiveWorkout so
the completed sets persist into the workout record the same way the
deleted ActiveWorkout screens used to.
~280 lines, single file at
Apps/iOS/BetterFitApp/Features/ActiveWorkout/ActiveSessionView.swift
plus a small wiring change to RootTabView's pause handler.
* feat(app): add rest timer to active session sheet
Adds a sticky rest-timer bar at the top of the ActiveSessionView
sheet that auto-starts the moment a set is logged, so the lifter can
put the phone down between sets and come back when the timer is
up.
RestTimerState (struct):
- start (Date) + duration (TimeInterval), with addSeconds(15) for
the '+15s' quick-add button
- remaining(at:) clamped to zero so the progress ring and countdown
never display a negative number
- progress(at:) for the circular ring
- isFinished(at:) flips the accent color to green at zero
RestTimerBar (view):
- TimelineView(.periodic(from: .now, by: 1)) so it redraws every
second without a manual Timer — wakes on every tick, reads the
current state, returns the rendered view
- 52-pt circular progress ring, mm:ss in monospaced digits inside,
'Rest timer / Between sets' labels, '+15s' capsule, 'Skip' plain
- .move(edge: .top) transition on appear/disappear so the bar slides
in/out when a set is logged / the user taps Skip
Log Set flow:
- Update set count, persist via BetterFit.updateActiveWorkout,
increment position counter, fire UIImpactFeedbackGenerator
(light) for tactile confirmation
- Replace restTimer with a fresh RestTimerState at the configured
duration (default 90 s, state held in @State for future
per-exercise override)
Skip just nils the restTimer; the bar slides away. Next set
auto-starts a new timer. The bar's surface uses BFColors.background
Elevated so it reads as a layer over the exercise list without
pushing content down (no .frame() / .padding() layout shift).
~150 net lines.
* feat(pipeline): per-slug video endpoint override + smoke tests
Generates the curl (and any other plate-count-drifting) videos on a
tighter backend (default: Veo 3.1 first-last-frame) while the rest
of the batch stays on the cheap Grok reference-to-video default.
FAL_VIDEO_OVERRIDES="slug1:endpoint1,slug2:endpoint2"
FAL_VIDEO_OVERRIDES="" # disable overrides
Lookup rules:
- exact-prefix match against slug:endpoint pairs (longest match wins
if a slug is a prefix of another, e.g. 'bench' vs 'bench-press')
- empty / unset falls through to FAL_VIDEO_ENDPOINT
- inline ' # comment' after an entry is stripped
- unknown slugs use the default
The loop logs an 'override: <slug> -> <endpoint>' line whenever the
resolved endpoint differs from FAL_VIDEO_ENDPOINT.
scripts/exercise-video-pipeline/test_pipeline.sh covers the override
resolver, the equipment_block coverage per slug, the anti-text
directive in the assembled prompt, the 'lb total' weight declaration
that proves per-exercise specs, and the archive-*/ gitignore
hygiene. 23 assertions, runs anywhere without FAL_KEY.
mise.toml:
- 'test' now runs the pipeline smoke test before swift test
- 'pipeline:test' runs the smoke test only
- 'pipeline:regen' re-runs generate.sh (uses FAL_VIDEO_OVERRIDES /
FAL_VIDEO_ENDPOINT env)
* feat(app): add Settings sheet with units and account
Profile Me tab now opens a Settings sheet (units, notifications,
account, about). WeightUnitSetting moves into the BetterFit package
so package unit tests cover lb/kg conversion; guests keep Settings
but no Sign Out row.
Also adds the pipeline smoke test script that was documented in the
prior commit but not tracked.
* feat(iOS): sharpen workout hierarchy
Keep workout controls contextual, focus active sessions on one exercise,
and prioritize fitness discovery over settings.
Co-authored-by: opencode-agent <noreply@opencode.ai>
---------
Co-authored-by: opencode-agent <noreply@opencode.ai>
@github-actions
github-actionsBotforce-pushed the release-please--branches--main branch from d3d7ea7 to 96659b3CompareJuly 26, 2026 10:20
* fix(iOS): remove invalid UIApplicationSceneManifest blocking launch
The auto-generated scene manifest declared an empty
UISceneDelegateClassName, which prevented UIKit from installing a
scene delegate and left the app on a black launch screen on
iOS 26 simulators. Removing the manifest lets SwiftUI's
WindowGroup attach directly.
Co-authored-by: opencode-agent <noreply@opencode.ai>
* feat(design): add identity tokens and BetterFit mark mascot
The mascot was rendered with the ember product accent, which the
design system reserves for ordinary product actions. Identity
yellow is for brand moments only, so the mascot now mirrors
the BetterFit mark (three compressed ovals in identity yellow
with black features for contrast) and a new `identity` token
lives in BFColors alongside identityInk and identitySurface.
The profile header swaps its generic avatar for the new
EmberMascot, and athlete illustrations on workout cards stay
on the ember product accent (correct per the posture rule).
Co-authored-by: opencode-agent <noreply@opencode.ai>
* feat(ios): lead with next action and tighten Workout/Plan layouts
Restructure Workout home and Plan to follow the design-system
flow rule: lead with the next action or conclusion, then support
it; do not fill the screen with metrics.
Workout home:
- greeting 'Hello! Demo' -> 'Hello, Demo' (proper comma, single
voice, no debug-flag feel)
- workout overview collapses seven metrics into one
conclusion line + recovery %; the category split was an
echo of the heatmap below
- workout preview reads from the currently-displayed suggested
workout, so Target Muscles stays in sync with Up Next
- Apple Health banner collapses two icon buttons into a single
tappable card; long-press exposes Dismiss
Plan:
- page padding 16 -> 20 per spec
- empty-day state becomes a clear 'Add exercises' primary CTA
on a 16pt card instead of a dashed ghost button
- recovery row corner radius aligned to BFRadius.card
Co-authored-by: opencode-agent <noreply@opencode.ai>
---------
Co-authored-by: opencode-agent <noreply@opencode.ai>
@github-actions
github-actionsBotforce-pushed the release-please--branches--main branch from 96659b3 to 86e540bCompareJuly 27, 2026 03:06
johnnyhuyand others added 2 commits July 27, 2026 14:22
* fix(iOS): remove invalid UIApplicationSceneManifest blocking launch
The auto-generated scene manifest declared an empty
UISceneDelegateClassName, which prevented UIKit from installing a
scene delegate and left the app on a black launch screen on
iOS 26 simulators. Removing the manifest lets SwiftUI's
WindowGroup attach directly.
Co-authored-by: opencode-agent <noreply@opencode.ai>
* feat(design): add identity tokens and BetterFit mark mascot
The mascot was rendered with the ember product accent, which the
design system reserves for ordinary product actions. Identity
yellow is for brand moments only, so the mascot now mirrors
the BetterFit mark (three compressed ovals in identity yellow
with black features for contrast) and a new `identity` token
lives in BFColors alongside identityInk and identitySurface.
The profile header swaps its generic avatar for the new
EmberMascot, and athlete illustrations on workout cards stay
on the ember product accent (correct per the posture rule).
Co-authored-by: opencode-agent <noreply@opencode.ai>
* feat(ios): lead with next action and tighten Workout/Plan layouts
Restructure Workout home and Plan to follow the design-system
flow rule: lead with the next action or conclusion, then support
it; do not fill the screen with metrics.
Workout home:
- greeting 'Hello! Demo' -> 'Hello, Demo' (proper comma, single
voice, no debug-flag feel)
- workout overview collapses seven metrics into one
conclusion line + recovery %; the category split was an
echo of the heatmap below
- workout preview reads from the currently-displayed suggested
workout, so Target Muscles stays in sync with Up Next
- Apple Health banner collapses two icon buttons into a single
tappable card; long-press exposes Dismiss
Plan:
- page padding 16 -> 20 per spec
- empty-day state becomes a clear 'Add exercises' primary CTA
on a 16pt card instead of a dashed ghost button
- recovery row corner radius aligned to BFRadius.card
Co-authored-by: opencode-agent <noreply@opencode.ai>
* docs(readme): add screenshots and marketing showcase
Adds a polished README with:
- tagline and identity copy
- retina (@2x) iOS screenshots in a comparison grid
- 'why BetterFit' principles aligned to the design system
- feature overview table
- install, run, and docs links
Co-authored-by: opencode-agent <noreply@opencode.ai>
---------
Co-authored-by: opencode-agent <noreply@opencode.ai>
…lors (#15)
* fix(iOS): remove invalid UIApplicationSceneManifest blocking launch
The auto-generated scene manifest declared an empty
UISceneDelegateClassName, which prevented UIKit from installing a
scene delegate and left the app on a black launch screen on
iOS 26 simulators. Removing the manifest lets SwiftUI's
WindowGroup attach directly.
Co-authored-by: opencode-agent <noreply@opencode.ai>
* feat(design): add identity tokens and BetterFit mark mascot
The mascot was rendered with the ember product accent, which the
design system reserves for ordinary product actions. Identity
yellow is for brand moments only, so the mascot now mirrors
the BetterFit mark (three compressed ovals in identity yellow
with black features for contrast) and a new `identity` token
lives in BFColors alongside identityInk and identitySurface.
The profile header swaps its generic avatar for the new
EmberMascot, and athlete illustrations on workout cards stay
on the ember product accent (correct per the posture rule).
Co-authored-by: opencode-agent <noreply@opencode.ai>
* feat(ios): lead with next action and tighten Workout/Plan layouts
Restructure Workout home and Plan to follow the design-system
flow rule: lead with the next action or conclusion, then support
it; do not fill the screen with metrics.
Workout home:
- greeting 'Hello! Demo' -> 'Hello, Demo' (proper comma, single
voice, no debug-flag feel)
- workout overview collapses seven metrics into one
conclusion line + recovery %; the category split was an
echo of the heatmap below
- workout preview reads from the currently-displayed suggested
workout, so Target Muscles stays in sync with Up Next
- Apple Health banner collapses two icon buttons into a single
tappable card; long-press exposes Dismiss
Plan:
- page padding 16 -> 20 per spec
- empty-day state becomes a clear 'Add exercises' primary CTA
on a 16pt card instead of a dashed ghost button
- recovery row corner radius aligned to BFRadius.card
Co-authored-by: opencode-agent <noreply@opencode.ai>
* docs(readme): add screenshots and marketing showcase
Adds a polished README with:
- tagline and identity copy
- retina (@2x) iOS screenshots in a comparison grid
- 'why BetterFit' principles aligned to the design system
- feature overview table
- install, run, and docs links
Co-authored-by: opencode-agent <noreply@opencode.ai>
* fix(design): drop cyberpunk category gradients and decorative warm colors
The exercise timeline previews used per-category gradient pairs
(blue/cyan, purple/pink, red/orange, green/teal) that don't
exist in the design system and read as a neon-fitness aesthetic.
Both StaticTimelineRow and UnifiedExerciseTimeline now use a
single tinted ember surface with SF Symbol differentiation, so
exercise categories stay visually distinct without inventing
colors that fight the recovery palette.
ProfileView health stats were using .red, .orange, .blue, .purple
arbitrarily. Re-aligned:
- BMI 'Normal' -> success (green, semantic for healthy range)
- Strength Score 'Advanced' -> brandAccent (ember, positive tier)
- Resting HR -> text secondary (was red, now neutral; HR isn't
a status signal)
- Active Cal 'Today' -> brandAccent (active state)
- Real-stats icons (Total Workouts / Total Volume / Time Active)
-> brandAccent instead of mixed orange/blue/purple
Consequences: better visual coherence with the design system.
Recovers, destructive actions, and the streak indicator are
unchanged; ember and red still appear in their semantic roles
(action and recovery: sore / destructive).
Co-authored-by: opencode-agent <noreply@opencode.ai>
---------
Co-authored-by: opencode-agent <noreply@opencode.ai>
@github-actions
github-actionsBotforce-pushed the release-please--branches--main branch from 86e540b to 02ca7b9CompareJuly 27, 2026 04:46
The AthleteIllustration drew a single-stroke stick figure with a
red bar through it for the push pose. That read as clip art and
fights the design system's rule that illustration must use heavy
geometric forms with the same high-contrast confidence as the
mark.
AthleteIllustration now renders three compressed white ovals on
an ember-tinted surface -- the same three-oval form BetterFit's
brand mark uses for plates/repetition/momentum -- with a small
SF Symbol (arrow.up / arrow.down / figure.walk / heart.fill)
offset to the bottom as a category hint.
Removed: gradientColors, segments(), point(), drawAthlete(),
categoryColor. The new visual has no pose-dependent coordinates;
the pose only selects the SF Symbol.
Card hero space on PlayingCardWorkoutCard grows from 100x140 to
140x140 so the new mark has room to breathe.
Co-authored-by: opencode-agent <noreply@opencode.ai>
@github-actions
github-actionsBotforce-pushed the release-please--branches--main branch from 02ca7b9 to e7cc6d4CompareJuly 27, 2026 04:59
johnnyhuyand others added 4 commits July 27, 2026 16:41
* fix(art): replace stick-figure athlete with the BetterFit mark
The AthleteIllustration drew a single-stroke stick figure with a
red bar through it for the push pose. That read as clip art and
fights the design system's rule that illustration must use heavy
geometric forms with the same high-contrast confidence as the
mark.
AthleteIllustration now renders three compressed white ovals on
an ember-tinted surface -- the same three-oval form BetterFit's
brand mark uses for plates/repetition/momentum -- with a small
SF Symbol (arrow.up / arrow.down / figure.walk / heart.fill)
offset to the bottom as a category hint.
Removed: gradientColors, segments(), point(), drawAthlete(),
categoryColor. The new visual has no pose-dependent coordinates;
the pose only selects the SF Symbol.
Card hero space on PlayingCardWorkoutCard grows from 100x140 to
140x140 so the new mark has room to breathe.
Co-authored-by: opencode-agent <noreply@opencode.ai>
* docs(readme): retake screenshots and adopt Block/buzz layout
Block/buzz uses full-width hero + stacked captioned screenshots.
Mirrors that here:
- Move assets to docs/assets/screenshots/ (buzz convention)
- Rename to topic-based PNGs (workout-home, plan-week,
profile-health) instead of type-prefixed ones (ios-*)
- Single hero screenshot at the top with a one-line italic caption
- New 'A look inside' section with two stacked screenshots, each
linked and captioned in bold + soft followup
- Drop the 3-up table; the per-screen shots now have room to read
- Tighten the lead paragraph so the tagline does the talking
- Trim the feature list into a sentence-led section
- Compress the install + dev workflow into one block
Screenshots retaken on iPhone 16 / iOS 26.2 against the current
main demo state, retried after the mark / color alignment work
so they show the actual product state.
Co-authored-by: opencode-agent <noreply@opencode.ai>
---------
Co-authored-by: opencode-agent <noreply@opencode.ai>
…rid (#18)
Per the user feedback that the previous README stacked three
portrait-phone shots at native resolution, the screenshots
flew past the column width and ran the page very tall.
This change:
- Hero: width=320, centered with a single-line caption
- 'A look inside': HTML table with two cells, each width=50%,
screenshots at width=280, captions inline beneath each
- Caps the look-inside section at the height of one phone
screenshot (~450pt on retina) instead of three stacked
- Tighter captions under each shot
No source changes.
Co-authored-by: opencode-agent <noreply@opencode.ai>
* docs(readme): add branded hero
Carry the yellow and black identity into GitHub while keeping product screenshots compact and dark.
Co-authored-by: opencode-agent <noreply@opencode.ai>
* docs(readme): improve mobile layout
Co-authored-by: opencode-agent <noreply@opencode.ai>
* docs(readme): refresh hero asset
Avoid GitHub's cached first revision and keep banner copy readable at narrow widths.
Co-authored-by: opencode-agent <noreply@opencode.ai>
---------
Co-authored-by: opencode-agent <noreply@opencode.ai>
Separate brand marks, profile identity, workout movement, and anatomy so each visual has one clear role. Recovery regions now map directly to independently colorable vector shapes.
Co-authored-by: opencode-agent <noreply@opencode.ai>
@github-actions
github-actionsBotforce-pushed the release-please--branches--main branch from e7cc6d4 to d60b7daCompareJuly 27, 2026 08:25
johnnyhuyand others added 2 commits July 30, 2026 23:16
* fix(ci): remove platform-dependent build failures
Keep video pipeline functions sourceable on clean Linux runners and build iOS against a generic simulator destination when no device execution is required.
Co-authored-by: opencode-agent <noreply@opencode.ai>
* fix(core): preserve history during startup
Merge persisted workouts with in-memory completions and synchronize history access so asynchronous initialization cannot discard newly completed workouts.
Co-authored-by: opencode-agent <noreply@opencode.ai>
---------
Co-authored-by: opencode-agent <noreply@opencode.ai>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@johnnyhuy