Releases: rfivesix/train-libre
Release list
Release v0.9.25
Added
- Diary Day Export & Sharing Hub: Introduced a comprehensive "Day Export" feature directly accessible via a new context sheet in the Diary screen, allowing users to share their daily logs in two distinct formats:
- Visual Image Export: Generates a high-resolution PNG snapshot of the top macro, calorie, water, and sugar summary cards using a native
RepaintBoundarycomposition render tree, routing it seamlessly into the native system share sheet. - Granular Localized Markdown Export: Compiles a deep-dive, human- and LLM-readable Markdown document containing full nutritional breakdowns per food item (including sugar, salt, and fiber), total fluid intake tracking, complete workout logs with routine names, weights, and RIR/RPE metrics, as well as a full sleep analysis.
- Visual Image Export: Generates a high-resolution PNG snapshot of the top macro, calorie, water, and sugar summary cards using a native
- Detailed Sleep Phase & Timing Mapping: Enhanced the text export data engine to fetch and extract exact falling-asleep and waking-up timestamps alongside floating-point duration metrics for all tracked sleep phases (Deep, Light, REM, and Awake/Interruptions).
- Multi-Region Localization Strings: Fully localized all day-sharing components, summary headers, and placeholder metrics across English, German, French (
app_fr.arb), Italian (app_it.arb), and Japanese (app_ja.arb) resource bundles to ensure strict compliance with the global localization pipeline.
Changed
- Decoupled Exercise / Wger Catalog Sync: Extracted the exercise database sync and update logic from the default automatic startup path (
checkForBasisDataUpdate()) into a new publicimportExerciseCatalog()method. The exercise database is now only updated when manually triggered by the user or during database initialization, preventing startup slowdowns. - Unified Settings Sync Action: Combined the exercise update action with the manual food database update card in Settings, which now triggers a sequential update of both the food and exercise databases with unified progress tracking.
- Refactored Interactive Diary AppBar: Streamlined the top navigation layout of the main Diary scaffold to maximize interactive ergonomics and reduce visual noise:
- Transformed the static date title into a fully interactive core navigation control, wrapping the left and right date-increment chevrons (
Icons.chevron_left/Icons.chevron_right) directly around the central date string. - Converted the date string itself into a trigger target that invokes the primary calendar date picker sheet upon touch, completely eliminating the redundant central calendar icon button.
- Relocated and consolidated all primary trailing actions cleanly into the right header container, positioning the new
Icons.share_outlinedbutton immediately to the left of the static profile picture avatar.
- Transformed the static date title into a fully interactive core navigation control, wrapping the left and right date-increment chevrons (
Fixed
- Sleep Sync Freeze & Progress Bar Repair: Resolved a database deadlock that froze the manual 90-day Sleep Sync at the last iteration (e.g. "Importing Night 58/58...") by removing nested
_db.transaction(...)blocks from the custom sleep database access objects (SleepRawImportsDao,SleepCanonicalSessionsDao,SleepCanonicalStageSegmentsDao,SleepCanonicalHeartRateSamplesDao,SleepNightlyAnalysesDao). Refined the pipeline progress calculation to allocatetotalSessions + 5total steps and report an out-of-bounds progress value (-1.0) at initialization, enabling an active indeterminate scanning animation during heavy background isolate calculations before transitioning to determinate progress updates through the database writing phase. - Multilingual Database Sync Labels: Updated settings database sync labels (
settingsUpdateFoodDatabase,settingsUpdateFoodDatabaseSubtitle,settingsUpdateFoodDatabaseSuccess,settingsUpdateFoodDatabaseError) in Japanese (app_ja.arb) to refer to both the food and exercise databases rather than just the food database, aligning with German, English, French, and Italian translations.
Release v0.9.24
Added
- Unified Long-Running Operation UI & Cooperative Cancellation: Introduced a reusable progress overlay (
LongRunningOperationOverlay) wrapping operations inPopScope(canPop: false)to prevent route popping. AddedCancellationTokenandOperationCanceledExceptionutilities to support cooperative cancellation of intensive background tasks. - Multilingual Support for Progress States: Integrated fully localized progress strings across German, English, French, Italian, and Japanese resource bundles for all long-running stages.
Changed
- Optimized Sleep Import Windowing: Re-introduced a rolling 72-hour delta-sync lookback window for standard UI and Diary interactions to keep page transitions fluid and prevent main-thread lag.
- Manual Deep History Sync: Explicitly delegated historical syncs (90 days) to a manual action via the Sleep Settings screen using a new
forceFullSyncparameter. - Transactional Backup & Import Safety: Updated the database backup export/import features to accept cancellation tokens and report table-level progress. Extended backup import to execute inside a single Drift SQLite transaction with savepoints to guarantee an atomic database rollback if canceled.
- Preferences State Rollback: Implemented automatic state restoration for
SharedPreferencesif a backup import operation is cancelled mid-way. - Test Suite Realignment: Updated mock test classes (
FakeSleepImportServiceand_FakeSleepSettingsService) across the widget and unit test suites to align with the updatedimportRecentmethod signature.
Fixed
- Health Connect Permissions Crash (
ActivityNotFoundException): Patched a native Android runtime crash caused by unsupported contract intents when requesting permissions under the standardFlutterActivity. RefactoredMainActivity.ktto dispatch requests using the nativeActivityCompat.requestPermissionsutility and handle results uniformly inonRequestPermissionsResultandonActivityResult. - Static Analysis Warnings: Resolved unused fields and variables (
_isFullBackupRunning,_isSleepImporting, andunknownexercise list) and addresseduse_build_context_synchronouslywarnings across settings screens usingcontext.mounted. - Android Predictive Back Gestures: Resolved a platform-specific issue where the native predictive back gesture would fail or freeze on Android/GrapheneOS devices. Refactored the core Android container
MainActivityto inherit from the standardFlutterActivityinstead ofFlutterFragmentActivity, eliminating fragment lifecycle dispatcher conflicts. Ported the internal Health Connect permissions launcher and Storage Access Framework directory picker launcher to use the base SDKstartActivityForResultandonActivityResultcallbacks to maintain full compile-time compatibility with standard activity lifecycles. - Sleep Data Import Ingestion (7 out of 90 nights): Resolved a critical bug causing long historical imports to starve or skip valid entries by correcting lookback window truncations.
- Idempotent Sleep Session Overlaps: Refactored overlapping session rules to prevent shorter naps or duplicate records from being completely discarded. Non-enveloping sleep sessions can now safely coexist, and identical boundaries trigger precise updates instead of omissions.
Release v0.9.24-beta.1
Added
- Nested Locked Glassmorphic Adaptive Scopes: Introduced nested, locked
GlassAdaptiveScopewrappers (minQuality: GlassQuality.premium, maxQuality: GlassQuality.premium) around the bottom navigation bar, workout overlay, and FAB. This prevents these core elements from being downgraded by the performance-driven global adaptive quality ceiling during frame-dropping screen transitions.
- Global App Localization (FR, IT, JA): Expanded native multi-language support across the entire frontend architecture, incorporating over 1,300 fully translated keys per language (
app_fr.arb,app_it.arb,app_ja.arb). - Dynamic Web Template i18n: Implemented client-side localized script dictionaries within
docs/script.jsand expanded selection dropdowns across all HTML compliance pages (landing page, privacy, terms, recovery, etc.). - Targeted Country Pipelines: Upgraded the Open Food Facts pipeline (
create_off_food_db.py) to generate dedicated localized SQLite asset databases for France (fr), Italy (it), and Japan (jp), prioritizing local language tags.
Changed
- Relational Database Migration (v22 -> v23): Refactored the rigid, fixed-column translation model into a highly scalable, modular 1:N relational schema for exercises and user-food overrides (
exercise_translationsanduser_food_override_translations). - Relational Fallback Resolvers: Replaced old static queries with robust SQLite
LEFT JOINandCOALESCEstatements to dynamically resolve active UI strings with graceful fallback chains down to English and German. - Automated Catalog Workflows: Updated the weekly
wgerPython catalog fetcher (create_wger_exercise_db.py) and corresponding GitHub Actions to automatically export into the new 1:N relational layout. - Web Screenshot Fallbacks: Configured the localized web templates to dynamically map
fr,it, andjascreenshots directly to the existing verifieden-USdirectory, avoiding duplicate storage overhead.
Fixed
- Bottom Navigation Bar Quality Degradation: Fixed a bug where returning from route transitions (such as speed dial option screens) demoted the navigation bar to medium quality (frosted fallback) while leaving the sibling action button in premium quality.
- Static Analysis Cleanup: Resolved all remaining static analysis warnings by removing the unused
_isRouteActivefield, deleting redundantdidPushNext()anddidPop()overrides, cleaning up unnecessarydart:uiimports, and globally suppressingexperimental_member_usewarnings for the liquid glass widgets API.
- Recovery Screen Muscle Tracking: Patched the muscle fatigue calculation algorithm by updating the workout history queries to join the new
exercise_translationstable, resolving a bug where exercise names evaluated to null. - Base Food Language Toggle: Fixed a localization lock in the settings menu by refactoring
BasisDataManager._performBatchImportto correctly ingest the precompiled flat columns (name_fr,category_ja, etc.) fromtrain_libre_base_foods.dband adding dynamic runtime entity getters.
Release v0.9.23
Changed
- SpeedDial Overlay Quality Isolation: Decoupled the speed dial action buttons from dynamic performance telemetry and forced them to render with standard quality (
GlassQuality.standard), eliminating dynamic quality degradation or toggling.
Fixed
- Bottom Navigation FAB Glassmorphic Blur Mismatch: Fixed a visual discrepancy where the bottom navigation bar's circular FAB lost background blur (rendering flat white) when quality downgraded to
minimal. Refactoredmain_screen.dartto bypass the package's built-inextraButtonparameter, instead implementing a layout composition with a custom siblingAdaptiveGlasswidget configured withisInteractive: falseto guarantee consistent glassmorphic blur across all rendering quality levels. - Fix: Restricted calorie adjustment notification banner strictly to the current date view in Diary.
- UX: Configured 3-Zone master cards in Recovery Tracker to be collapsed by default for faster scanning.
- UI: Removed leading food icons and converted vertical meal lists into space-adaptive horizontal grids.
- Nutrition Hub Card Overflow Fix: Removed 12px default nested padding from horizontal meal overview cards, preventing layout overflows when translated action strings wrap to multiple lines.
- Light Mode Bottom Sheet Container Harmonization: Corrected white-on-white visibility issues in workout and supplement selection bottom sheets under Light Mode by resolving card backgrounds to a transparent black color, ensuring outlines are clearly visible.
Release v0.9.22
Added
- Dynamic Glassmorphic Shader Quality Degradation: Implemented
GlassPerformanceManagersingleton to dynamically adjust glass rendering quality (premium,standard,minimal) based on sliding-window raster FrameTiming performance and hardware frame budgets. - Route-Aware Render Complexity Gating: Integrated invisible route-aware quality transitions to apply quality downgrades on push-route transitions and quality upgrades on pop-route re-entry.
- Fade-Transition Shader Cross-Fade Shield: Refactored the persistent
RunningWorkoutOverlayto perform quality shader swaps at zero opacity via a 120msFadeTransitionanimation shield to eliminate quality "pop-in" visual flicker. - Speed Dial Quality Binding: Wired the
SpeedDialMenuOverlayaction buttons to consume active manager quality dynamically using aValueListenableBuilder. - Expanded Recovery Tracker Muscle Groups: Expanded the master tracking array to track 13 primary muscle groups, adding
Muscle.adductors,Muscle.lowerBack, andMuscle.forearmsto target lists, status badges, and recovery calculations.
Changed
- Centralized Design Constants: Migrated and refactored all glassmorphic widgets (
GlassBottomNavBar,GlassFab,GlassPillButton,RunningWorkoutOverlay,GlassBottomMenu,SpeedDialMenuOverlay) to utilize unified styling tokens defined inDesignConstants(glassShadow,glassNeutralTint,glassColor, andliquidGlassSettings). - Removed Android Bottom Bar Quality Override: Removed target platform checks that restricted the bottom navigation bar's tap indicator to standard/medium quality on Android devices, allowing it to leverage dynamic/configured quality settings.
- 3-Zone Accordion Compacting Architecture for Recovery Tracker: Refactored the scrollable list layer in
recovery_tracker_screen.dartto group all 13 core muscle metrics into exactly three master expandable categories based on recovery status: "In Erholung" (In Recovery - expanded by default), "Gemischt / Bereit" (Mixed / Ready - expanded by default), and "Frisch" (Fresh - collapsed by default). Each zone card features a color-coded status dot, a horizontal minimalist muscle preview chip loop, an animated rotation disclosure chevron, and smooth expansion/collapse cross-fade transitions.
Fixed
- Liquid Glass Shadow Clipping: Integrated
ShadowOuterClipperacross all Liquid Glass components (bottom navigation, FAB, workout overlay, speed dial actions) to strictly clip drop shadows from behind the transparent glass elements, keeping the backgrounds bright and translucent. - Anatomical Body Highlighter Canvas Mappings: Synchronized SVG path mappings in local package
flutter_body_highlighter(and bumped version to 1.0.3) to resolve blank forearms, map lateral head triceps (front view), neck muscles (back view), erector spinae (lower back), isolated tibialis anterior (shin-adjacent), and inner-thigh adductors insertion (back view). - Neck & Traps Visual Merge: Merged the posterior neck SVG paths directly into the
trapeziusmap entry influtter_body_highlighter(v1.0.3) and routed all legacy neck/lower neck raw mappings to thetrapeziustoken to eliminate the uncolored gap on the back view. - Adductor Logging Pipeline Repair: Fixed the state query aggregation pipeline to resolve naming variance drops for adductors by mapping raw input strings to major muscle groups before fatigue load evaluation threshold filtering.
Open Food Facts Catalog (jp, stable channel)
OFF Food Catalog Refresh (JP)
- Version:
202608170704 - Generated at:
2026-08-17T07:04:28+00:00 - Country code:
jp - Country filter tags:
en:japan, en:jp - Imported products:
40193 - Rejected rows:
4634754 - Duplicate barcodes skipped:
0 - Diff removed barcodes:
0 - Diff added barcodes:
305 - Diff changed barcodes:
45
This is a data-artifact release channel used by app-side Open Food Facts catalog refresh.
Open Food Facts Catalog (it, stable channel)
OFF Food Catalog Refresh (IT)
- Version:
202608170705 - Generated at:
2026-08-17T07:05:43+00:00 - Country code:
it - Country filter tags:
en:it, en:italy - Imported products:
217025 - Rejected rows:
4457922 - Duplicate barcodes skipped:
5 - Diff removed barcodes:
3 - Diff added barcodes:
123 - Diff changed barcodes:
211
This is a data-artifact release channel used by app-side Open Food Facts catalog refresh.
Open Food Facts Catalog (fr, stable channel)
OFF Food Catalog Refresh (FR)
- Version:
202608170709 - Generated at:
2026-08-17T07:09:32+00:00 - Country code:
fr - Country filter tags:
en:fr, en:france - Imported products:
873672 - Rejected rows:
3801275 - Duplicate barcodes skipped:
17 - Diff removed barcodes:
67 - Diff added barcodes:
1870 - Diff changed barcodes:
2058
This is a data-artifact release channel used by app-side Open Food Facts catalog refresh.
0.9.21
0.9.21
This release establishes an identical material identity across our visual branches, focusing on standard glass rendering passes, light mode tint harmonization, and depth layer unification.
What's New
Default Visual Style Switch
- Default Configuration Swap: Altered the out-of-the-box user preference default inside
ThemeServicefrom "Flüssig (Liquid Glass)" (index1) to "Standard (Glas)" (index0). New application installations will now initialize with the refined standard frosted glass configuration as their default baseline framework.
Bug Fixes & Optimization
Standard Glass Shader Pipeline Upgrade
- Core Shader Migration: Upgraded the standard visual style (
visualStyle == 0) branch across all major interface structures, includingGlassBottomNavBar,GlassFab,GlassPillButton,RunningWorkoutOverlay,GlassBottomMenu, andSpeedDialMenuOverlay. - Legacy Filter Elimination: Replaced the native Flutter
BackdropFiltercontainer fallbacks with the unifiedAdaptiveGlassshader pipeline from theliquid_glass_widgetsecosystem, successfully marrying the advanced depth, grain, and refraction mechanics of the new library with our rigid, unwarped geometric layouts.
Light Mode Tint Harmonization
- Burnout & Muddy Color Resolution: Resolved a blending error where the bottom bar and FAB components either clipped into flat white or rendered a dirty-grey tone when the device layer toggled into Light Mode.
- Background Value Matching: Synchronized the background properties to a semi-transparent white tint (
Colors.white.withValues(alpha: 0.10)), matching the working environment of theRunningWorkoutOverlayto secure a smooth glass transition.
Ambient Shadow Matrix Unification
- Depth Map Equalization: Unified the multi-layered depth maps by injecting our premium ambient shadow matrix across both standard (
visualStyle == 0) and liquid (visualStyle == 1) interaction shells. - Shadow Parameter Standards: Applied a matching
BoxShadowvector (blurRadius: 12,offset: Offset(0, 6),Colors.blackat30%opacity) to the navigation deck and FAB layers, removing the visual color rift and restoring physical layout parity across all floating components.
What's Changed
Full Changelog: v0.9.20...v0.9.21
0.9.20
0.9.20
This release introduces a profound visual synchronization of our user interface. We have eliminated layout friction and legacy asset scaling to establish a premium, high-fidelity design system that feels completely fluid, quiet, and balanced.
What's New
Next-Gen Glassmorphic UI & Fluid Layouts
- Engine Migration: Transitioned the entire glass rendering layer to the powerful
liquid_glass_widgets(v0.15.0) framework. The primary navigation deck (GlassBottomBar) and the quick action button (FAB) now merge organically, throwing a homogeneous, physically accurate shadow map across active layouts.
Minimalist Icon System & Color State Refactor
- Lucide Icons Integration: Migrated the entire application navigation shell and active workout tracking overlays to the open-source
flutter_lucideasset repository. - Pure Color State Toggle: To prevent visual jitter and layout popping during touch interactions, all assets retain identical geometry across states.
- Focus Through Color: State differentiation is now handled exclusively via chromatic shifts using our signature Chartreuse accent for active tabs and a clean, muted onSurface configuration for inactive paths.
- Diary:
LucideIcons.notebook - Workout:
LucideIcons.dumbbell - Analytics:
LucideIcons.chart_no_axes_column - Nutrition:
LucideIcons.utensils - Workout Timer:
LucideIcons.clock(scaled strictly to size 20 for uniform line-weight parity)
- Diary:
Bug Fixes & Optimization
- Compact & Clean Tab Labels: Fixed a regression inside the navigation view where an uninherited Material context caused text labels to fall back to aggressive system scaling and render with yellow error underlines. The components have been wrapped in a proper
Materialwidget context and clamped to our absolute compact design token (fontSize: 11.0,fontWeight: FontWeight.w600,fontFamily: 'Inter',letterSpacing: -0.2). - Collision Fix in RunningWorkoutOverlay: Fixed a critical layout error where the workout tracking bar overlapped the boundaries of the navigation deck. Introducing a precise
8pxvertical layout clearance offset ensures both interface structures sit stacked in a clean geometric hierarchy. - Timer Typography Standardization: Extracted the elapsed duration clock from inaccurate system fonts and bound the node configuration explicitly to our centralized
titleMediumtext theme (Inter, Bold), securing a static, jitter-free character grid during live second updates.
Dependency Updates
- Added:
flutter_lucide: ^1.11.0(FOSS-compliant & fully tree-shaken for minimal binary foot-print) - Removed: Legacy experimental icon sets.
Full Changelog: v0.9.19...v0.9.20