- eas.json production/simulator profiles; iOS plist flags; EAS project linked
- literal versionCode/versionName in build.gradle so EAS can parse it; Gitea CI
stamps the run number with sed instead of env-driven gradle expressions
- store/: listing copy + keyword rationale, screenshot composer (headless
Chrome), raw simulator captures, rendered App Store / Play slides, feature
graphic, privacy policy source, icon generator
- replace Expo placeholder icon with the session-ring mark; regenerate Android
launcher/splash res and theme colours
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WontRuPqKcod9XK4ZN9MXv
Session count alone says nothing about consistency, which is what makes
pelvic floor training work. Record every completion timestamp and derive
streaks from local calendar days: current streak (survives until a full
day is missed), best streak, and a 14-day dot strip on the home screen.
The done screen now shows the streak so finishing is rewarded.
- src/lib/streak.ts: pure day-key / streak logic, covered by node --test
- store: new `sessions` array, defaulted for pre-existing installs
- home: StreakCard, screen now scrolls for smaller phones
- tsconfig: TS 6 no longer auto-includes @types, so declare node types
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Guided session timer: progressive squeeze-holds (5s +1s/3 sessions, cap
30s), reverse-kegel push holds, quick flicks in/out. Local-only progress
in AsyncStorage; signed APK via Gitea Actions on the desktop runner.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>