- NutritionParser now handles short key aliases (protein/carbs/fat instead of
proteinGrams/carbsGrams/fatGrams), string-typed numbers, surrounding prose,
and multi-line markdown fences reliably
- safeInt/safeDouble helpers check multiple key names in priority order and
handle Number, String, and missing values without throwing
- Nutrition prompt now includes an explicit JSON example so all models return
the expected format regardless of their default style
- Same fixes applied to web app parseEstimate (aliases + fence stripping)
- Extended NutritionParserTest to cover aliases, string numbers, surrounding text
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Android:
- Add adaptive app icon (blue background, white flame foreground)
- Add android:icon and roundIcon references to manifest
- Add windowSoftInputMode=adjustResize for keyboard handling
- Dark mode support via isSystemInDarkTheme() in Theme.kt
- Bump versionCode 1→2, versionName 1.0→1.1, named APK output
- Merge Trash into Diary as a tab (was a 6th bottom-nav item)
- Add sync refresh button in top bar with loading indicator
- Add CalorieGoalBar progress indicator on dashboard
- Add calorieTarget to ServerSettings, Settings screen, and API
- Add clearTrash() to ApiRepository (server route was unused)
- Fix onCancelEdit to also clear selected image state
- AiClient.kt: remove old pre-server AiClient class (replaced by ApiRepository)
- LogMealScreen: side-by-side field rows, DropdownField for meal type
Web server:
- Add calorieTarget to settings defaults and allowed field list
- Remove dead handleRequest() function (never called, Express routes it)
CI:
- Fix APK paths in android.yml and release.yml for renamed output
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>