← Back to Docs

Gym Vibes Changelog

Version 0.9.1

This release is made for iPhone Duo. Unfold it mid-workout and the workout opens as two pages: your exercises on the left and the one you’re logging on the right, meeting on the crease. Fold it mid-set and the same exercise is waiting on the outer display, where the tabs now sit in the tray under your right thumb. iPad, the Mac app and the web app get the two-page workout too when the window is wide enough, and keep the tabs along the bottom. Phones are unchanged. See iPhone Duo and Large Screens.

  • b16c41f - docs(store): describe the iPhone Duo and large-screen layouts (2026-10-24)
  • 77205e5 - feat(layout): the inner display’s rail moves to the right edge (2026-10-24)
  • b8a023e - feat(layout): tabs in the outer display’s tray; phones stay as they are (2026-10-24)
  • 03b38a1 - feat(layout): side tabs on the Duo’s outer display too (2026-10-24)
  • 3e0ba2b - feat(layout): two-page workout and side tabs for an unfolded iPhone Duo (2026-10-24)

Version 0.9.0

This release teaches Gym Vibes what each exercise is loaded with. The Weight Calculator has a view for barbells, EZ bars, plate-loaded machines, landmines, dumbbells, kettlebells, weight stacks and dip belts, and new sets start from your past sessions set by set, at a weight you can actually load. Exercise search knows the names lifters use (RDL, pec deck, skull crusher) and works offline. Logging a set responds the moment you tap it. Training partners keep the sets they’ve logged when the host changes theirs. Monthly supporter badges now follow live subscription status.

  • 92cba3a - chore(release): add a read-only check that 0.9.0 landed on production (2026-10-21)
  • 763e5c6 - chore(release): bump version to 0.9.0 (build 21) (2026-10-21)
  • a730fd4 - fix(play): count renewals that were missed while notifications failed (2026-10-20)
  • 121ac9c - fix(support): show Google Play’s subscription terms on Android (2026-10-20)
  • 6b74b95 - feat(catalog): add the three kettlebell exercises free-exercise-db gained (2026-10-20)
  • 6827c19 - feat(catalog): a tool that turns free-exercise-db updates into safe migrations (2026-10-20)
  • 0898456 - feat(exercises): give the assisted machines the band and dip images and steps (2026-10-20)
  • 0943902 - feat(exercises): add the assisted pull-up and dip machines as single stacks (2026-10-20)
  • c0c7133 - fix(multiplayer): keep a guest’s sets steady while a ping’s reload loads (2026-10-20)
  • 9f19d46 - feat(sets): start each set from that set in past sessions, latest first (2026-10-19)
  • d33c9b5 - feat(sets): start new sets at a weight the equipment can be loaded to (2026-10-18)
  • 9a5ae29 - fix(logging): log a set the moment it is tapped (2026-10-18)
  • 83c88ab - fix(cache): apply cache updates to one key in order (2026-10-18)
  • 83eb6ac - feat(search): rank ADD EXERCISE on the device from names and aliases (2026-10-18)
  • 80eeffd - feat(calculator): name plate chips by the plate, adding one per side (2026-10-18)
  • 3c8872d - feat(calculator): quick-add chips for dumbbells and kettlebells (2026-10-18)
  • 9b4643e - feat(exercises): find Rack Pulls as rack pull deadlift and block pull (2026-10-18)
  • 883ff09 - feat(calculator): an Insert button; closing leaves the set alone (2026-10-18)
  • a048f9d - fix(calculator): drop the bodyweight view’s dip belt heading (2026-10-18)
  • af1f0a8 - feat(calculator): horns, upright sleeves, plate piles and a truer kettlebell (2026-10-18)
  • 7b7d61d - chore(release): bump version to 0.8.6 (build 20) (2026-10-18)
  • 7dbf389 - feat(calculator): a view for each equipment type (2026-10-18)
  • acef04e - fix(db): correct equipment types and aliases after a full review (2026-10-17)
  • 329a5e0 - fix(db): class the seated calf raise as a single stack (2026-10-17)
  • 1a20f46 - fix(db): date the equipment migration after #110’s (2026-10-17)
  • fa62656 - fix(multiplayer): reload on resume only when the session changed (2026-10-17)
  • d8519b8 - fix(db): date the equipment migration after #108’s (2026-10-17)
  • d504e67 - fix(multiplayer): reconnect session sync when the app comes back (2026-10-17)
  • 174ca4a - feat(exercises): equipment types, a calculator for each, and alternative names (2026-10-17)
  • 985e919 - test(ui): cover the lime toasts on the template and metrics screens (2026-10-17)
  • 746e986 - fix(multiplayer): following the host leaves logged sets alone (2026-10-17)
  • 35f5eae - fix(ui): stop the lime success toasts rendering white text (2026-10-17)
  • 3d4f61f - fix(stripe): don’t count a subscription’s checkout invoice twice (2026-10-16)
  • f584e8a - feat(donations): subtract refunded payments (2026-10-14)
  • e8c8341 - feat(donations): count every paid subscription period (2026-10-13)
  • eed8794 - feat(iap): send the user’s id with store purchases (2026-10-02)
  • 2a253cf - feat(functions): receive the stores’ subscription notifications (2026-10-02)
  • 9e69180 - feat(db): MONTHLY means subscribed right now (2026-10-02)

Version 0.8.0

This release adds Multiplayer Workouts. The Multiplayer Workouts guide shows how to host and join a session.

  • 205347c - ci(coverage): a Codecov outage no longer fails the test jobs (2026-10-05)
  • 1149f0b - chore(flutter): pin Flutter 3.44.9 so the Mac app builds with Xcode 27 (2026-10-05)
  • ca3a2d2 - fix(macos): target macOS 12.0 so the Mac app builds with Xcode 27 (2026-10-05)
  • fd78910 - fix(multiplayer): invites open where you are and close when answered (2026-10-01)
  • 9e90a1e - fix(verification): put the release probe’s get_public_profiles FROM back (2026-10-02)
  • 72c15b7 - feat(multiplayer): a MONTHLY badge for subscribers, SUPPORTER for the rest (2026-09-30)
  • ccd9d80 - feat(multiplayer): show a supporter badge to the people you train with (2026-09-30)
  • 4da435d - fix(db): a self-written linked_session_id no longer buys a roster row (2026-09-30)
  • c56b12a - chore(release): add a read-only check that 0.8.0 landed on production (2026-09-30)
  • c5e1cb5 - chore(release): bump version to 0.8.0 (build 13) (2026-09-30)
  • 56e2c73 - fix(workouts): send “Log all” through the offline queue (2026-09-30)
  • bb5ae23 - test(timer): update dev’s new screen tests for WorkoutTimerService (2026-09-28)
  • 0d28074 - test(coverage): leave the web-only line of hasCachedQuery out of coverage (2026-09-28)
  • 2b64c0c - fix(catalog): download the whole exercise catalog, and only when it changes (2026-09-25)
  • 59d7a01 - refactor(live-activity): rename RestTimerService to WorkoutTimerService (2026-09-26)
  • c338335 - fix(logging): “Previous” shows only your own finished sessions (P6) (2026-09-25)
  • 735fa70 - test(logging): widget tests for the active workout and logging screens (2026-09-25)
  • 6496b60 - fix(auth): let a user back out of a password reset (P6) (2026-09-25)
  • f3fddba - fix(live-activity): only the workout that owns the timer can end it (P6) (2026-09-25)
  • c336868 - fix(db): let the multiplayer migration run on dev, where its policies exist (2026-09-20)
  • 44eac0f - fix(multiplayer): handle a join link inside the shell it opens (2026-09-20)
  • 364aebb - fix(multiplayer): tell the guests when the session ends, and repaint when it does (2026-09-20)
  • 47bc592 - test(multiplayer): cover what happens when the server says no (2026-09-20)
  • d46a116 - test(multiplayer): pull the logic worth testing out of the screens (2026-09-20)
  • b7dc33e - test(multiplayer): cover the feature, and fix two bugs the tests found (2026-09-20)
  • 486766b - feat(android): verify app links against the Play signing certificates (2026-09-20)
  • 4fc4635 - feat(multiplayer): make the QR codes https links the app can claim (2026-09-20)
  • 630bdc5 - feat(multiplayer): make a scanned profile code do something, and list the feature (2026-09-19)
  • 59917bf - feat(multiplayer): say what an invite is for, and let the sender take it back (2026-09-19)
  • 0c95ba6 - feat(multiplayer): say which sets are yours, and let you follow the host again (2026-09-19)
  • dc62653 - feat(multiplayer): leaving, ending, and saying who the host is (2026-09-19)
  • 0e7d1e0 - feat(multiplayer): carry a scanned link through sign-in, and hide what cannot work (2026-09-19)
  • dc0205f - feat(multiplayer): send the sync ping from the database, on a private topic (2026-09-19)
  • 529b918 - fix(multiplayer): every session ping was failing silently (2026-09-19)
  • b6381e4 - test(multiplayer): a two-account session test, and the fixture behind it (2026-09-19)
  • e82524a - fix(multiplayer): stop the sync reload fighting the user, and resubscribing (2026-09-19)
  • a406f7e - fix(multiplayer): share one realtime channel per session, and stop the offline break (2026-09-19)
  • 25fad6c - chore(seeds): drop the exercise chunk files and the splitter that made them (2026-09-19)
  • 4fe687c - docs: correct the PR #21 rule, which now describes work that is done (2026-09-19)
  • bfa5bf7 - fix(repo): stop shipping a production project link, and guard the seeds (2026-09-19)
  • 9069437 - fix(db): make the multiplayer probe assert with RLS off, and record the run (2026-09-19)
  • 065a16e - test(db): verification probe for the multiplayer migration (2026-09-19)
  • 8f9de7a - feat(db): one multiplayer migration, with server-owned session membership (2026-09-19)
  • bfe250c - fix(router): stop the profile QR route swallowing /profile/donations and /profile/edit (2026-09-16)
  • 2ee04f0 - fix(multiplayer): read other users’ profiles through the scoped RPCs (M2) (2026-09-16)
  • b0ce4e2 - chore(ios): adopt the UIScene lifecycle (2026-09-16)
  • 5db40b8 - chore(deploy): remove the stale DigitalOcean app spec (2026-09-16)
  • 50f7b85 - feat(db): purge expired deletion requests daily (2026-09-16)
  • 68037c7 - chore(ios,macos): declare that the app uses only exempt encryption (2026-09-16)
  • eddd561 - docs: add CLAUDE.md for agents working in this repo (2026-09-16)
  • a05c19d - fix(multiplayer): add database indexes, session trigger scoping, and client error handling hardening (2026-09-07)
  • 4579540 - fix(multiplayer): audit hardening, lifecycle cleanup, and realtime robustness (2026-09-07)
  • 11ce154 - fix(multiplayer): tie sessions to active workout, ensure deterministic set order, decouple set completion, and harden sync (2026-09-06)
  • c9a7b24 - chore: remove scratch scripts (2026-08-30)
  • f850712 - fix: remove pg_trigger_depth guard that blocked soft deletes from fanning out to guests (2026-08-30)
  • 555e2d3 - fix: reload ActiveWorkoutScreen after MultiplayerLinkSheet closes to initialize the sync channel on the host side (2026-08-30)
  • 7e17b15 - fix: resolve crash when inserting workout sets and ensure cardio fields trigger updates (2026-08-30)
  • 83c26fd - fix: resolve crash in workout_exercises insert trigger and add missing update trigger for supersets (2026-08-30)
  • c3e5d07 - fix: inject missing sync broadcast listener into ActiveWorkoutScreen (2026-08-30)
  • ecaf3a7 - fix: inject missing sync broadcasts into ActiveWorkoutScreen structural mutations (add exercise, delete, link superset) (2026-08-30)
  • c7b9ce7 - fix: resolve blank black avatars in SessionAvatarBubbles by handling empty strings in avatar_url (2026-08-30)
  • 3594d71 - fix: inject missing sync broadcasts into ExerciseLoggingScreen mutations (2026-08-30)
  • e9f0106 - fix: remove non-existent status column reference in accept_workout_invite RPC (2026-08-30)
  • 4598199 - fix: make invite notification toast neon green and revert error toast color (2026-08-30)
  • 5894f69 - fix: resolve updated_at missing column error in invite RPC and set error toast to neon green (2026-08-30)
  • e160fe4 - fix: update global SnackBarTheme to match dark mode UI (2026-08-30)
  • b455477 - fix: resolve crash in accept_workout_invite due to incorrect column name (2026-08-30)
  • c26f889 - fix: preserve created_at when cloning sets to ensure deterministic sort order in guest UI (2026-08-30)
  • 8ed51e1 - fix: replace blocked Postgres WAL realtime subscriptions with Supabase Broadcast channels for multiplayer sync (2026-08-30)
  • 88dd3f1 - fix: resolve missing usernames in invite toast notification (2026-08-30)
  • a71ac0a - fix: resolve infinite recursion in workouts RLS policy (2026-08-30)
  • c68a2b6 - feat: show all multiplayer users in top right with tap-to-view list (2026-08-30)
  • 02d64a0 - feat: complete end-to-end multiplayer syncing for inserts, deletes, and exercises (2026-08-30)
  • d3fa095 - fix: patch host_id to host_profile_id in multiplayer RPCs (2026-08-30)
  • 098cf83 - fix: update invite list UI styling and fix routing upon accepting an invite (2026-08-30)
  • a20b026 - fix: correct typo in router path navigation from /workout to /workouts (2026-08-30)
  • a6354c1 - fix: add ‘app’ host to gymvibes deep links so GoRouter receives the correct path (2026-08-30)
  • b9cf7bc - fix: revert qr to custom scheme and add native deep link routes (2026-08-30)
  • 499a7f9 - feat: implement dual flow for scan to invite and scan to join (2026-08-29)
  • f76fd9d - feat: listen for background sync updates on active workout screen (2026-08-29)
  • 7f18553 - fix: center profile card content in stack (2026-08-25)
  • 75ec100 - feat: make profile card clickable to show qr code and move icon (2026-08-25)
  • b6343d3 - fix: handle stream errors in invite notification bell to prevent crashes (2026-08-25)
  • 6aa5131 - feat: theme multiplayer sheet, add deep links to qr codes, and add standalone profile qr code view (2026-08-24)
  • ebddc5d - feat: show toast notification for new multiplayer invites and add bell to active workout screen (2026-08-24)
  • 0082659 - fix: add missing rls policies to workout_session_invites (2026-08-24)
  • 9a8226f - fix: handle duplicate invites gracefully and prevent self-invite (2026-08-24)
  • 4fd4621 - fix: make profiles searchable via rls and prevent scanner rapid loop (2026-08-24)
  • d1c52dd - chore: add 5 planned workouts with exercises to all test accounts (2026-08-24)
  • 1ebecc1 - feat: add avatar bubbles and session link syncing to active workout (2026-08-24)
  • a608057 - fix: remove generated confirmed_at column from seed script (2026-08-24)
  • c6f096a - chore: add lifter, cardio, beast, and coach test users and seed workouts (2026-08-24)
  • 626d3eb - feat: add multiplayer invite inbox and realtime notification bell (2026-08-24)
  • 4dc620b - feat: add multiplayer UI for generating and scanning QR invites (2026-08-24)
  • 55786d4 - chore: add qr_flutter and mobile_scanner packages (2026-08-23)
  • f2a47ce - feat: add schema and triggers for multiplayer workout sessions (2026-08-23)

Version 0.7.0

  • c2b42c4 - chore(release): bump version to 0.7.0 (build 12) (2026-09-16)
  • fc4643c - fix(templates): keep supersets and cardio numbers when saving and importing (2026-09-16)
  • 5cbc360 - test: capture the feature screenshots on iPhone, iPad, Android and macOS (2026-09-16)
  • 8fff9b0 - test: on-device tests for the core flows, with a runner and a guide (P5.2, P5.3) (2026-09-15)
  • 0684935 - test: cover the repository, queue drain and logging widgets (P5.1, P5.2) (2026-09-15)
  • 4098abc - ci: report coverage through Codecov checks instead of a PR comment (P5.1) (2026-09-15)
  • 68ca90c - ci: fail on analyzer infos, and catch shadowed top-level variables (P5.4) (2026-09-15)
  • 4a0b8b5 - fix(repository): drop ‘dummy_cache_key’, stop swallowing template errors (P5.6) (2026-09-15)
  • 06f68f8 - refactor: remove test-only branches from production code (P5.5) (2026-09-15)
  • ae2d336 - build: pin Flutter in one place, and build the web app with it (P5.4) (2026-09-15)
  • 1b0a004 - docs(store): add cardio, drag-to-reorder and ad-free to both listings (2026-09-15)
  • df1ae83 - fix(functions): read the embedding webhook secret from Vault (P0.3) (2026-09-14)
  • 94dce25 - docs(store): describe features the app actually has (2026-09-14)
  • 4898ae7 - feat(web): keep stage.app.gymvibes.xyz out of search and analytics (2026-09-14)
  • 59f213f - fix(db): close API access to trigger functions, pin match_exercises search_path (2026-09-14)
  • 6a02d21 - docs(privacy): draft the App Store privacy label, declare birth date and gender (2026-09-13)
  • 7b2a61c - fix(profile): stop the imperial/metric toggle overflowing on narrow iPhones (2026-09-13)
  • 58875a6 - chore(release): current store metadata version, drop the unused Google plist (P4.9) (2026-09-13)
  • 71b90c3 - feat(ios): add privacy manifests for the app and the widget (P4.2) (2026-09-13)
  • f7eab6a - feat(iap): add Restore Purchases (P4.1) (2026-09-13)
  • b37a61c - fix(iap): tell users what happened to a purchase, and finish every transaction (P4.5) (2026-09-13)
  • b20a3a3 - fix(ios): justify the camera prompt and drop the unused microphone prompt (P4.4) (2026-09-13)
  • a1a5b2f - fix(ios): let the Live Activity widget run on iOS 16.6+ (P4.3) (2026-09-13)
  • 424c9c3 - fix(android): declare INTERNET and drop unused FCM from the release manifest (P4.8) (2026-09-13)
  • 6a95253 - fix(offline): let the local database survive an older build (P5.6) (2026-09-13)
  • c77dd0f - build(web): let a release web build target the dev Supabase project (2026-09-13)
  • 44c5674 - build(supabase): declare edge functions so the integration deploys them (2026-09-12)
  • 20caf44 - feat(donations): record store purchases again, priced by the server (P0.2 revised) (2026-09-12)
  • a48b6c5 - style(email): keep each doc comment above the function it describes (2026-09-12)
  • 1c21c6c - feat(email): optional recipient allowlist for non-production projects (2026-09-12)
  • 22c1a96 - fix(gdpr): let only the database decide who gets a deletion email (P5.7) (2026-09-12)
  • 9f3baeb - fix(gdpr): stop callers choosing deletion tokens (P5.7, critical) (2026-09-12)
  • f990680 - fix(gdpr): make account deletion delete the account and its files (P5.7) (2026-09-12)
  • 3829ab3 - fix(backend): call this project’s edge functions, not production’s (M8) (2026-09-12)
  • dc03f7d - fix(lifecycle): guard setState after await, and persist superset cleanup when unmounted (P3.12) (2026-09-12)
  • 26f913c - fix(startup): make a failed backend start reach the error screen (P3.13) (2026-09-12)
  • 69dcde1 - fix(sets): resolve sets by id after every await, not by captured index (P3.8) (2026-09-12)
  • 4d824f6 - fix(lifecycle): release controllers, timers and subscriptions on dispose (P3.11) (2026-09-12)
  • b7cc884 - fix(plates): apply the plate calculator outside dispose, and only on change (P3.6) (2026-09-12)
  • 1cbee6a - fix(input): never write a cleared, comma or overflowing value (P3.9, P3.10) (2026-09-12)
  • 233c985 - refactor(search): extract ADD EXERCISE sheet into a StatefulWidget (P2.3, P3.5) (2026-09-12)
  • 4fa65ac - test: use a null-aware map element in user_scope_purge_test (lint) (2026-09-12)
  • 53218f2 - fix(cache): one canonical shape for workout exercise details (P2.3, P3.2, P3.3) (2026-09-12)
  • 1f1e6e3 - refactor(supersets): extract pure superset domain; fix P3.1 and P3.4 (P2.3) (2026-09-12)
  • bc162f3 - refactor: delete orphaned libraries and guard against recurrence (P2.1, P2.2) (2026-09-12)
  • fb0c509 - fix(sync): never bind a null whereArg, and drain once the user is known (P1.4) (2026-09-12)
  • 518cc1e - fix(auth): purge local data on sign-out and scope it per user (P1.4) (2026-09-12)
  • 9e25049 - fix(time): write UTC to TIMESTAMPTZ columns, and gate it in CI (P1.3) (2026-09-12)
  • 9e40da5 - fix(sync): stop discarding offline writes and unwedge the queue (P1.1, P1.2) (2026-09-12)
  • 2d5ca5f - test(stripe-webhook): cover signature verification (P0.4) (2026-09-12)
  • d169c6a - fix(donations): close tier self-grant and verify Stripe signatures (P0.2, P0.4) (2026-09-12)
  • 0e3f656 - fix(db): pin search_path on all SECURITY DEFINER functions (P0.5) (2026-09-12)
  • 726b32c - fix(rls): replace blanket profile-search policy with scoped RPCs (M2) (2026-09-12)
  • e265b24 - fix(rls): scope profile sub-table reads to the owning user (P0.1) (2026-09-12)
  • 6b5b47a - ci: pin Flutter version so CI matches local development (2026-09-12)
  • d6c4613 - chore(deps): upgrade dependencies within existing constraints (2026-09-12)
  • 5a6a0e1 - fix(widget): sync Generated.xcconfig build versioning with GymVibesWidgetExtension Info.plist (2026-09-10)

Version 0.6.5

  • 65ff845 - Fix Live Activity timer countdown and timezone sync issues (2026-09-10)

Version 0.6.4

  • 70d11ed - feat(storekit): add local StoreKit configuration for offline IAP testing and improve StoreKit 2 transaction handling (2026-09-09)
  • 24b1eb1 - feat(iap): support consumable tips on iOS with platform-aware IDs and bump version to 0.6.4+9 (2026-09-09)
  • 57bd8ca - fix(branding): ensure iPad login screenshots fully render canvas with Sign in with Apple (2026-09-07)
  • a9e3ca7 - chore(branding): add 6.5-inch phone and iPad App Store screenshot sizes for login screen (2026-09-07)
  • 0482f45 - chore(branding): update iOS and Mac login screenshots for App Store with Sign in with Apple (2026-09-07)

Version 0.6.3

  • 5fe015e - chore: bump version to 0.6.3+8 and sync widget extension versioning (2026-09-07)
  • cc3f799 - fix(ui): hide Apple login on web and optimize login layout for macOS startup size (2026-09-07)
  • 9f86cc6 - feat(auth): implement Sign in with Apple and remove unused macOS camera entitlement (2026-09-07)
  • 8654a90 - fix(live-activity): prevent stopwatch from running past workout completion (2026-09-07)

Version 0.6.2

  • 8ae31ed - chore: bump version to 0.6.2+7 (2026-09-04)

Version 0.6.1

  • 7bc5560 - chore: bump build to 6, replace donation wording, add subscription disclaimer (2026-09-04)
  • 64ea444 - chore: fix app store metadata, bundle ids, and add EULA links for review (2026-09-04)
  • 6a58257 - fix: cancel live activities when finishing a workout (2026-08-24)
  • 011e7e6 - chore: bump version to 0.6.1 (2026-08-23)
  • c3c8bd1 - fix: resolve TypeError crash when unlinking superset items (2026-08-23)
  • 2887618 - fix: prevent superset tabs from rebuilding on swipe (2026-08-23)

Version 0.6.0

  • 996db5e - chore: bump version to 0.6.0 (2026-08-23)
  • 64ca1b3 - feat: update plate calculator with new bar weights and fix visualizer condition (2026-08-23)
  • e9c24a3 - fix: forcefully terminate all dangling Live Activities on workout completion (2026-08-21)
  • 5c5d254 - fix: ensure plate calculator resets readOnly keyboard lock when dismissed (2026-08-21)
  • 446e7c3 - feat: plate calculator improvements (greedy algo, quick add, robust readOnly keyboard lock) (2026-08-20)
  • 406cc2e - Fix checkbox layout and plate calculator (2026-08-20)

Version 0.5.1

  • 2ebe319 - chore: bump version to 0.5.1 (2026-08-20)
  • 815d0ee - fix: make soft_delete_trigger SECURITY DEFINER so it can bypass restrictive RLS policies (2026-08-19)

Version 0.5.0

  • d6786d0 - fix: remove -1 adjustment for reordering supersets (2026-08-18)
  • 6cf7f3b - fix: fully restore Live Activities timer integration and variables (2026-08-18)
  • 38bdaba - feat: implement superset swiping, updated_at defaults, and DB soft deletes (2026-08-18)
  • ab3d1e2 - fix: dynamically update Live Activity start time when switching active workouts, and auto-confirm local test users (2026-08-08)
  • 75eff5e - chore: remove boilerplate static widgets from iOS Widget Extension (2026-08-08)

Version 0.4.4

  • 6337c40 - feat: complete iOS Live Activity stopwatch and widget layout - Added Gym Vibes logo to Dynamic Island and lock screen Live Activity - Replaced created_at timestamp with started_at to accurately reflect workout elapsed time - Prevented stopwatch from capping at exactly 24:00:00 for older workouts - Prevented planned workouts from inadvertently hijacking the Live Activity timer from an actively running session - Ensured Live Activity terminates correctly when a workout is completed (2026-08-08)
  • 8b7cb4b - feat: inject premium Gym Vibes UI into SwiftUI Widget Extension (2026-08-07)
  • dced2c1 - feat: extract Rest Timer to singleton and wire it up to set completion (2026-08-07)
  • 6d848cd - feat: setup Rest Timer state and live_activities plugin integration (2026-08-07)
  • fa5b9c3 - fix: ReorderableListView sorting double-offset bug and add drag padding (2026-08-07)
  • 0dc2567 - refactor(ui): extract ActiveWorkoutScreen state and logic into Provider ViewModel (2026-08-05)
  • 51f8984 - refactor: abstract data fetching into Profile, Reference, and Workout repositories (2026-08-04)
  • e1e0ece - fix: ReorderableListView crash and async testing flakiness (2026-08-03)
  • aa642f2 - refactor: componentize exercise logging screen to resolve god object anti-pattern (2026-08-01)
  • 714d08b - refactor: componentize active workout god screen into smaller reusable widgets (2026-08-01)
  • 9680979 - ci: add pull-requests write permissions for coverage reporter (2026-07-31)
  • 38ddd85 - ci: install lcov in github actions runners to fix coverage reporter (2026-07-31)
  • d3a7755 - chore: fix all flutter analyze warnings across the codebase (2026-07-31)
  • f782385 - ci: replace custom coverage script with native github action (2026-07-31)
  • 665c22b - chore: remove accidentally committed scratch files (2026-07-31)
  • 7b82ddf - test: add comprehensive end-to-end integration test suite (2026-07-31)
  • 222270e - chore: remove old websites, strip autologin, and update store screenshots (2026-07-31)
  • c429f05 - chore: remove websites from app repo since they are housed in standalone repos now (2026-07-31)
  • 4dee4cc - chore: update store listing screenshots (2026-07-31)
  • f807dc9 - chore: remove Waffle Sloth branding (migrated to wafflesloth.com domain) (2026-07-30)
  • 3e8a2c9 - added in svg (2026-07-30)
  • a09d7d7 - chore: center white Wafflesloth SVG icons, add backgrounds, and darken facial features (2026-07-30)

Version 0.4.3

  • e27748d - fix: remove dead edge functions from config.toml that were breaking the CI pipeline (2026-07-29)
  • aaa90f0 - feat: add visual indicators for completed sets in the active workout exercise list (2026-07-29)
  • e9da0fc - fix: prevent using deactivated context when importing a template (2026-07-28)
  • 312e0a8 - perf: batch database inserts for template saving and importing (2026-07-28)
  • a99e739 - fix: debounce sync indicator to prevent UI flickering on batch operations (2026-07-28)
  • becffc3 - fix: remove loading flash when toggling template filter (2026-07-28)
  • 9bd160c - chore: remove scratch test file that fails in CI (2026-07-28)

Version 0.4.2

  • 77322f1 - fix: correctly render previous column data from offline cache when workouts block is absent (2026-07-28)
  • e61e5ed - fix: add robust network fallback to gracefully rebuild missing previous_sets cache (2026-07-28)
  • 204427e - fix: restore and correctly calculate historical averages when importing templates (2026-07-28)
  • 6275770 - feat: add template filter toggle to main workouts history screen (2026-07-28)
  • 7a6a4fb - style: use FA upload icon for saving templates (2026-07-28)
  • 2c8a409 - style: revert action icons to original download and save icons (2026-07-28)
  • b737603 - style: remove 3-dot context menu and compact template actions to bottom icon buttons (2026-07-28)
  • 81d36a2 - fix: resolve bracket mismatch and Uuid compilation errors (2026-07-28)

Version 0.4.1

  • dea3e40 - fix: dismiss loading spinner and donation sheet after successful native transaction request (2026-07-28)
  • 1a22d7b - fix: parse android IAP originalJson to extract quantity (2026-07-28)
  • a2f7282 - fix: extract quantity from native IAP payloads to calculate accurate donation totals (2026-07-28)
  • e5ea167 - style: move support section above account details (2026-07-28)
  • 11ecb33 - fix: resolve string interpolation and icon type compile errors (2026-07-28)
  • f784696 - feat: global IAP state sync and donations UI history page (2026-07-28)
  • a28e15e - chore: add Google Play Store IAP icons (2026-07-28)
  • 0c52586 - feat: add workout templates and bro code set cascading (2026-07-28)
  • df607ea - design: change Metrics screen title from ‘Body Metrics’ to ‘Metrics’ (2026-07-28)
  • ae34fb1 - design: change Workouts screen title from ‘Training History’ to ‘Workouts’ (2026-07-28)
  • a2bd4d6 - fix: emit connectivity drops from SyncService so the UI instantly displays the offline indicator mid-session (2026-07-28)
  • a44183a - feat: enable offline support for exercise instruction viewing by utilizing AppRepository cache layers (2026-07-28)
  • 01262ac - feat: use cached_network_image for persistent offline caching of exercise media (2026-07-28)
  • a84b5e9 - feat: animate the syncing indicator during all background network fetches globally (2026-07-28)
  • ee90be3 - design: refactor the offline indicator from a bottom banner into a compact pill badge embedded in screen AppBars (2026-07-27)
  • a4ce91c - fix: prevent offline network failure from overwriting pre-populated workout title with a blank string (2026-07-27)
  • fc4a36e - feat: scroll to top of workouts feed when tapping the active bottom navigation tab (2026-07-27)
  • c8c4c2d - chore: add 375 past generated workouts to the seed file to assist with testing the offline prefetcher (2026-07-27)
  • e31cabe - fix: instantly display workout name from global cache while loading to prevent blank titles (2026-07-27)
  • fe512bd - perf: simplify background prefetcher by migrating to a single nested deep query rather than bulk chunk queries (2026-07-27)
  • f372df3 - perf: rewrite background prefetcher to efficiently bulk fetch up to 100 workouts for deep offline support (2026-07-27)
  • dbcd2f7 - feat: implement background prefetch of recent workout data for offline viewing (2026-07-27)
  • a0eeb15 - fix: initialize sets cache when creating exercise offline so mutations apply correctly to local state (2026-07-27)
  • 81e3e9c - feat: use cached historical data to populate instant smart defaults when adding exercises offline (2026-07-27)
  • 2ae2668 - fix: seed exercise details cache for instant offline loading and stop endless spinner on failure (2026-07-27)
  • 4111466 - feat: progressive enhancement for exercise addition - instant base defaults with background history update (2026-07-27)
  • 2f2788a - perf: prevent exercise addition from blocking UI with long historical data queries (2026-07-27)
  • db5cf03 - fix: resolve type cast error in offline search and make exercise addition fully offline capable (2026-07-27)
  • 104791e - fix: sync global workouts_list cache in active_workout_screen for perfectly reactive UI (2026-07-27)
  • 8b73ee1 - feat: add reactive cache update stream to AppRepository for global screen rebuilds (2026-07-27)
  • 5d24250 - feat: complete offline caching of entire exercise catalog for airplane mode search capabilities (2026-07-27)
  • c694120 - fix: more permissive offline detection to solve emulator bugs (2026-07-27)
  • feeb766 - feat: implement offline caching for app mutations and data loads (2026-07-26)
  • 5e10cd4 - fix: await keyboard dismissal animation before opening instructions sheet to avoid visual glitch (2026-07-26)
  • 8dde689 - fix: dismiss keyboard before opening instruction sheet to prevent DraggableScrollableSheet height miscalculation jump (2026-07-26)
  • d0d27d4 - style: increase top padding buffer for search sheet (2026-07-26)
  • fd9f583 - fix: explicitly enforce top padding for search sheet to prevent dynamic island collision regardless of SafeArea behavior (2026-07-25)
  • 607c66c - fix: subtract keyboard height from search modal constraint to prevent it pushing into dynamic island (2026-07-25)
  • fa5088a - fix: resolve syntax error from DraggableScrollableSheet widget replacement (2026-07-25)
  • 672572b - fix: match exercise logging screen bottom sheet behavior by using DraggableScrollableSheet and keeping it within tab bounds (2026-07-25)
  • 4ed4c1d - fix: remove useSafeArea from modal config to prevent external bottom padding (2026-07-25)
  • f5cd388 - fix: set useRootNavigator to true for modal bottom sheets to anchor to true bottom (2026-07-25)
  • 6ed899a - fix: set bottom false on safe areas in modals to prevent floating unattached trays (2026-07-25)
  • b7a6a27 - fix: constrain add exercise modal to safe area to fix dynamic island overlap (2026-07-25)
  • f7f9d7f - docs: remove unreleased offline sync claims from release notes (2026-07-25)
  • 7a5115b - docs: add short 500 character plain text release notes (2026-07-25)
  • b947cf9 - docs: add plain text version of v1.0.0 release notes (2026-07-25)
  • 7dfd3e8 - docs: add v1.0.0 feature release notes to branding folder (2026-07-25)
  • 420c350 - chore: save macOS signing settings (2026-07-25)
  • a053704 - chore: update platform package identifiers for release (2026-07-25)
  • 5811253 - Merge feature/secure-storage-avatars into main (2026-07-25)
  • 066143f - fix: update Edge Function tests to expect HTTP 302 redirects instead of HTML and mock the new RPC call (2026-07-25)
  • 883a17c - fix: resolve flutter analyze warnings for unused imports, deprecated members, context usage across async gaps, and prints (2026-07-25)
  • cc19d2a - feat: create dedicated static HTML deletion status page in frontend app and redirect Edge Function to it to permanently bypass all Cloudflare API Gateway rendering restrictions (2026-07-25)
  • 24c0546 - fix: completely bypass Cloudflare HTML blocks by using application/xhtml+xml and strictly formatted XHTML documents for visual rendering (2026-07-25)
  • d75d2a8 - refactor: replace HTML rendering with HTTP Redirects to bypass Supabase Edge network HTML restrictions (2026-07-25)
  • 7f13a71 - fix: explicitly set Content-Security-Policy to allow unsafe-inline styles to prevent browser rendering failures (2026-07-25)
  • 002c774 - fix: inline Headers object to bypass Edge Runtime static analysis override (2026-07-25)
  • 23a8e10 - fix: change error status codes from 400 to 200 to bypass Safari bad-request caching (2026-07-25)
  • 6e04916 - fix: clean up HTML whitespace for Safari (2026-07-25)
  • 7527453 - fix: revert Headers class initialization in confirm-data-deletion to bypass Supabase Edge proxy serialization issue (2026-07-25)
  • 1d1e5d6 - fix: use service role RPC for reliable user deletion (2026-07-25)
  • 9466fd8 - fix: add DOCTYPE and enforce Headers in confirm-data-deletion to fix Safari plain-text rendering (2026-07-25)
  • db1b778 - fix: secure storage.objects SELECT policy to prevent broad bucket enumeration (2026-07-25)
  • cf96b32 - fix: add DELETE policy for anthropometric logs (2026-07-25)
  • 38e1ad4 - chore: update deletion confirmation email sender to [email protected] (2026-07-25)
  • 0c6b1cc - fix: update RLS for profiles and restore foreign key constraints (2026-07-25)

Version 0.3.7

  • cd1fc69 - fix: await profile edit navigation to ensure data refreshes on return (2026-07-25)
  • 8f142ce - style: fix horizontal padding on avatar upload button (2026-07-25)
  • 18d5616 - feat: add Google Analytics from landing page to flutter web app (2026-07-25)
  • cc594f4 - fix: resolve broken avatar loading on web by migrating SafeImage to use package:web for modern js_interop and Wasm compatibility (2026-07-25)
  • 69177b4 - Merge remote-tracking branch ‘origin/main’ into dev (2026-07-25)
  • 568a6eb - fix: hide empty parenthesis if build number is missing in version string (2026-07-25)
  • 59866ed - fix: restore foundation and io imports missing after cleanup (2026-07-25)
  • 3171f78 - chore: ignore supabase temp directory (2026-07-25)
  • d1a9a14 - chore(security): add migration to enforce strict RLS on profiles table (2026-07-25)
  • a76ff8a - fix: migrate deprecated onPopInvoked to onPopInvokedWithResult (2026-07-25)

Version 0.3.6

  • 69224f7 - chore: include pubspec version updates, add missing native splash assets, and clean up unneeded imports via dart fix (2026-07-25)
  • 1ebcb75 - feat: display dynamic app version at the bottom of profile screen (2026-07-25)
  • 4902c36 - chore(android): update app label to Gym Vibes (2026-07-25)
  • 68b6e2d - chore(branding): add flutter_native_splash and pure vector icon to fix Android 12 mask cropping (2026-07-25)
  • 2593d02 - fix(routing): re-apply context.go fixes for deep linking compatibility (2026-07-25)
  • 6fc3ded - chore(deploy): add catchall_document for SPA routing in DO app platform (2026-07-25)
  • 992af7f - fix(routing): use StatefulShellRoute for tabs, fix go_router stack issues (2026-07-25)
  • 0a02e4a - refactor(routing): complete go_router migration (2026-07-25)
  • e9963d9 - fix(routing): preserve full exercise URL on deep link and change exercises/ to exercise/ everywhere (2026-07-25)
  • 7985eba - fix(routing): remove unconditional redirect to /workouts and fix syntax error (2026-07-25)
  • a20aae4 - fix(routing): fully remove replaceState and use pushReplacementNamed (2026-07-25)
  • 62cbf1f - fix(routing): use RouteAware for tabs and remove bottom sheet named routes (2026-07-25)
  • c3a6506 - fix(routing): fully support exercise deep links and browser back button (2026-07-25)
  • 1b6da4c - chore: update app title to Gym Vibes: Workout Tracker (2026-07-25)
  • f32764d - fix(routing): use pushReplacementNamed and correctly parse requestedRoute (2026-07-25)
  • f92c70a - fix(routing): use RouteSettings for native web browser history (2026-07-25)
  • 5aa29c2 - fix(routing): prevent web router from destroying navigator stack on browser back button (2026-07-25)
  • 392b9f3 - feat(routing): use pushState for forward navigations to enable browser back button (2026-07-25)
  • 3051268 - Fix URL routing widget test and fallback logic (2026-07-25)
  • 1bc7c8c - Fix Stripe success redirect URL for web (2026-07-25)
  • d1ed868 - Fix deep link persistence during login and OAuth flows (2026-07-25)
  • 61a377a - Add deep linking to EditProfileScreen tabs (2026-07-25)
  • cd76f17 - Fix URL route updates on Web and deep linking for active workouts (2026-07-25)
  • 14f8635 - Fix back button to return to /workouts route (2026-07-25)
  • 5bd20f3 - Rename /workout/ route to /workouts/ to enforce plural path convention (2026-07-25)
  • 606872e - Fix PopScope syntax error (2026-07-25)
  • 658961e - Fix active workout back button blank screen issue when deep linked (2026-07-25)
  • 1a2c06b - Fix URL routing: implement PathUrlStrategy, fix web platform checks, reset URL on logout (2026-07-25)
  • 78d8c06 - fix(auth): add dev override fallback user and eliminate routeInformationUpdated wipe-left animation (2026-07-25)
  • 24e0958 - fix(routing): use RouteSettings(name: ’/’) in route generators to prevent duplicate route stacking on web (2026-07-25)
  • d51a86a - fix(routing): use onGenerateInitialRoutes instead of home property to prevent route generator assertion exceptions (2026-07-25)
  • ed2a521 - fix(routing): add onGenerateRoute and onUnknownRoute to MaterialApp to eliminate route generator exception on deeplinks (2026-07-25)
  • f248d76 - fix(web): add signup fallback and robust window location targetUrl formatting for override_login deeplinks (2026-07-25)
  • 4c6bf14 - fix(auth): update session assignment and Uri.base tab resolution for deeplinks with override_login (2026-07-25)
  • a69b945 - fix(auth): await override_login before setting checkingAuth to false so deep-link tabs open automatically (2026-07-25)
  • 93143d7 - fix(web): strip query parameters from window location search history without page reload (2026-07-25)
  • a3097ae - fix(auth): strip override_login=true query parameter after successful auto-login (2026-07-25)
  • f193205 - fix(routing): remove redundant hash prefix from routeInformationUpdated calls (2026-07-25)
  • 9d7d3ab - refactor(components): extract reusable design system tokens, formatters, and widgets with comprehensive test coverage (2026-07-25)
  • 5f15d7c - fix(tests): complete url deeplinking implementation with passing test suite (2026-07-25)
  • d271fa4 - fix(syntax): clean modal bottom sheet whenComplete chaining in active_workout_screen (2026-07-25)
  • cb81189 - fix(syntax): resolve modal bottom sheet closing brackets in active_workout_screen (2026-07-25)
  • c087123 - fix(syntax): fix modal bottom sheet closing brackets in active_workout_screen (2026-07-25)
  • 97d8e62 - feat(web): add dynamic URL bar updates, deep-linking, and override_login parameter support (2026-07-25)
  • 42e7079 - fix(migrations): add DROP POLICY IF EXISTS statements to anthropometrics, workouts, and donations schemas to make migrations idempotent (2026-07-25)
  • 5b0986e - fix(migrations): rename donations table migration to 20260724062502 to match remote prod database and updated dev database (2026-07-25)
  • b59c1bb - fix(migrations): drop GDPR deletion requests policy and trigger if exists to ensure idempotent replays (2026-07-25)
  • 271a5c3 - fix(migrations): restore original donations timestamp and drop remote exercise triggers if exists to ensure idempotent replays (2026-07-25)
  • 55e20e4 - chore(git): ignore node_modules and track scratch package dependencies for screenshotting (2026-07-25)
  • 46469e5 - feat(branding): finalize deep-linked store screenshots showing workouts, exercise search, and exercise details (2026-07-25)
  • f8fd139 - feat(branding): add active workout, search, and details sheets screenshots for all devices, and add regenerate wrapper script (2026-07-25)
  • 80045ea - feat(branding): update store screenshots with authenticated high-DPI viewports (2026-07-25)
  • d0ee2bb - fix(migrations): drop public read policies if exists before creating them to avoid SQLSTATE 42710 error on replays (2026-07-25)
  • 6af44de - feat(branding): add automated store listing screenshots for phone, 7-inch, and 10-inch tablets (2026-07-25)
  • 200d0a8 - docs(branding): remove embellishments and reflect only verified app features (2026-07-25)
  • fb41d47 - docs(branding): convert Google Play store description to clean plain text (2026-07-25)
  • f963b9f - docs(branding): relocate store listing metadata to store_listing/ folder (2026-07-25)
  • 3ed7345 - docs(branding): create default Google Play and App Store listing details (2026-07-25)
  • f9d423b - refactor: rename local donations migration to match remote timestamp version (2026-07-24)
  • b744e66 - feat: implement Option B automated GDPR deletion verification with Edge Functions and db webhooks (2026-07-24)
  • a533c96 - feat: link web GDPR delete portal to live Supabase backend database table (2026-07-24)
  • 821d097 - feat: enforce username validation rules and catch duplicate key violations to handle unique handles (2026-07-24)
  • c47129a - feat: standardise UI components to BrandButton, BrandTextField, BrandCard, and BrandLoadingIndicator, and add comprehensive widget tests (2026-07-24)
  • 6b0b0eb - ci: rename workflow to unit-tests.yml, split into parallel jobs, and upgrade runner actions (2026-07-24)
  • b06a08d - test: generate Deno LCOV coverage file during test run step (2026-07-24)
  • 2526532 - test: disable Deno test sanitizers dynamically and use —no-check in workflow (2026-07-24)
  • 8fc41f2 - test: commit scratch/coverage_checker.js script for CI environment (2026-07-24)
  • 740d712 - test: commit edge function exports required by Deno tests (2026-07-24)
  • c6892d4 - test: commit local modifications for donation_sheet and active_workout_screen tests (2026-07-24)
  • 0daf8cf - test: commit missing test files and mocks for CI workflow (2026-07-24)
  • 4340085 - feat: add GDPR & Google Play compliant account deletion web page, RPC, and app options (2026-07-24)
  • a829786 - ci: add GitHub Actions workflow for tests and update AI coding rules for coverage thresholds (2026-07-24)
  • 41ccddf - test: boost coverage for EditProfileScreen, DashboardScreen, SafeImage, LoginScreen, and WorkoutUtils (2026-07-24)
  • 9ad873e - feat(branding): generate comprehensive multi-platform icon suites, store marketing assets, SVGs, and brand documentation for GymVibes and Wafflesloth (2026-07-24)
  • 4b94e58 - refactor(branding): reorganize branding assets into root branding/gymvibes and branding/wafflesloth directories (2026-07-24)
  • a59d3b9 - test/refactor: extract WorkoutUtils, add conversion/snapping unit tests, and fix widget test (2026-07-24)
  • 76f11f1 - feat: set desktop window title to Gym Vibes for macOS, Windows, and Linux (2026-07-24)
  • 2395ef2 - feat: set native minimum window size constraints to 375x600 for macOS, Windows, and Linux (2026-07-24)
  • 75fce42 - feat: implement responsive column header labels for small screens (2026-07-24)
  • c223495 - fix: make inter-input gaps responsive and optimize mobile sizing to prevent text wrapping (2026-07-24)
  • 8b6408d - fix: update layout header widths to dynamically match upscaled input sizes (2026-07-24)
  • 6936c3d - feat: increase set input sizes on all devices and ensure weight is wider than reps (2026-07-24)
  • d64a192 - feat: make set input fields responsive and larger on larger screens (2026-07-24)
  • 668567e - feat: add global tap-outside gesture detector to dismiss virtual keyboard (2026-07-24)
  • 80cb7fc - feat: check for empty string when loading avatar and update test user seed to set avatar_url to null (2026-07-24)
  • ad0309e - feat: add default WaffleSloth mascot avatar image and fallbacks (2026-07-24)
  • 1f5fd1d - fix(seeds): add aud column explicitly to auth.users insert statement (2026-07-24)
  • 208f30a - fix(seeds): use verified, cryptographically correct a$ format bcrypt hash of password123 (2026-07-24)
  • 04d6fcd - fix(seeds): change bcrypt prefix to a$ for GoTrue auth compatibility (2026-07-24)
  • 76ffe55 - docs/seeds: update test user email domain to gymvibes.xyz and update password bcrypt hash (2026-07-24)
  • 285898b - docs: add Developer & Environment Setup section to README.md (2026-07-24)
  • d62e335 - feat: conditionally configure Supabase initialization for dev (debug) vs prod (release) environments (2026-07-24)
  • 63e0448 - fix(seeds): fix invalid UUID syntax in user_and_workouts.sql (2026-07-24)
  • ac1fe0a - feat(seeds): add user_and_workouts seed and split exercises automation scripts (2026-07-24)
  • 27f836b - design: update WaffleSloth developer page branding icon and header assets (2026-07-24)
  • 406e3c2 - design: regenerate WaffleSloth developer icon with correct arm anatomy (2 arms) (2026-07-24)
  • 2ac65b8 - fix(migrations): fix table copy data order bug during database reset (2026-07-24)
  • 39c70e3 - feat: add 50 and 100 donation tiers to functions, ui, and test plan (2026-07-24)
  • ce821dd - chore: update .cursorrules with branch model (dev/main) and Stripe test/live configs (2026-07-24)
  • fcf1f3f - design: add WaffleSloth developer brand assets for Google Play Console (2026-07-24)
  • a9815a8 - docs: add donation testing plan to workspace test_plans/ directory (2026-07-24)
  • b22ffe5 - feat(donations): add unified donations log table, write local IAP logs directly, and trigger automatic tier upgrades from PG (2026-07-24)
  • 121b071 - feat(webhook): add stripe-webhook Edge Function to dynamically update profile tiers on donation success (2026-07-24)
  • c8364f6 - feat(iap): integrate native In-App Purchases for mobile with Stripe Checkout fallback for web (2026-07-24)
  • 0a084eb - feat: implement cross-platform Stripe Checkout donation flow with one-time and recurring monthly options (2026-07-23)
  • 495ac36 - fix(do): disable icon tree-shaking on web build to fix broken FontAwesome icons (2026-07-23)
  • c5fed1d - fix(do): remove deprecated —web-renderer canvaskit option from flutter build command (2026-07-23)
  • b5012f8 - fix(do): add dummy index.html at root to trigger static HTML buildpack detection (2026-07-23)
  • ef64f39 - fix(do): specify environment_slug: html for gymvibes-app to skip buildpack auto-detection (2026-07-23)
  • f5187bc - chore: configure DigitalOcean App Spec for multi-site routing (gymvibes.xyz and app.gymvibes.xyz) (2026-07-23)
  • 17ac93f - feat: add build script and DigitalOcean App Spec for static site deployment (2026-07-23)
  • 010e175 - feat: set non-null default parameters and fallbacks for reps, weights, duration, distance, and calories (2026-07-23)
  • e65cf3f - feat: show avatar image preview immediately after picking on both web and native (2026-07-23)
  • aeb212d - feat: remove paste avatar url field and standardize upload mime types (2026-07-23)
  • 05f25b9 - feat: add distance units (mi/km) to unit systems settings display in edit profile (2026-07-23)
  • 076235d - feat: change cardio headers to MINUTES and MILES/KM (2026-07-23)
  • 02ec272 - chore: move created_at and updated_at columns to the ends of workout_sets (2026-07-23)
  • b92fd1d - feat: implement cardio and time-based exercise tracking (2026-07-23)
  • 49ca679 - feat: implement contribution tiers, responsive metrics grid, and goals relocation (2026-07-23)
  • f980d46 - feat(workout-logs): compute volume-weighted average weight based on completed sets, and add vertical-drag increment/decrement gestures to reps and weights inputs (2026-07-22)
  • 1324c1e - feat(branding): generate launcher icons for android, ios, macos, and web using the brand logo asset (2026-07-22)
  • ce83def - fix(auth): configure OAuth to use externalApplication launch mode to resolve hanging/cancelled in-app webview redirects on iOS/macOS (2026-07-22)
  • 0a022b3 - fix(auth): register ‘gymvibes://’ simple alphanumeric custom URL scheme to resolve iOS/macOS Safari redirection issues (2026-07-22)
  • 5c62a21 - feat(workout): integrate supabase edge function for semantic vector search with matching percentage indicator (2026-07-22)
  • f9da824 - style(workout): swap order of reps and weight columns in logging table view (2026-07-22)
  • c6ebae3 - fix(workout): refine calculate defaults database query to bypass complex joins using simple list maps (2026-07-22)
  • 7e97363 - feat(workout): enforce non-null weight and reps and calculate historical defaults for new exercises with 3 sets (2026-07-22)
  • 17c3f2c - fix(workout): resolve duplicate sort handles and implement exercise guide sheets (2026-07-22)
  • 94849c3 - feat(workout): implement workouts and sets schema, real-time sync database structures, and premium builder UI (2026-07-22)
  • 891e414 - fix(profile): resolve unit conversions and preferences lookups in main dashboard and body logs (2026-07-22)
  • 706da6e - feat(profile): implement immutable profile_anthropometric_logs database schema and client logging UI (2026-07-22)
  • 8210503 - style(database): capitalize common_activity_levels names to Title Case (2026-07-22)
  • 662eef5 - fix(platform): add iOS and macOS camera and photo library usage descriptions and sandboxing entitlements (2026-07-22)
  • e307305 - fix(edit_profile): resolve deprecated value parameter in DropdownButtonFormField (2026-07-22)
  • eebec38 - feat(avatar): integrate image_picker and upload picked photos to Supabase Storage (2026-07-22)
  • 61ed1e2 - feat(database): rename muscle_groups to common_muscle_groups and update junction schemas/seeds (2026-07-22)
  • 65f4e55 - fix(edit_profile): move TabBar to body Column to prevent transparent click blockage on top fields (2026-07-22)
  • 5f733f2 - feat(profiles): add updated_at column to main profiles table (2026-07-22)
  • 4c11536 - feat(supabase): create public avatars bucket and secure storage policies (2026-07-22)
  • 43d38bc - style(database): switch timestamp order to created_at followed by updated_at at table ends (2026-07-22)
  • 10431fd - feat(database): prefix genders, activitylevels, and unit_systems lookup tables with common and document AI preferences (2026-07-22)
  • 1c8ebc1 - feat(supabase): normalize unit system into unit_systems catalog and update Flutter integration (2026-07-22)
  • e80ff89 - feat(profile): set imperial as default unit system and replace SegmentedButton with custom cards (2026-07-22)
  • 38d5169 - feat(profile): implement EditProfileScreen and integrate with ProfileScreen in Flutter (2026-07-22)
  • 7c514df - security(profiles): prevent users from modifying their own subscription tier via API (2026-07-22)
  • 0bf47bb - feat(supabase): rename tiers to profile_tiers and tier_id to profile_tier_id (2026-07-22)
  • facd9ef - feat(supabase): normalize profile activity level into activity_levels lookup table with multipliers (2026-07-22)
  • 5c7a796 - feat(supabase): normalize profile gender column into genders lookup table (2026-07-22)
  • fb9a4b1 - feat(supabase): rename muscle groups tables and seeds for alphabetical prefixing (2026-07-22)
  • 610ff82 - feat(supabase): normalize profiles schema into sub-tables (anthropometrics, preferences, goals, tiers) (2026-07-22)
  • 649a876 - feat(supabase): add profiles schema migration with expanded health and metric fields (2026-07-22)
  • 6ceda09 - style(auth): reduce font size and margins of reset password header and forgot password link (2026-07-22)
  • 2b64a10 - style(auth): reduce sign in/up switcher toggle height to 32px (2026-07-22)
  • dd2cfe0 - design(branding): add square background logo versions in all app sizes (2026-07-22)
  • 1552bdb - feat(supabase): add database migrations, catalog seeds, and auto-embedding trigger edge function (2026-07-22)
  • ca80308 - feat: add Google Analytics (gtag.js) script to gymvibes.xyz index.html (2026-07-18)
  • 93a72fa - feat: add Google Analytics (gtag.js) script to wafflesloth.com index.html (2026-07-18)
  • a09a534 - feat: add static routes and files for privacy policy and terms of service in Gym Vibes landing page (2026-07-18)
  • f492863 - feat: add custom SVG favicons for wafflesloth.com (waffle) and gymvibes.xyz (dumbbell) (2026-07-18)
  • 5561284 - style: remove privacy-first reference from Gym Vibes credits to align with disclaimers (2026-07-18)
  • 19fde97 - feat: add landing page websites for wafflesloth.com and gymvibes.xyz using Svelte (2026-07-18)
  • a5d6728 - configure: update all custom deep link redirect schemes to xyz.gymvibes.app across iOS, Android, and macOS (2026-07-18)
  • f835ee0 - configure: add custom URL schemes to macOS Info.plist to support desktop OAuth deep linking redirects (2026-07-18)
  • b141164 - style: center dumbbell logo and make social icon colors grey in login screen (2026-07-18)
  • bd904ea - feat: migrate all application icons to font_awesome_flutter package (2026-07-18)
  • 3efe13e - feat: add Google and GitHub OAuth login buttons to login screen (2026-07-18)
  • 9f94657 - configure: add Google OAuth client ID plist and configure iOS URL scheme (2026-07-18)
  • bbc652e - configure: change app bundle identifier and package name to xyz.gymvibes.app across all platforms (2026-07-18)
  • 2ad1fe1 - docs: add Terms of Service in MD and premium HTML formats (2026-07-18)
  • b464f88 - docs: add Privacy Policy and Terms of Service in MD and premium HTML formats (2026-07-18)
  • 2dd9d8e - design: add vector SVG logo and PNG app icons in standard sizes (2026-07-18)
  • 59be22e - docs: update remaining instances of app description in code metadata and rules (2026-07-18)
  • d29cafa - docs: shorten description to 20 words and remove technical jargon (2026-07-18)
  • b04d3f1 - docs: rewrite description to reflect premium offline-first workout tracking concept (2026-07-18)
  • 768226d - feat: implement password reset and update password flows (2026-07-18)
  • 8ff3a56 - feat: implement Supabase auth with login and profile screens (2026-07-18)
  • 7ad864d - chore: add VS Code extension recommendations (2026-07-18)
  • 761aab4 - docs: add git and PR workflow rules to gym_tracker.md (2026-07-18)
  • 4a70580 - feat: initial commit with workspace config and flutter skeleton (2026-07-18)