Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
05d491f
feat: add workout summary screen and enhance app theme colors
Devasy May 6, 2026
90426bc
feat: add predictive back page transitions for Android in AppTheme
Devasy May 10, 2026
6fe15db
Refactor Programs Screen and add Week Structure Editor
Devasy May 10, 2026
36ea469
feat: Enhance UI with new glassmorphic components and charts
Devasy May 10, 2026
9b86aad
feat: add personal records feature
Devasy May 12, 2026
8027a7c
feat: update exercise library screen tests with new icon and text cha…
Devasy May 12, 2026
f7328c9
feat: update .gitignore and CLAUDE.md for new graphify output and pro…
Devasy May 15, 2026
b7f01b0
analytics_screen.dart
Devasy May 15, 2026
e3fe4ae
feat: enhance UI components and improve data handling across screens
Devasy May 15, 2026
465e2ef
feat: update ExerciseLibraryScreen tests to include SettingsProvider …
Devasy May 15, 2026
a9743cb
feat: enhance workout session data collection by including weight in …
Devasy May 15, 2026
6a8715e
feat: update Android build configuration, enhance analytics screen, a…
Devasy May 16, 2026
9ddd6af
feat: add muscle recovery and growth tracking features in WorkoutProv…
Devasy May 16, 2026
a612864
feat: refactor NumberInputCard to StatefulWidget and enhance RFNavBar…
Devasy May 20, 2026
3e9a8ec
feat: enhance ProfileScreen and ProfileSections with Google Fonts for…
Devasy May 20, 2026
674b0ec
feat: update Create button in ProgramsScreen to allow for non-full wi…
Devasy May 20, 2026
f0dd98e
feat: Integrate Gemini AI features for personalized coaching and insi…
Devasy May 22, 2026
609180d
feat: enhance various screens and models with improved error handling…
Devasy May 22, 2026
76d5b55
feat: improve error handling in program saving and adjust opacity cal…
Devasy May 23, 2026
201bf88
Add comprehensive tests for MLService, model serialization, PRManager…
Devasy May 23, 2026
761fb2f
fix: ensure opacity calculation in heatmap drawing is explicitly a do…
Devasy May 23, 2026
f069ec8
chore: update version to 2.0.0+21 in pubspec.yaml
Devasy May 23, 2026
b64ed67
feat: enhance UI responsiveness with layout adjustments and breakpoin…
Devasy May 27, 2026
c7bfea3
feat: enhance UI layout and responsiveness with padding adjustments f…
Devasy May 28, 2026
2546d7b
feat: add advanced metrics toggle and display estimated 1RM badge in …
Devasy May 29, 2026
cce1a11
Add widget tests for AnalyticsScreen and ExerciseProgressView
Devasy May 29, 2026
5bcf86d
feat: update app label handling and improve navigation in home screen
Devasy May 29, 2026
380ae18
feat: Implement Gemini AI service for AI coach functionality (#49)
Devasy May 30, 2026
a895686
feat: Add muscle volume trend chart and recent sessions section in Mu…
Devasy Jun 1, 2026
21953c1
docs: add conversational routine optimizer design spec
Devasy Jun 8, 2026
f5b1384
refactor: remove one-shot routine optimizer (replaced by conversation…
Devasy Jun 8, 2026
4a8661f
feat: add Conversation.kind and AI question models (QuestionSpec, Ans…
Devasy Jun 8, 2026
cf82944
feat: scope ConversationManager by kind ('coach' | 'optimizer')
Devasy Jun 8, 2026
c883253
feat: add ask_user_questions tool declaration and optimizer system pr…
Devasy Jun 8, 2026
15fa743
feat: add RFQuestionCard reusable widget (option chips + custom input)
Devasy Jun 8, 2026
6116d58
feat: rewrite RoutineOptimizerViewModel as conversational streaming V…
Devasy Jun 8, 2026
f021429
fix: handle aborted completer and await appendMessage in submitAnswers
Devasy Jun 8, 2026
cfb95b4
feat: add RoutineOptimizerScreen (conversational UI with question car…
Devasy Jun 8, 2026
4b85ef3
style: fix magic padding values and header button consistency in Rout…
Devasy Jun 8, 2026
1ea67e4
feat: add data gate (<3 sessions) and navigate to RoutineOptimizerScr…
Devasy Jun 8, 2026
339b185
feat: add testBody method for RoutineOptimizerScreen to facilitate wi…
Devasy Jun 8, 2026
ff1761c
feat: add workout summary screen and enhance app theme colors (#50)
Devasy Jun 16, 2026
c77d690
test: update lastNightSleep test to sum all periods in the night window
Devasy Jun 16, 2026
7126bc6
feat: bundle Geist fonts locally and add F-Droid metadata (Option B) …
Devasy Jun 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 18 additions & 6 deletions .github/workflows/release.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -115,14 +115,26 @@ jobs:
echo "EOF"
} >> $GITHUB_OUTPUT

- name: Decode release keystore
run: |
echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 --decode > /tmp/repforge-release.jks

- name: Build APK
working-directory: ./workout-logger
run: flutter build apk --release
env:
KEYSTORE_PATH: /tmp/repforge-release.jks
KEY_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
run: flutter build apk --release --split-per-abi

- name: Rename APK
- name: Rename APKs
run: |
mv workout-logger/build/app/outputs/flutter-apk/app-release.apk \
workout-logger/build/app/outputs/flutter-apk/repforge-v${{ steps.version.outputs.value }}.apk
V="${{ steps.version.outputs.value }}"
DIR="workout-logger/build/app/outputs/flutter-apk"
mv "$DIR/app-arm64-v8a-release.apk" "$DIR/repforge-v${V}-arm64-v8a.apk" 2>/dev/null || true
mv "$DIR/app-armeabi-v7a-release.apk" "$DIR/repforge-v${V}-armeabi-v7a.apk" 2>/dev/null || true
mv "$DIR/app-x86_64-release.apk" "$DIR/repforge-v${V}-x86_64.apk" 2>/dev/null || true

- name: Sanitize ref name for artifact
id: sanitize_ref
Expand All@@ -133,7 +145,7 @@ jobs:
uses: actions/upload-artifact@v4
with:
name: repforge-v${{ steps.version.outputs.value }}-${{ steps.sanitize_ref.outputs.ref_name }}
path: workout-logger/build/app/outputs/flutter-apk/repforge-v${{ steps.version.outputs.value }}.apk
path: workout-logger/build/app/outputs/flutter-apk/repforge-v${{ steps.version.outputs.value }}-*.apk
retention-days: 7

- name: Create GitHub Release
Expand All@@ -156,7 +168,7 @@ jobs:
- **Build Date**: ${{ github.event.head_commit.timestamp }}
- **Commit**: ${{ github.sha }}
files: |
workout-logger/build/app/outputs/flutter-apk/repforge-v${{ steps.version.outputs.value }}.apk
workout-logger/build/app/outputs/flutter-apk/repforge-v${{ steps.version.outputs.value }}-*.apk
draft: false
prerelease: false
env:
Expand Down
9 changes: 9 additions & 0 deletions .gitignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -78,3 +78,12 @@ coverage.xml

# Streamlit secrets
dashboard/.streamlit/secrets.toml

# graphify knowledge graph output
graphify-out/

# Local backup exports
repforge_backup_*.json

# Claude Code project memory & session files
.claude/
10 changes: 10 additions & 0 deletions CLAUDE.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -289,3 +289,13 @@ Feature proposals live in `docs/design/`. Before implementing a major feature, c
- `wearables_integration.md`
- `workout_scheduling.md`
- `workout_sharing.md`

## graphify

This project has a knowledge graph at graphify-out/ with god nodes, community structure, and cross-file relationships.

Rules:
- ALWAYS read graphify-out/GRAPH_REPORT.md before reading any source files, running grep/glob searches, or answering codebase questions. The graph is your primary map of the codebase.
- IF graphify-out/wiki/index.md EXISTS, navigate it instead of reading raw files
- For cross-module "how does X relate to Y" questions, prefer `graphify query "<question>"`, `graphify path "<A>" "<B>"`, or `graphify explain "<concept>"` over grep — these traverse the graph's EXTRACTED + INFERRED edges instead of scanning files
- After modifying code, run `graphify update .` to keep the graph current (AST-only, no API cost).
Comment thread
Devasy marked this conversation as resolved.
92 changes: 92 additions & 0 deletions docs/FUTURE_IMPROVEMENTS.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
# Future Improvements — Open Source Store Launch

This file tracks the remaining work for Options B and C of the open-source store launch plan.
Option A (production signing + IzzyOnDroid/Obtainium) is complete.

---

## Option B — F-Droid Readiness

### 1. Bundle Geist fonts locally (google_fonts)

Currently `google_fonts` may fetch font files from Google's CDN at first launch. F-Droid requires
all network access to be under user control — a silent font download at startup fails that bar.

**Fix:** Download the Geist Sans and Geist Mono `.ttf` files, add them to `assets/fonts/`, declare
them in `pubspec.yaml` under `flutter.fonts`, and replace `GoogleFonts.geist(...)` calls with
`TextStyle(fontFamily: 'Geist')`. Then remove the `google_fonts` package.

### 2. F-Droid metadata file

Create `fdroid/metadata/com.devasy.repforge.yml` following the F-Droid metadata spec:

```yaml
Categories:
- Sports & Health
License: Apache-2.0
SourceCode: https://github.com/<your-org>/repforge
IssueTracker: https://github.com/<your-org>/repforge/issues

AutoName: RepForge
Summary: Workout logger with AI-powered coaching
Description: |-
RepForge is an open-source workout logging app with set/rep/weight tracking,
progress analytics, AI coaching (optional, requires user-supplied Gemini API key),
and Health Connect integration.

AntiFeatures:
NonFreeNet:
- description: >
Optional AI Coach and Routine Optimizer features send data to Google's Gemini API.
These features are disabled unless the user provides their own API key in Settings.

Builds:
- versionName: 2.x.x
versionCode: xx
commit: vX.X.X
subdir: workout-logger
gradle:
- release
```

### 3. Fastlane store metadata

Create `fastlane/metadata/android/en-US/` with:
- `title.txt` — "RepForge"
- `short_description.txt` — one-line summary (≤80 chars)
- `full_description.txt` — full store description
- `changelogs/<versionCode>.txt` — per-release changelog

IzzyOnDroid also reads fastlane metadata for its store listing.

---

## Option C — Strict F-Droid Compliance

### 4. Health Connect graceful degradation

Health Connect is an OS API (not Google Play Services) so F-Droid accepts it. However, for
maximum compatibility on AOSP/custom ROMs without Health Connect:

- Add an `isHealthConnectAvailable()` check at startup
- Show a "Health Connect not available" state in the Readiness screen instead of crashing
- Make daily readiness score optional in the Home screen when Health Connect is absent

### 5. Replace google_fonts package entirely

After completing item B.1, the `google_fonts` package can be removed from `pubspec.yaml` entirely.
This eliminates any risk of runtime Google CDN fetches and removes a transitive dependency.

---

## IzzyOnDroid Submission Checklist

- [ ] Merge this branch to main and confirm a production-signed release appears on GitHub Releases
- [ ] Submit via: https://gitlab.com/IzzyOnDroid/repo/-/issues (open a new issue, "App submission" template)
- [ ] Provide: repo URL, anti-features (NonFreeNet), brief description
- [ ] Wait for review (typically 1–7 days)

## Obtainium

No submission needed. Users add the GitHub repo URL directly in Obtainium and install the latest
release APK automatically. Share the repo URL in your README.
Loading
Loading