## CodeWithCJ/SparkyFitness — v1.6.4…v1.6.5

_261+ commits._

### Features
- **feat(auth): link github license in demo disclaimer dialog** (9477383)
- **feat(auth): add isolated demo mode sandbox with auto-seeding and daily reset** (26b474a)
- **feat: automate Open Food Facts contributions** (285737d)
- **feat(mobile): let users choose which Health Trends graphs show** (71f12e8)
- **feat(i18n): pull the widget resources for registered locales only** (4c82116)
- **feat(ci): guard the mobile translation surfaces from hand edits** (e63468c)
- **feat(i18n): sync the four mobile translation surfaces with Weblate** (8e7f318)
- **feat(chart): apply time scale mode to a first batch of charts** (378a746)
- **feat(): plug chart scale mode in preferences and add utility functions to turn chart axes into time scales** (474b97f)
- **feat(charts): introduces a new preference for chart scaling mode: either time or point based** (932cab9)
- **feat(mobile): add progress photos** (2190636)
- **feat(check-in-photos): add gallery endpoint pairing photos with that day's weight** (998e8e9)
- **feat(diary): toggle logged meal nutrition between consumed and total** (8707e16)
- **feat(mobile): show ask-user options as quick replies** (e19445a)
- **feat(diary): snapshot total dish yield in logged meals** (61d258d)
- **feat(food): add notes toolbar, photo embedding, and MCP editing** (fa23831)
- **feat(food): add markdown notes to foods, meals, and diary entries** (3d3a6c4)

### Fixes
- **fix(demo): close upload, MCP and client-IP gaps in demo guard** (4a65062)
- **fix(demo): address review comments on swagger docs, gps interpolation, and safety markers** (2a40a35)
- **fix(demo): wrap seedDemoUser in transaction and mutex to prevent concurrent duplicate inserts** (ef841b9)
- **fix(auth): ensure reliable demo login credential synchronization and fallback** (b309161)
- **fix(openfoodfacts): require reviewed single-food contributions** (86648b8)
- **fix(mobile): commit a reorder only when the drag was dropped** (dcc7363)
- **fix(mobile): drop the range control when every health trend is hidden** (3204e23)
- **fix(mobile): give the weight chart its own empty state** (ca0510a)
- **fix(tests): removing cache test as there's no satisfactory way to do so** (a690b69)
- **fix(mobile): repair the en catalog after the main merge** (ef688c6)
- **Merge pull request #2368 from jsandai/fix/free-exercise-db-dataset-cache** (dd3186e)
- **fix(exercise): reject empty cached datasets** (722d64c)
- **fix(i18n): unship widget resources dropped from the registry** (dedea59)
- **fix(mobile): resolve the Android resource qualifiers Weblate writes** (d0fa205)
- **fix(mobile): stop unshipped Weblate locales from failing validation** (1889c0e)
- **Merge pull request #2360 from jsandai/fix/health-data-sync-orphaned-child-writes** (6736c04)
- **fix(chart): sort dates in chronological order to avoid reverse order like on mood chart** (419473c)
- **fix(mobile): scope the progress card to the day, and prompt when empty** (e7dc8b3)
- **Fix Weblate Translations links in README** (e13b177)
- **fix(mobile): dot the photo days in the time-lapse range picker** (f7ab8ba)
- **fix(mobile): say when the time-lapse widened past the selected preset** (6e3b021)
- **fix(mobile): treat a single time-lapse frame as the empty state** (ef3a34a)
- **fix(exercise): validate every dataset entry** (8ad9786)
- **fix(mobile): address the review findings on the progress photo flow** (38ec08a)
- **fix(exercise): cache the free-exercise-db dataset instead of each query** (0fcd9e1)
- **fix(tooling): honour per-package .prettierignore in the pre-commit hook** (07f95c8)
- **fix(mobile): scale logged meals by the snapshot, not the template link** (e221f98)
- **fix(diary): backfill logged meal yields and guard partial meal updates** (bd30848)
- **fix(exercise): replace synced activity details** (481d772)
- **fix(exercise): serialize synced entry writes** (e6f408f)
- **fix(diary): restore foods on meal create and correct snapshot edge cases** (5c32242)
- **Merge pull request #2350 from chaddy50/fix/chart-single-data-point** (8bc8d2f)
- **Merge pull request #2347 from jsandai/fix/mobile-barcode-provider-override** (bf83b71)
- **fix(exercise): store a synced workout's raw provider data in the entry transaction** (2ee2d37)
- **fix(exercise): update the replacement row rather than duplicating a synced workout** (233d5fc)
- **fix(exercise): insert a replacement when a synced parent entry is deleted mid-request** (9c053f5)
- **fix(mobile): show a point marker on charts with a single data point** (31ffc56)
- **fix(frontend): pre-unscale component quantities synchronously in EditMealFoodEntryDialog** (b58ce29)
- **fix(mobile): stop the food-search provider overriding the barcode provider** (e72fa04)
- **Merge pull request #2331 from junek-pikovy/fix/localize-frontend-ui** (4b45a9c)
- **fix(i18n): interpolate the personal-record distance label through i18next** (0c38c41)
- **Merge branch 'main' into fix/localize-frontend-ui** (3d2d38e)
- **fix(food): require foods when a logged-meal update rebuilds components** (65d41a0)
- **fix(food): address review findings on notes** (d43c43c)
- **Merge pull request #2334 from jsandai/fix/local-food-search-pagination** (e4770e8)
- **Merge pull request #2326 from infectiousstupidity/fix/2325-quantity-field-clear** (52f6c5e)
- **Merge pull request #2320 from Bl4nk24/codex/fix-workout-step-calories-2318** (ca09669)
- **fix(food-search): key the all-providers cache on the display limit** (b8608a1)
- **fix(food-search): paginate local food search so later matches stay reachable** (fe44da0)
- **fix(i18n): address follow-up localization review** (df59bb0)
- **fix(i18n): address localization review feedback** (ad8ecc6)
- **fix(frontend): localize user-facing UI** (5d6e4aa)
- **fix(i18n): correct the docs claims and type-check the metadata test** (f6003ed)
- **fix(mobile): read a doubled percent as a literal in the widget validator** (603e1f4)
- **Merge upstream/main into codex/fix-workout-step-calories-2318** (71332c4)
- **fix: allow clearing food quantity input** (7047426)
- **Merge pull request #2324 from CodeWithCJ/fix/docs-latex-rendering** (82cfee9)
- **fix(docs): render calculation settings formulas without LaTeX** (55491bd)
- **fix on doc reference in agents.md for frontend.** (8129bdb)
- **fix(health): exclude workout steps from step calories** (7894b6e)
- **fix(openfoodfacts): bound legacy candidate scans** (d39e3fa)
- **fix(openfoodfacts): preserve macro-only legacy results** (b717586)
- **fix(openfoodfacts): align filtered search pagination** (3679744)
- **fix(openfoodfacts): exclude incomplete nutrition results** (763391e)

### Backend
- **version upgrade to 1.6.5** (7a37a86)
- **Merge pull request #2391 from CodeWithCJ/i18n/sync-weblate-translations** (0c70e13)
- **Merge pull request #2389 from CodeWithCJ/dev2** (f87548f)
- **claude feedbacks** (93b08fa)
- **Merge pull request #2387 from CodeWithCJ/ci/schema-backup-sync** (548485e)
- **Merge pull request #2315 from Bl4nk24/codex/feat-openfoodfacts-contributions** (3adecb5)
- **Merge pull request #2385 from CodeWithCJ/i18n/sync-weblate-translations** (875b69b)
- **Merge pull request #2374 from chaddy50/feat/mobile-health-trends-customization** (da62a55)
- **Merge pull request #2380 from CodeWithCJ/ci/schema-backup-sync** (4cdf475)
- **Merge pull request #2370 from lesquoyb/time-charts-v2** (9dfa967)
- **Merge branch 'main' into feat/mobile-health-trends-customization** (1b538c0)
- **Merge pull request #2372 from zeusal/feat/mobile-weblate-sync** (433e25b)
- **Merge pull request #2364 from zeusal/feat/mobile-progress-photos** (5e90010)
- **Revise announcement for SparkyFitness translations** (c9f8e92)
- **Merge pull request #2363 from CodeWithCJ/ci/schema-backup-sync** (d77d3e2)
- **Merge pull request #2345 from CodeWithCJ/dev** (28bde23)
- **Merge pull request #2356 from romanchenkop/feat/mobile-ask-user-options** (72d9870)
- **Merge pull request #2342 from CodeWithCJ/ci/schema-backup-sync** (af16e6d)
- **Merge pull request #2335 from CodeWithCJ/feat/food-notes** (e758f15)
- **Merge pull request #2281 from chaddy50/feature/dashboard-sleep-trend** (982aa87)
- **Merge branch 'main' into feature/dashboard-sleep-trend** (aa0535e)
- **Merge pull request #2328 from zeusal/feat/translations-dynamic** (2141fe0)
- **Merge pull request #2323 from CodeWithCJ/nix/update-pnpm-hashes** (dfcb983)
- **Merge pull request #2322 from CodeWithCJ/dev** (f097f6a)
- **Merge pull request #2321 from CodeWithCJ/dev** (974e3f9)
- **Merge pull request #2311 from Bl4nk24/feat/health-connect-tdee-projection** (32bba9b)
- **Merge branch 'main' into feature/dashboard-sleep-trend** (0a2501e)
- **Repond to review comments** (de4f9dc)
- **Merge pull request #2319 from CodeWithCJ/i18n/sync-weblate-translations** (5aea394)
- **Merge pull request #2298 from Bl4nk24/codex/mobile-meal-plans** (660428e)
- **Merge branch 'origin/main' into codex/mobile-meal-plans** (150b3a9)
- **Merge pull request #2317 from CodeWithCJ/nix/update-pnpm-hashes** (c13b25b)
- **Merge pull request #2308 from CodeWithCJ/dev** (6944148)
- **bot comments.** (61c6af2)
- **Merge pull request #2307 from johnkattenhorn/docs/community-cronometer** (f8bcf69)

### Tests
- **test(mobile): scope the widget resource contract to the shipped locales** (11ecee0)
- **test(mobile): type the modules required inside chart jest mocks** (c6614db)
- **test: verify fractional quantity submission** (915ded0)
- **test: cover quantity clear and autofocus** (bc9543f)
- **test(food-search): assert the exact pageSize argument, not its presence** (18a0f21)
- **test(mobile): derive widget string keys from the Swift sources** (b7a959e)
- **test(mobile): assert widget resources structurally, not per language** (36dfbbe)

### Docs
- **docs(mobile): record the health trends layout preferences** (7bc6576)
- **docs(i18n): correct the native empty-value and qualifier claims** (573bf0d)
- **docs: point the developer translations page at the self-hosted Weblate** (0c0ed3a)
- **docs(i18n): document the mobile Weblate components** (9e84a14)
- **docs(mobile): stop the guide claiming History lists every day** (47942c3)
- **docs(mobile): document the progress photo screens and their mutation hook** (3db3822)
- **docs(testing): update preference mock example to item_display_limit** (fe364fd)
- **docs: correct the frontend i18n setup page** (928d818)
- **docs: update agent package guides and Knip configuration** (db0e35f)

### Chore
- **chore(i18n): sync non-English translations from Weblate** (e30a2b1)
- **chore(auth): update demo disclaimer title to License & Terms** (f096b19)
- **chore(auth): streamline license acknowledgement text in demo disclaimer dialog** (05e1437)
- **chore: sync db_schema_backup.sql with migrations** (0fad243)
- **chore(i18n): sync non-English translations from Weblate** (7efd07e)
- **refactor(mobile): share one reorder drag implementation** (713aeda)
- **chore: sync db_schema_backup.sql with migrations** (d9c61f1)
- **chore: sync db_schema_backup.sql with migrations** (0ab6828)
- **chore: sync db_schema_backup.sql with migrations** (190ec8e)
- **refactor: use shared numeric input for quantity** (5542bdd)
- **chore(mobile): apply repository prettier formatting** (2916f0b)
- **chore(nix): update pnpm deps hashes** (f1f284b)
- **chore: adopt Prettier 3.9.6 across all packages** (1c5fd10)
- **chore(i18n): sync non-English translations from Weblate** (498c07e)
- **chore(nix): update pnpm deps hashes** (50a7945)
- **refactor(mobile): enforce unused files rule and prune barrel re-exports** (ca9782b)
- **refactor(mobile): refine knip entrypoints and prune unused exports** (8f2fed3)
- **refactor: configure strict knip entrypoints and prune unused exports** (427a3f1)

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