feat: bundle Geist fonts locally and add F-Droid metadata (Option B) - #51
Conversation
Devasy
commented
Jun 16, 2026
- Remove google_fonts dependency; replace with bundled variable font files (Geist-Variable.ttf + GeistMono-Variable.ttf from Vercel v1.7.2, MIT licensed)
- Replace all 377 GoogleFonts.geist/geistMono() calls with TextStyle(fontFamily:) across 31 dart files — no runtime Google CDN fetch, F-Droid build-compatible
- Declare fonts in pubspec.yaml flutter.fonts section
- Add fdroid/metadata/com.devasy.repforge.yml with anti-features (NonFreeNet) and auto-update config for F-Droid submission
- Remove google_fonts dependency; replace with bundled variable font files (Geist-Variable.ttf + GeistMono-Variable.ttf from Vercel v1.7.2, MIT licensed) - Replace all 377 GoogleFonts.geist/geistMono() calls with TextStyle(fontFamily:) across 31 dart files — no runtime Google CDN fetch, F-Droid build-compatible - Declare fonts in pubspec.yaml flutter.fonts section - Add fdroid/metadata/com.devasy.repforge.yml with anti-features (NonFreeNet) and auto-update config for F-Droid submission Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Uh oh!
There was an error while loading. Please reload this page.
* feat: add workout summary screen and enhance app theme colors
- Implemented WorkoutSummaryScreen to display post-workout details including duration, volume, sets, and exercises.
- Added visual elements such as trophy header and muscle groups trained section.
- Refactored AppTheme to centralize color management through AppColors, improving maintainability and consistency across the app.
- Updated theme properties for better visual coherence and modern styling.
* feat: add predictive back page transitions for Android in AppTheme
* Refactor Programs Screen and add Week Structure Editor
- Updated ProgramsScreen to improve UI elements and replace AppTheme with AppColors.
- Enhanced FloatingActionButton styles and added new RFWidgets for better consistency.
- Implemented a new ProgramWeekEditorStep widget for editing week structures in training programs.
- Introduced ProgramWeekTile for displaying collapsible week cards in ProgramDetailScreen.
- Added functionality for managing deload weeks and intensity factors within the week editor.
- Improved overall code organization and readability across the modified files.
* feat: Enhance UI with new glassmorphic components and charts
- Introduced `GlassCard` with gradient background and accent border option.
- Added `AmbientGlow` for decorative ambient effects.
- Implemented `RFNavBar` for a custom bottom navigation bar with glassmorphism.
- Created `Sparkline` and `VolumeChart` widgets for data visualization.
- Developed `WheelPickerField` for weight and reps input with haptic feedback.
- Updated `WorkoutHeader` with gradient background and improved text styles.
- Refined `AppTheme` with new color definitions and text styles using Google Fonts.
- Added Google Fonts dependency for enhanced typography.
* feat: add personal records feature
- Introduced PersonalRecord model to track best weight, reps, and volume for exercises.
- Implemented PRManager to manage personal records, including checking and updating records after workouts.
- Added methods in storage service for saving and retrieving personal records.
- Updated UI to display personal records in the Analytics screen and Workout Summary screen.
- Enhanced onboarding process to prompt for user name and handle version updates.
- Refactored various screens to improve layout and user experience.
* feat: update exercise library screen tests with new icon and text changes
* feat: update .gitignore and CLAUDE.md for new graphify output and project guidelines; remove MainActivity.kt
* analytics_screen.dart
_FrequencyGrid: added w >= 0 && guard so future-dated sessions can't insert negative map keys
_MuscleVolumeChart: early-return isEmpty when maxVol == 0 (prevents NaN); converted volume display via settings.toDisplay + settings.unitLabel
dashboard_widgets.dart
startOfWeek now truncated to midnight (DateTime(y,m,d)) before subtracting weekdays — fixes the bug where sessions earlier in the day than "now" were excluded
Volume StatGridCard now uses settings.toDisplay(weeklyVolume) and 'Volume (${settings.unitLabel})'
edit_workout_session_screen.dart
drops: s.drops?.toList() — defensive copy prevents shared-mutation with the original WorkoutSession
exercise_details_sheet.dart
Added else branch on delete failure — shows error SnackBar instead of silently doing nothing
Set chips now use settings.toDisplay(s.weight) + settings.unitLabel
Growth trend label uses settings.toDisplay(growthModel.slope) + settings.unitLabel
exercise_input_section.dart
Icon(Icons.auto_awesome_rounded, …) → const Icon(…)
exercise_progress_view.dart
DropdownButton.value guarded with ids.contains(selected) ? selected : null — prevents assert/crash when the selected exercise id is no longer in the performed set
profile_sections.dart
const _SectionDivider() and const _ComingSoonBadge() constructors + all call sites updated
rf_inputs.dart
Added onLongPressEnd to _StepButton (wired to GestureDetector.onLongPressEnd)
_NumberPickerSheetState now holds Timer? _holdTimer; onLongPress assigns _holdTimer = Timer.periodic(…), onLongPressEnd cancels it, dispose() also cancels it — no more leaked timers
session_details_sheet.dart
Volume banner: settings.toDisplay(session.totalVolume) + 'Volume ${settings.unitLabel}'
Per-exercise total: settings.toDisplay(log.totalVolume) + settings.unitLabel
Per-set row: settings.toDisplay(set.weight) formatted + settings.unitLabel
targets_tab.dart
Added _isSubmitting bool; _submit guards against re-entry and wraps provider call in try/finally; GlowButton.onPressed is null while submitting
workout_flow_screen.dart
_toggleDropset: weight controller text now uses settings.toDisplay(_currentWeight) with proper decimal formatting (matching _loadLastSessionData)
_addDrop: new drop controller text also uses settings.toDisplay(newWeight)
WorkoutHeader now receives restSeconds: _restSeconds
workout_header.dart
Added optional restSeconds field (defaults to 90 for backwards compatibility); _OptionsMenu receives widget.restSeconds instead of the hardcoded literal
workout_summary_screen.dart
volStr built from settings.toDisplay(session.totalVolume); label updated to 'Volume (${settings.unitLabel})'
* feat: enhance UI components and improve data handling across screens
* feat: update ExerciseLibraryScreen tests to include SettingsProvider in widget setup
* feat: enhance workout session data collection by including weight in HealthConnectService
* feat: update Android build configuration, enhance analytics screen, and improve UI components
* feat: add muscle recovery and growth tracking features in WorkoutProvider and MLService
* feat: refactor NumberInputCard to StatefulWidget and enhance RFNavBar design
* feat: enhance ProfileScreen and ProfileSections with Google Fonts for improved typography
* feat: update Create button in ProgramsScreen to allow for non-full width display
* feat: Integrate Gemini AI features for personalized coaching and insights
- Added GeminiService for AI integration, including chat and program generation capabilities.
- Implemented GeminiContextBuilder to create context strings for AI prompts.
- Introduced _WeeklyInsightsCard to display weekly insights based on user workouts.
- Added AiSettingsSection in profile settings for managing Gemini API key and model selection.
- Updated home screen to include weekly insights and AI coach button.
- Enhanced ProgramsScreen with AI program generator button.
- Updated SettingsProvider to manage Gemini API key and insights storage.
- Added necessary dependencies for Google Generative AI.
* feat: enhance various screens and models with improved error handling, UI adjustments, and new features
* feat: improve error handling in program saving and adjust opacity calculation in body heatmap
* Add comprehensive tests for MLService, model serialization, PRManager, and WorkoutProvider
- Implement tests for MLService covering growth model training, set recommendations, default recommendations, target completion prediction, and muscle recovery score computation.
- Create model serialization tests for WorkoutSet, ExerciseLog, WorkoutSession, Exercise, MuscleGroup, Target, GrowthModel, Routine, PersonalRecord, TrainingProgram, and ProgramExerciseSlot to ensure data integrity during JSON serialization/deserialization.
- Introduce tests for PRManager to validate loading records, backfilling from sessions, checking and updating personal records, and retrieving records.
- Enhance WorkoutProvider tests to verify initialization, session and routine loading, active workout management, and exercise name retrieval.
* fix: ensure opacity calculation in heatmap drawing is explicitly a double
* chore: update version to 2.0.0+21 in pubspec.yaml
* feat: enhance UI responsiveness with layout adjustments and breakpoints across multiple screens
* feat: enhance UI layout and responsiveness with padding adjustments for floating action buttons and improved data representation
* feat: add advanced metrics toggle and display estimated 1RM badge in workout input section
* Add widget tests for AnalyticsScreen and ExerciseProgressView
- Implement comprehensive widget tests for the AnalyticsScreen, covering the Overview, Targets, and Records tabs.
- Validate functionality such as tab switching, data display, and interaction with UI elements.
- Add widget tests for ExerciseProgressView, including exercise picker, chart mode toggle, and set progression chart.
- Ensure tests cover empty states, search functionality, and interaction with various UI components.
* feat: update app label handling and improve navigation in home screen
* feat: Implement Gemini AI service for AI coach functionality (#49)
* feat: Implement Gemini AI service for AI coach functionality
- Added GeminiAiService to handle AI coach chat, program generation, and insights using Google Generative AI.
- Created IAiService interface to define the contract for AI services.
- Developed GeminiContextBuilder to construct context for AI interactions.
- Introduced ConversationManager to manage AI conversations, including persistence and active conversation logic.
- Implemented storage service methods for saving and retrieving AI conversations.
- Built AiCoachViewModel to orchestrate AI interactions and manage conversation state.
- Added unit tests for AiCoachViewModel, CoachToolService, and ConversationManager to ensure functionality and persistence.
- Updated analytics and exercise progress views to use the new GeminiAiService.
* feat: Enhance Gemini AI service with token usage tracking and UI updates for AI coach
* feat: Refactor AiCoachViewModel and related services for improved readability and error handling
* feat: Improve error handling and async behavior in Gemini AI service usage tracking
---------
Co-authored-by: Devasy Patel <110348311+Devasy23@users.noreply.github.com>
* feat: Add muscle volume trend chart and recent sessions section in MuscleDetailSheet
* docs: add conversational routine optimizer design spec
Replaces the one-shot optimizer sheet with a dedicated conversational
optimizer screen that reuses the coach streaming tool-loop, adds an
interactive ask_user_questions tool, gates on insufficient data, and
persists sessions to a separate optimizer inbox.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* refactor: remove one-shot routine optimizer (replaced by conversational flow)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: add Conversation.kind and AI question models (QuestionSpec, AnswerSpec, PendingQuestions)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: scope ConversationManager by kind ('coach' | 'optimizer')
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: add ask_user_questions tool declaration and optimizer system prompt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: add RFQuestionCard reusable widget (option chips + custom input)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: rewrite RoutineOptimizerViewModel as conversational streaming VM with ask_user_questions pausing
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: handle aborted completer and await appendMessage in submitAnswers
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: add RoutineOptimizerScreen (conversational UI with question card + history inbox)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: fix magic padding values and header button consistency in RoutineOptimizerScreen
* feat: add data gate (<3 sessions) and navigate to RoutineOptimizerScreen from routine card
* feat: add testBody method for RoutineOptimizerScreen to facilitate widget testing
* feat: add workout summary screen and enhance app theme colors (#50)
feat: add workout summary screen, health analytics, and production APK signing
- Workout summary screen with session details
- Sleep HR chart and debug log buffer - HealthHistoryManager for sleep/heart rate data
- Workout heart rate analysis and recovery metrics
- EC P-256 production keystore signing via GitHub Secrets
- Split-per-ABI APK builds for arm64, armeabi-v7a, x86_64
- FUTURE_IMPROVEMENTS.md documenting Options B & C (F-Droid, fastlane)
* test: update lastNightSleep test to sum all periods in the night window
* feat: bundle Geist fonts locally and add F-Droid metadata (Option B) (#51)
- Remove google_fonts dependency; replace with bundled variable font files
(Geist-Variable.ttf + GeistMono-Variable.ttf from Vercel v1.7.2, MIT licensed)
- Replace all 377 GoogleFonts.geist/geistMono() calls with TextStyle(fontFamily:)
across 31 dart files — no runtime Google CDN fetch, F-Droid build-compatible
- Declare fonts in pubspec.yaml flutter.fonts section
- Add fdroid/metadata/com.devasy.repforge.yml with anti-features (NonFreeNet)
and auto-update config for F-Droid submission
Co-authored-by: Devasy Patel <110348311+Devasy23@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Devasy Patel <110348311+Devasy23@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>