## CodeWithCJ/SparkyFitness — v1.7.2…v1.7.3

_284+ commits._

### Features
- **feat(integrations): add COROS integration and streamline provider sync schedulers** (2540a4c)
- **feat(mobile): add dashboard card reordering and direct health trend visibility toggles** (9cfdb75)
- **feat(mobile): offer the female figure on the exercise statistics heat map** (9bc268c)
- **feat(reports): add a female figure to the muscle heat map** (fe88faa)
- **feat(mobile): list cardio sessions and open one for its route and heart rate** (286c204)
- **feat(mobile): add exercise statistics with set counts and a body heat map** (eccd4bb)
- **feat(workout): Use standardised and templatable icon for Android notification chip** (2246dc6)
- **feat(workout): Cancel android workout rest alarm when notifications are disabled** (9d1044d)
- **feat(ai): add dedicated Perplexity AI provider with Agent API transport adapter** (78b16e8)
- **feat(exercises): tag inputs with suggestions for muscles and equipment** (9581676)
- **feat(workouts): adaptive coaching with smart alternatives and session feedback** (655e62f)
- **feat(workout): Test workout activity data provided to live update notification for Android** (768f987)
- **feat(workout): Update AGENTS with info on workout live update notification** (fbc11d6)
- **feat(workout): Add a live update notification for Android** (984c8c5)
- **feat(workouts): Extract workout process build** (aad1d9f)
- **feat(mobile): add goal lines to Weight and Hydration health trends** (3ecd5ec)
- **feat(watch): color supersets with the phone palette** (3b0079f)
- **feat(watch): label a superset and name its partner** (7b7a7be)
- **feat(workouts): optional per-set weight ramp on preset exercises** (fea6d8e)

### Fixes
- **fix(coros): refine quota detection regex and guard download limit warning** (6a45631)
- **fix(coros): refine limit error classification and add reset-based budget warnings** (f7f11f7)
- **fix(coros): rethrow reauth errors mid-sync, correct quota warnings, and clean up docs** (bf1f2a1)
- **fix(coros): consolidate sport taxonomy, unify source naming, and enhance auth resilience** (11ceb83)
- **fix(coros): address review comments on logger and test isolation** (f4a189e)
- **fix(reports): skip the opening focus refetch and start the heat map on the viewed user** (6dee19f)
- **fix(reports): clear the stale heat map figure and let screen readers pick muscles** (8a419ad)
- **Merge pull request #2621 from CodeWithCJ/fix/nginx-dynamic-upstream-resolver** (8b3167c)
- **fix(mobile): title cardio sessions with the workout name and show brief zones as <1 min** (1affb74)
- **fix(reports): draw the female figure's head, hands and feet in the untinted grey** (7f7ed81)
- **fix(docker,docs): add /etc/hosts resolution fallback and remove ipv6=off from nginx resolver** (38f3689)
- **fix(docker): preserve closing bracket when stripping IPv6 zone scope in resolver** (dd86ff1)
- **fix(docker): distinguish IPv6 addresses from IPv4 addresses with ports in resolver normalization** (a6f497e)
- **fix(mobile): fall back to stored heart rate when a route fails to load** (e3e57ba)
- **fix(docker): normalize configured and auto-detected resolver addresses** (fe22c13)
- **fix(docker,helm): support FQDN upstream resolution and bracket IPv6 nameservers** (8fee99c)
- **fix(docker): configure dynamic DNS resolver in nginx to prevent stale backend IP caching** (9185726)
- **Merge pull request #2620 from Jerrys-modz/fix/water-goal-preset** (49a2296)
- **fix(goals): keep prior water goal for presets and treat blank input as unset** (e44bd47)
- **Merge pull request #2618 from CodeWithCJ/fix/mcp-food-diary-serving-nutrition** (ce9beaa)
- **fix(goals): resolve weekly plan preset water goal as water_goal_ml** (0cc986d)
- **fix(mcp): require explicit serving_unit before matching normalized units** (cad45b5)
- **fix(mcp): scale food entry nutrition for consumed quantity** (be7a12a)
- **Merge pull request #2617 from CodeWithCJ/fix/reject-placeholder-secrets** (a76243c)
- **fix(mobile): move the exercise statistics range forward after midnight** (45ce6e5)
- **fix(server): reject a BETTER_AUTH_SECRET that decodes to an empty key** (f7bb273)
- **fix(server): refuse to start with .env template placeholder secrets** (f914621)
- **fix(mobile): clamp Health Connect nutrition record interval end to current time** (acba0cb)
- **fix(mobile): use entry_time for nutrition write-back to health platforms** (c013490)
- **fix(mobile): map HKWorkoutActivityType other (3000) to Other** (f749f64)
- **Merge pull request #2612 from CodeWithCJ/fix/issue-2571-perplexity-agent-api** (b95821c)
- **fix(ai): preserve multi-turn messages in Agent API input and improve streaming tool handling** (d148aa4)
- **fix(workout): Reschedule workout notification rest alarm when it fires early** (f656615)
- **fix(ai): refine Perplexity Agent API input wire format, tool calls, and error handling** (545202d)
- **fix(measurements): execute water log and food entry time sync in a single transaction** (40870b5)
- **fix(ai): handle Perplexity chat completions deprecation and add OpenRouter presets** (e3be138)
- **fix(caffeine): populate and sync entry_time for quick-add drink food entries** (422f2a5)
- **fix(reports): clear loaded cardio pages when the account or range changes** (9cb41e7)
- **fix(reports): keep a workout's timezone with its start time** (05cafd2)
- **fix(exercises): tag input comma splitting, remove button a11y, and label updates** (7207b65)
- **fix(reports): address review feedback on the exercise progress dashboard** (5a94d2b)
- **fix(sleep): keep an existing stage when a remainder lands on it** (0f68d0f)
- **Merge pull request #2600 from Jerrys-modz/fix/watch-persist-telemetry** (e6496ba)
- **fix(sleep): upsert remainders instead of rewriting a crossing stage** (afe1602)
- **fix(reports): keep the all-workouts activity list filled** (ca3d444)
- **fix(watch): keep restore blocked until identity-change config ids are read** (dacbf0e)
- **fix(reports): restore the checks CI failed on** (db2dfff)
- **fix(reports): reset cardio pages on a user switch and ignore a bad timezone** (6becd21)
- **fix(watch): purge the outgoing config on identity change, not the bridge's owner** (a61b65b)
- **fix(watch): block restore until the previous account's purge succeeds** (8aa85c2)
- **fix(workouts): address review findings on adaptive coaching** (7341a0d)
- **fix(watch): hold batches until the store loads and replay in one write** (1331f7e)
- **fix(watch): purge the previous account's telemetry on account switch** (584c0d0)
- **fix(storage): register deleted-config cleanup instead of importing it** (1da2147)
- **fix(watch): prove heart-rate batch ownership and stop losing a backlog** (43af6b6)
- **fix(watch): keep queued heart-rate batches with the account that owned them** (05cda3d)
- **fix(watch): restore telemetry only after hydration and per account** (a173dc5)
- **fix(watch): ignore heart-rate batches until the saved buffer is loaded** (d59b918)
- **fix(watch): bind replayed heart-rate batches to phone-owned entries** (1288dab)
- **fix(watch): do not persist a live batch before restore finishes** (1dcadc5)
- **fix(watch): keep unacked heart-rate batches when storage fails** (2aa0596)
- **fix(watch): hold unknown heart-rate batches until restore finishes** (6c139cd)
- **fix(watch): encrypt heart-rate telemetry at rest** (d56e0db)
- **fix(watch): keep a failed telemetry restore from acking the queue** (7e531ae)
- **fix(watch): persist heart-rate batches until the phone has stored them** (5ad0729)
- **fix(mobile): stop double-converting the hydration goal line** (209da9b)
- **fix(watch): tidy superset labels and the unused watch mock** (7c47fc9)
- **Merge pull request #2588 from georanma/fix/usda-datatype-filter** (b68571b)
- **Merge pull request #2589 from georanma/fix/rank-provider-matches-hoist** (3e609cd)
- **Merge pull request #2587 from georanma/fix/off-household-serving-scaling** (d52e211)
- **Merge pull request #2586 from Jerrys-modz/fix/watch-interval-formats** (73cc1ce)
- **Merge pull request #2592 from lizaoreo/patch-1** (79622e2)
- **fix(workouts): treat step-load increments as reps; whole-number rep increments in AI presets** (da41c55)
- **fix(workouts): keep WOD sets out of the exercise Best record** (cafe0d4)
- **fix(watch): allow a later arm of a workout that already ended** (08b9690)
- **fix(search): rank FatSecret results before detail enrichment** (628aeda)
- **fix(watch): keep interval snapshots for a workout that has not started** (ae6b37a)
- **fix(watch): do not revive an ended workout from a queued start** (34017cd)
- **fix(watch): keep interval timing ordered and across a restart** (3b5a2c3)
- **Merge upstream/main into fix/watch-interval-formats** (b7b08eb)
- **fix(watch): apply interval pause snapshots in revision order** (49a52d8)

### Backend
- **version update** (9d9b12d)
- **Merge pull request #2626 from CodeWithCJ/feat/coros-integration** (924e51b)
- **Merge pull request #2625 from Jerrys-modz/feat/mobile-exercise-statistics** (ac23a51)
- **Merge upstream main into exercise statistics** (c058ecc)
- **Merge pull request #2624 from CodeWithCJ/feat/mobile-dashboard-card-reorder-and-toggles** (42eb4c9)
- **Merge branch 'CodeWithCJ:main' into feat/mobile-exercise-statistics** (f36d820)
- **Merge pull request #2602 from claucambra/feat/android-ongoing-notification** (f10a4dd)
- **Merge pull request #2616 from CodeWithCJ/dev** (5efc6f9)
- **Merge pull request #2615 from CodeWithCJ/dev** (99bbb23)
- **Merge pull request #2611 from CodeWithCJ/dev** (56ce35e)
- **Merge pull request #2610 from CodeWithCJ/ci/schema-backup-sync** (6ee258c)
- **Merge pull request #2609 from Jerrys-modz/feat/exercise-progress-dashboard** (a98c3d7)
- **Merge pull request #2608 from CodeWithCJ/dev** (fde7c37)
- **Merge pull request #2607 from Jerrys-modz/feat/sleep-diary-in-bed** (78b59da)
- **Merge pull request #2605 from CodeWithCJ/ci/schema-backup-sync** (63d3b81)
- **Merge pull request #2594 from chaddy50/worktree-health-trends-goal-lines** (ce57a41)
- **Merge upstream/main into feat/sleep-diary-in-bed** (073989f)
- **Merge pull request #2603 from CodeWithCJ/feat/adaptive-coaching-1560** (1fd3008)
- **Merge upstream/main into feat/exercise-progress-dashboard** (ff49a7d)
- **Prevent infinite loop when given a NaN** (94a1592)
- **Merge pull request #2596 from Jerrys-modz/feat/watch-supersets** (951f928)
- **Merge pull request #2599 from CodeWithCJ/ci/schema-backup-sync** (9b8a4d1)
- **Merge pull request #2598 from CodeWithCJ/dev2** (e54eaa3)
- **Merge pull request #2597 from SisyphusMD/docs/multiple-instances** (8336389)
- **Merge pull request #2593 from CodeWithCJ/ci/schema-backup-sync** (a093706)
- **Merge pull request #2591 from CodeWithCJ/dev** (878e31a)
- **Update README.md** (180dd07)
- **Merge pull request #2585 from CodeWithCJ/dev** (6ae1dbe)
- **Rank manual/mobile food search results the same way the chatbot already does** (a15a31f)

### Tests
- **test(helm): verify proxied /api/health endpoint in test-connection pod** (5065eae)
- **test(mobile): update ExerciseFormScreen test state to use string arrays for equipment and muscles** (c6a320a)
- **test(mobile): mock expo-crypto without loading the native module** (1b0c1da)
- **test(watch): point the superset payload test at the current watch mock** (df046d7)

### Docs
- **docs: standardize COROS provider display name across documentation and UI** (edd63d1)
- **docs(nix): move env file comments onto their own lines** (d5fb82a)
- **docs(server): note the console.error exception for fatal boot diagnostics** (97121d3)
- **docs(watch): point the superset palette back at the Swift copy** (3810e3b)
- **docs(install): say the last instance to write the OIDC provider wins** (a3c101c)
- **docs(install): cover clusterless Helm renders and late OIDC restarts** (7ce6c7e)
- **docs(install): describe the multi-instance sign-in limit as an upper bound** (b59896f)
- **docs(install): add a guide for running multiple server instances** (9bb2435)

### Chore
- **refactor(mobile): extract ReorderSwitchRow, moveItem helper, and clean dead code** (5cb2fb5)
- **refactor(shared): share the cardio session headline and type record_timezone** (2f29386)
- **refactor(shared): move the body-map muscle helpers and workout heart-rate series into shared** (0c00b3b)
- **chore: sync db_schema_backup.sql with migrations** (9e869cc)
- **chore: sync db_schema_backup.sql with migrations** (fab3e71)
- **chore: sync db_schema_backup.sql with migrations** (b7844f5)
- **chore: sync db_schema_backup.sql with migrations** (b32456a)
- **style: trim over-explained comments from the ranking hoist** (abd1b9f)
- **style: trim over-explained comments from the household-serving fix** (59f0bda)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/CodeWithCJ/SparkyFitness?utm_source=github-action)._