feat: bundle Geist fonts locally and add F-Droid metadata (Option B) - #51
Merged
Merged
Conversation
Devasy
commented
Jun 16, 2026
Owner
- 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>
Contributor
|
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 |
Devasy
added a commit
that referenced
this pull request
Jun 16, 2026
* 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.