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

_252+ commits._

### Features
- **feat(server): require BETTER_AUTH_SECRET instead of minting a throwaway one** (e596496)
- **feat(env-generator): offer the Garmin China region flag** (6804970)
- **feat(env-generator): hide the generated file until it is asked for** (5334c06)
- **feat(server): provision the application database role automatically** (02e2b40)
- **feat(mobile): per-row variant switching and local search-result multi-select** (79f7a43)
- **feat(mobile): add multi-add review screen and wire Review action (#1980)** (7903cd8)
- **feat(mobile): add batch submit hook with per-row outcome classification** (03a52eb)
- **feat(mobile): move the multi-select basket into a shared store with drafts and outcomes** (6fa9c64)
- **feat(mobile): add multi-select mode to food search landing lists** (18231ec)
- **feat(mobile): add food search selection basket hook** (82d2b7f)
- **feat(mobile): add multi-add payload conversion util for food search batch logging** (e161327)
- **feat(admin): move operator policy toggles into settings, migrate docs to VitePress** (305037e)
- **feat(polar): expand Polar AccessLink integration with cardio load, intraday samples, and temperature** (c5a1d39)
- **feat(mobile): ship German (de) as a shipped locale** (419e0ee)
- **feat(mobile): add German Android widget strings (values-de)** (6f08e98)
- **feat(mobile): ship German (de) as a shipped locale (registry, resources, native surfaces)** (5fb62fc)

### Fixes
- **fix(i18n): use the Weblate widget translations for the newly shipped locales** (b8701f6)
- **fix(i18n): sync web and mobile language pickers with the shipped catalogs** (4a524c4)
- **Merge pull request #2546 from CodeWithCJ/fix/mobile-ship-chinese-locales** (013ec78)
- **fix(mobile): finish shipping the Chinese and Cantonese locales** (80d6a59)
- **Merge pull request #2537 from lukyjay/patch-2** (b3cd18a)
- **fix(ai): document the local-model timeout default and cover it with tests** (0b79033)
- **Merge pull request #2539 from micfat888/patch-4** (f83f96f)
- **Merge pull request #2538 from micfat888/patch-3** (b31a219)
- **fix(docs): make the generated .env preview follow the site theme** (11bd9ba)
- **fix(docs): restore the navigation order lost in the VitePress migration** (85b2251)
- **fix: address review findings on env generator, docs and mock-data capture** (82154ee)
- **fix(auth): generate BETTER_AUTH_SECRET as base64, matching how it is read** (838d7ac)
- **fix(env): make the documented database and server-port variables actually work** (7b6dd21)
- **fix(env-generator): derive the quick-fill ports from the published port** (772385a)
- **fix(env-generator): keep ports in step with the URLs that embed them** (dcff63d)
- **Merge pull request #2535 from SisyphusMD/fix/force-email-login-precedence** (73067a2)
- **Merge pull request #2534 from SisyphusMD/fix/oidc-trust-refresh** (a19a5e6)
- **perf(mobile): defer the per-row variant fetch on the multi-add review screen** (ed047d4)
- **fix(auth): honor forced email login when password login is disabled** (ca4a7b9)
- **fix(mobile): disable the bulk meal picker while a batch is submitting** (d93a1c5)
- **fix(mobile): address maintainer review — picker-mode basket gate, spacing, meal-type validation, scoped goBack guard** (5b1581a)
- **fix(mobile): release the batch latch only while its generation owns it** (a03e56d)
- **fix(mobile): address CodeRabbit review — derive submit state from store, NaN-safe steppers, batch cancellation** (917c9e5)
- **fix(mobile): let the success pop escape the in-flight beforeRemove guard** (40aa6d7)
- **fix(mobile): address final cross-review — quantity denomination, submission lock, identity isolation** (2c14c82)
- **fix(mobile): guard photo logging for basket-origin scans; report select-all truncation honestly** (f5c894c)
- **fix(mobile): honor explicit returnDepth and keep the basket alive across single adds** (afb4642)
- **fix(mobile): make selection basket capacity checks batch-safe** (a6297d7)
- **fix(docker): align storage path defaults with compose and always emit them** (e14d7db)
- **fix(integrations): restrict mock-data replay to admins and fail policy lookups closed** (d0855b9)
- **Merge pull request #2530 from SisyphusMD/fix/oidc-admin-secret** (16553d6)
- **fix(auth): refresh trusted SSO origins per request** (be2e7ae)
- **fix(auth): remove masked secrets from OIDC admin responses** (42f3598)
- **fix(polar): reject impossible calendar dates in timestamp parsing** (7943384)
- **fix(polar): harden timestamp parsing and finish the timezone cleanup** (2347a47)
- **fix(reports): stop the intraday chart clipping negative readings** (ab9fa22)
- **fix(polar): stop intraday samples overwriting each other and drifting days** (dac4aae)
- **fix(mobile): invalidate and refetch active caffeine on food entry mutations and pull to refresh** (d26b913)
- **fix(polar): match AccessLink payload shapes for the new metrics** (e14eb6a)
- **Merge pull request #2525 from CodeWithCJ/fix/polar-daily-metrics-2471** (e4de12c)
- **Merge pull request #2522 from SisyphusMD/fix/oidc-env-startup** (df8d309)
- **fix(polar): order the calorie snapshot by Polar's end_time** (1b5ca2b)
- **fix(polar): address review findings on daily metrics sync** (61d5ae5)
- **fix(polar): surface daily activity metrics in reports and diary** (4c7e0e6)
- **fix(auth): reuse OIDC connections after successful rollback** (be888c7)
- **fix(mobile): keep the basal read from aborting distance and steps** (4366f76)
- **fix(auth): serialize environment OIDC provider reconciliation** (bda3e1f)
- **fix(mobile): explain the sync choice under each option** (e0662bd)
- **fix(mobile): correct the sync choice labels** (97ec8c3)
- **fix(mobile): make the sync choice readable at a glance** (d5c340a)
- **fix(mobile): clarify the sync choice wording** (f50c96c)
- **fix(reports): correct workout pace, elevation and NULL-rendered stats** (cb1cccd)
- **Merge pull request #2516 from CodeWithCJ/fix/outbound-ipv6-connect-timeout** (db52e65)
- **fix(auth): reconcile environment OIDC providers atomically** (2768fe0)
- **fix(integrations): size the connect attempt timeout from measured evidence** (433e75b)
- **fix(withings): stop echoing raw error detail in 500 responses** (4c585a3)
- **fix(withings): skip measure groups that carry no measures** (7a84b0e)
- **Merge pull request #2509 from SisyphusMD/fix/oidc-provider-update-identity** (cb47376)
- **fix(integrations): stop provider connections hanging on broken IPv6** (443c684)
- **fix(auth): preserve stored OIDC client IDs during updates** (9c31ae2)
- **fix(mobile): allow late-arriving heart rate telemetry in health sync (#2511)** (d70d964)
- **Merge pull request #2513 from aguspatur22/fix/issue-2458-bug-mealie-recipes-use-recipeservings** (c3d1c11)
- **fix(auth): retain OIDC domain when omitted from updates** (2c21520)
- **fix(auth): accept null OIDC scopes on update** (9307f8d)
- **fix(liftosaur): stop paginating when the cursor does not advance** (fd12ed7)
- **fix(mealie): import recipes as a one-serving food variant** (2964dbe)
- **fix(auth): validate optional OIDC update fields** (c117c40)
- **fix(auth): validate required OIDC update fields** (ec71384)
- **fix(mobile): address CodeRabbit review on German localization** (84f4c21)
- **fix(auth): return 404 for missing OIDC providers** (35fc3c6)
- **fix(liftosaur): gate sync, status and disconnect on the diary permission** (977aa44)
- **Merge pull request #2499 from Dragonk/fix/mcp-data-consistency** (77e6ef9)
- **fix(liftosaur): keep library writes out of the sync transaction** (92839bd)
- **Merge pull request #2384 from zeusal/fix/mobile-rest-timer-background-sound** (07a8562)
- **fix(mobile): Address review comments** (15dc7be)
- **fix(auth): preserve resolved OIDC provider identity during updates** (4960918)
- **fix(mcp): address maintainer feedback** (5909b9b)
- **fix(ai): document that preset_name is owner-or-family only** (feaeac1)
- **fix(ai): resolve preset names as owner-or-family, not every public row** (8863e00)

### Backend
- **Merge pull request #2548 from CodeWithCJ/dev** (5a43ff9)
- **Merge pull request #2547 from CodeWithCJ/dev** (565e175)
- **version update** (be022fa)
- **Merge pull request #2544 from CodeWithCJ/i18n/sync-weblate-translations** (f65d413)
- **Merge pull request #2542 from CodeWithCJ/ci/schema-backup-sync** (1244b93)
- **Merge pull request #2533 from CodeWithCJ/dev** (737e840)
- **Mobile Update localeRegistry.json** (9d8a137)
- **Frontend Update localeRegistry.json** (eada70c)
- **Update localeRegistry.json** (fc9cb89)
- **Update localeRegistry.json** (4ef866f)
- **Provide extended AI timeout for local models** (1d36b06)
- **Merge main into dev, and address the review findings** (9e16632)
- **Merge pull request #2515 from sheepdogs/feature/1980-multiselect-food-entries** (b2557dc)
- **Merge pull request #2528 from CodeWithCJ/dev2** (7c9a9df)
- **Merge pull request #2529 from CodeWithCJ/ci/schema-backup-sync** (6c71e8c)
- **Merge main into dev2** (d2d4d44)
- **Merge pull request #2527 from CodeWithCJ/dev** (e434514)
- **Merge pull request #2526 from CodeWithCJ/ci/schema-backup-sync** (2f06c52)
- **Merge pull request #2524 from CodeWithCJ/dev** (3d5eeac)
- **Merge pull request #2517 from SisyphusMD/docs/oidc-update-request-body** (31d87d0)
- **Merge pull request #2454 from Flexingg/feat/liftosaur-integration** (4becdca)
- **Merge pull request #2510 from DUC750/feat/german-mobile-localization** (8738f21)
- **delete probe junk** (08768a0)
- **probe** (719d45a)
- **Merge pull request #2496 from Odisseuss/feat/mobile-hydration-reminders** (e455fcd)
- **Merge pull request #2501 from Jerrys-modz/feat/workout-preset-crud** (08c013e)
- **Merge remote-tracking branch 'upstream/main' into feat/liftosaur-integration** (821eb18)

### Tests
- **test(frontend): derive the Adaptive TDEE density check from the catalog** (7c3a21b)
- **test(server): stub the application-role probe in the connection-ownership tests** (6f9aec6)
- **test(auth): cover existing OIDC provider reconciliation deadlocks** (ba4c931)
- **test(server): restore the net connect-attempt default after outbound tests** (2c4bc2f)
- **test(mealie): cover the recipe to food variant mapping** (7564d74)
- **test(mcp): cover kJ nutrition conversion** (08c9064)

### Docs
- **docs(env): document the bare-metal path overrides and advanced OIDC settings** (2248ef2)
- **docs(env-generator): describe passwordless sign-in rather than SSO** (07a7758)
- **docs(env-generator): warn that superuser credentials are fixed at first init** (86810ca)
- **docs(env-generator): warn that the generated file needs checking** (23a0772)
- **docs(auth): explain email login override and demo guard** (62331cc)
- **docs(env-generator): reorganise around what a standard install actually needs** (8a2b031)
- **docs(env): expose the hidden runtime settings and realign .env.example** (e73b2d5)
- **docs(env-generator): reorder modules by what operators reach for first** (9031eab)
- **docs(auth): document OIDC update request fields** (659d3d0)
- **docs(auth): document OIDC update responses** (bc5bf84)
- **docs(auth): clarify environment OIDC provider IDs** (5a0e2e3)

### Chore
- **chore(i18n): sync non-English translations from Weblate** (2bf409d)
- **chore: sync db_schema_backup.sql with migrations** (999280c)
- **style(docs): use the full window width for documentation pages** (3754f09)
- **refactor(env-generator): order the modules by how often they are needed** (a981a1b)
- **refactor(env-generator): group the output actions on one row** (ac5af22)
- **chore: sync db_schema_backup.sql with migrations** (4fdabad)
- **chore: keep the Polar expansion plan out of the feature PR** (9d554dd)
- **chore: sync db_schema_backup.sql with migrations** (1208433)
- **refactor(auth): share OIDC provider configuration preparation** (15054f5)
- **chore(mobile): remove German translation files from main repo** (552df4f)
- **refactor(liftosaur): cut to import-only sync and enforce strict transaction handling** (1f414f6)

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