π Support SparkyFitness
Planning to buy an Android phone for app development and testing π± Your sponsorship helps cover the cost. Thank you for your support! π
If SparkyFitness has been useful to you & your family, please consider sponsoring on GitHub or supporting via Ko-fi. Your support helps cover recurring costs such as AI coding tools, development infrastructure, and Apple & Google Developer memberships to keep the project actively maintained.
Important
πΎ Upgrade Notice: Always remember to back up your database and environment before upgrading to a new version.
π Community Prioritization: Want to see a specific feature or fix in the next release? Add a π reaction to open Issues to help us prioritize what to build next!
π Key Highlights
- Lab test result management
- NFC tags for Food & Water logging.
What's Changed
Features
- feat: add tag.sparkyfitness.com site for NFC tag links by @CodeWithCJ in #3310
- feat: list the dev app in the tag site's iPhone link file by @CodeWithCJ in #3313
- feat: add a setting to read iPhone active calories from the Move ring by @SisyphusMD in #3309
- feat(mobile): build the Wear OS app in the EAS production workflow by @CodeWithCJ in #3305
- feat: log water by tapping an NFC tag by @CodeWithCJ in #3316
- feat(mobile): add keyless MapLibre OpenStreetMap map rendering on Android by @Irohoho in #3256
- feat(helm): safe defaults above one server replica by @SisyphusMD in #3302
- feat(server): add a readiness endpoint and use it for the Docker health check by @SisyphusMD in #3300
- feat(google-health): attach tracker heart rate to workouts logged in SparkyFitness by @MegaIndian in #3320
- feat(goals): optionally adjust percentage macros with exercise calories by @Bl4nk24 in #3134
- feat(mobile): lab results screens by @Jerrys-modz in #3330
- feat(hevy): add evening sync and import muscle groups by @Bl4nk24 in #3236
- feat: add OpenCode GO AI provider by @ikogan in #3283
- feat(watch): send typed weight and reps to the phone before the set i⦠by @Jerrys-modz in #3351
- feat: import lab results from a report by @Jerrys-modz in #3355
- feat(server): run each scheduled job tick on one instance by @SisyphusMD in #3358
- feat(mobile): show the effect on the day over an episode in the symptom chart by @DUC750 in #3336
- feat(mobile): show the day's logged drinks from the hydration card by @zelphir in #3352
- feat(auth): add an admin switch for magic link login and remove the broken email OTP plugin by @SisyphusMD in #3384
- feat(server): add a write route for passive health metric samples by @DUC750 in #3304
- Feat(web): lab results by @Jerrys-modz in #3374
- feat(mobile): optional one-exercise focus view for the active workout by @zelphir in #3348
- feat(backup): restore a backup with every instance running by @SisyphusMD in #3398
- feat(backup): restore a backup with every instance running by @SisyphusMD in #3406
- feat(mobile): upload all-day heart rate readings during sync by @Jerrys-modz in #3407
- feat(mobile): add trend, day timeline and range timeline to the mobile heart rate report by @Jerrys-modz in #3408
- feat: log a food or a saved meal by tapping an NFC tag by @CodeWithCJ in #3411
- feat(mobile): show overnight HRV and skin temperature on the mobile sleep detail screen by @Jerrys-modz in #3409
- feat(helm): run every server replica in one Deployment by @SisyphusMD in #3410
- feat(mobile): add in-place barcode scan recovery by @Bl4nk24 in #3394
- feat(symptoms): show the effect on the day in the symptom report and CSV export by @DUC750 in #3414
- feat(food): let the food search dialog use 90% of the window height on desktop by @zeusal in #3428
- feat(garmin): show real last sync, sync failures and service reachabi⦠by @stoamandl in #3429
- feat: add glucose timelines and saved display units +glucos CGM by @p1ranha in #3427
- feat(settings): support kilojoules (kJ) energy unit preference across web, mobile, watch and widgets by @CodeWithCJ in #3452
- feat(server): send emails in the recipient's language by @DUC750 in #3453
- feat(i18n): connect server email templates to translation sync workflow by @CodeWithCJ in #3455
- feat(reports): enable dashboard widget customization for nutrients report by @CodeWithCJ in #3454
- feat: calorie cycling for training and rest days by @CodeWithCJ in #3466
- feat(oral-care): oral care tracking, brushing timer, reports, and sync by @CodeWithCJ in #3474
- feat(mobile): add lab results and NFC tags to What's New by @CodeWithCJ in #3482
Fixes
- fix: add App Store and TestFlight links to the tag landing page by @CodeWithCJ in #3312
- fix(mobile): pair saved exercises with the server reply by id by @Jerrys-modz in #3307
- fix(symptoms): show an episode on every day it covers in the calendar by @zeusal in #3327
- chore(mobile): bump react-native-reanimated to 4.5.5 by @Jerrys-modz in #3308
- fix(mobile): route map layer order, preview padding, and screen header safe insets by @Irohoho in #3329
- fix(exercise): lock the workout row when an edit rereads it by @SisyphusMD in #3317
- fix: keep whole stones and feet when converting back from kg and cm by @jayhemnani9910 in #3331
- fix(server): honor daily sync frequency and keep last_sync_at after failed syncs by @stoamandl in #3296
- fix(backup): restore beside the live database and swap it in by @SisyphusMD in #3342
- fix(frontend): store a real image path for preset exercises by @zeusal in #3356
- fix(server): keep env OIDC issuer URL as configured by @Shrub24 in #3353
- fix(mobile): bump react-native-reanimated to 4.7.1 and worklets to 0.β¦ by @Jerrys-modz in #3354
- fix(foods): keep bulk food import progress in the database by @SisyphusMD in #3359
- fix(sleep): keep a stored sleep measurement the sync omits by @SisyphusMD in #3360
- fix(health): keep logged workouts when a health import has no source by @CodeWithCJ in #3375
- fix(mobile): split a timed-out history import window instead of retrying it by @CodeWithCJ in #3377
- fix(food-search): rank brand searches and relevant foods first by @CodeWithCJ in #3383
- fix(family): honor stored grants in the on-behalf-of header and let symptoms-only members switch accounts by @SisyphusMD in #3381
- fix(mobile): say the server can't be reached instead of "No server configured" by @CodeWithCJ in #3386
- fix(frontend): save drink and dose times correctly on clock-change days by @CodeWithCJ in #3392
- fix(ai): give check-in tools local times and keep their results small by @CodeWithCJ in #3393
- fix(health-connect): surface workout calorie read failures by @Bl4nk24 in #3369
- fix(ai): salvage cross-action key bleed in exercise tools instead of rejecting the call by @cheetahspot3 in #3341
- fix(ai): accept longer ask-user options by @dajiaohuang in #3380
- fix(compare): keep noun capitals in German metric names by @DUC750 in #3416
- fix(symptoms): store timeline times the way PostgreSQL reads them by @DUC750 in #3418
- ci(i18n): sync translations nightly and merge them before the release PR by @zeusal in #3395
- fix(mobile): keep an NFC food tag's unit a saved serving by @CodeWithCJ in #3420
- ci: merge automation PRs with a GitHub App and move release secrets to environments by @CodeWithCJ in #3422
- fix: allow custom run program ids when completing or rating workouts by @Jerrys-modz in #3436
- fix(food-providers): badge standard for swiss and swedish sources by nutrient code, import Swiss water and alcohol by @darealdemayo in #3389
- fix(stats): fall back to global recent sessions when a new preset has no history by @cheetahspot3 in #3440
- fix(labs): make lab result saves safe to retry by @Jerrys-modz in #3441
- fix: custom nutrients not saving when nothing else is changed by @tonydarcy in #3405
- fix(foods): translate the nutrient name in the Standard badge by @darealdemayo in #3442
- fix(mobile): open the photo picker after the add-image sheet closes by @MegaIndian in #3446
- fix(server): round fractional values for integer workout telemetry columns by @veszig in #3447
- fix(mobile): populate and allow editing time when adding a new food by @CodeWithCJ in #3461
- fix(food): show the weight of an Open Food Facts portion when adding a food by @zeusal in #3433
- fix(mobile): keep custom screen headers below the Android status bar by @zeusal in #3464
- fix(server): keep times faster than the sport allows out of personal records by @zeusal in #3473
- fix(fasting): resolve auto-fast completion, UUID parsing, and clock skew race conditions by @CodeWithCJ in #3476
- fix(mobile): capture and crop nutrition labels in the app by @Bl4nk24 in #3491
Documentation
- chore: require the maintainer for changes to the tag site by @CodeWithCJ in #3314
- docs(agents): move long feature notes out of the package guides by @SisyphusMD in #3303
- docs: add cloud hosting install page by @CodeWithCJ in #3337
- docs: add a code of conduct and a security policy by @zeusal in #3366
Other Changes
- chore(helm): update chart version to v1.11.0 by @github-actions[bot] in #3299
- chore: sync db_schema_backup.sql with migrations by @github-actions[bot] in #3315
- chore(umbrel): update app package to v1.11.0 by @github-actions[bot] in #3301
- chore: sync db_schema_backup.sql with migrations by @github-actions[bot] in #3328
- chore: sync db_schema_backup.sql with migrations by @github-actions[bot] in #3338
- chore(nix): update pnpm deps hashes by @github-actions[bot] in #3370
- chore: sync db_schema_backup.sql with migrations by @github-actions[bot] in #3371
- chore: sync db_schema_backup.sql with migrations by @github-actions[bot] in #3372
- chore: sync db_schema_backup.sql with migrations by @github-actions[bot] in #3391
- Revert "feat(backup): restore a backup with every instance running" by @CodeWithCJ in #3403
- chore: sync db_schema_backup.sql with migrations by @github-actions[bot] in #3419
- chore(nix): update pnpm deps hashes by @github-actions[bot] in #3432
- chore(i18n): sync translations from Weblate by @sparkyfitness-sync[bot] in #3435
- chore: sync db_schema_backup.sql with migrations by @sparkyfitness-sync[bot] in #3444
- chore: sync db_schema_backup.sql with migrations by @sparkyfitness-sync[bot] in #3451
- chore(i18n): sync translations from Weblate by @sparkyfitness-sync[bot] in #3462
- chore: sync db_schema_backup.sql with migrations by @sparkyfitness-sync[bot] in #3472
- chore(i18n): sync translations from Weblate by @sparkyfitness-sync[bot] in #3477
- chore: sync db_schema_backup.sql with migrations by @sparkyfitness-sync[bot] in #3479
New Contributors
- @Irohoho made their first contribution in #3256
- @jayhemnani9910 made their first contribution in #3331
- @MegaIndian made their first contribution in #3320
- @Shrub24 made their first contribution in #3353
- @cheetahspot3 made their first contribution in #3341
- @dajiaohuang made their first contribution in #3380
- @darealdemayo made their first contribution in #3389
- @tonydarcy made their first contribution in #3405
- @p1ranha made their first contribution in #3427
- @veszig made their first contribution in #3447
Full Changelog: v1.11.0...v1.12.0