NutriTrace
Self-hosted personal nutrition and calorie tracker
Alternative to: myfitnesspal, cronometer, lose it, waistline

About
Versions (95)
v1.0.0-rc.4
2026-04-28Fixed
- Stale diary images now self-heal. Diary items snapshot every food field at log time, including
imgUrl. If a food got an image AFTER a diary entry was logged with that food, the snapshot stayed empty forever (spread captured the empty value, snapshot semantics protected history). Cosmetic fields like images shouldn’t be frozen the same way as name/macros, so a live-lookup pass now fills emptyimgUrlfrom the foods table at read time. Applied at three layers so all surfaces inherit it:GET /api/diary/*(PWA users),/api/sync/pull(Android sync), anddbGetDiaryDate/dbGetAllDiaryindb-native.js(Android local-SQLite reads). Wrapped in try/catch so a query error never breaks the calling endpoint. New shared helper atserver/lib/diary-helpers.jsto keep server code DRY.
Changed
- Connect-to-server migration flow now shows counts and surfaces errors. When connecting from standalone mode with existing local data, the merge dialog now displays per-table counts (foods, meals, recipes, diary days, settings) so the user knows what’s about to move. The upload pass collects per-table success counts and per-row errors instead of silently
.catch(() => {})-ing them; a summary screen after the upload shows what landed and the first 5 error messages if anything failed. Progress bar replaces the vague spinner during upload. Newsrc/lib/migrate.jsshared helper. (Mirrors a recent LiftTrace improvement.)
Notes
- New
Infrastructure → OIDC / SSO supportentry inFUTURE.mdcovering Authentik / Keycloak / Authelia / Pocket-ID integration as a tracked post-1.0 enhancement.