Kegel pelvic floor trainer — Expo/RN MVP
Some checks failed
Build & Release APK / build (push) Failing after 15s

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>
This commit is contained in:
2026-08-15 00:30:04 -07:00
commit 0dc1bd47a7
69 changed files with 9398 additions and 0 deletions

42
README.md Normal file
View File

@@ -0,0 +1,42 @@
# Kegel
Pelvic floor trainer for sexual performance — a free, local-only take on what
Stamina was before it went paid. Expo / React Native, Android + iOS.
## How it works
A session is four guided blocks driven by a step timer with haptic cues:
1. **Holds** — 8 × squeeze-and-hold. This is the progressive-overload driver:
holds start at 5s and grow **+1s every 3 completed sessions** (capped at
30s). Manual ±1s adjustment in Settings.
2. **Pushes** — 5 × reverse kegel (gently bear down). Scales at half the rate
of holds, capped at 12s.
3. **Quick squeezes** — 10 × 1s burst contractions with 1s release.
4. **Quick pushes** — 10 × 1s burst pushes with 1s release.
Progress (session count, difficulty adjustment) lives in AsyncStorage — no
server, no account.
## Layout
- `src/app/` — expo-router screens: `index` (home), `session` (timer), `settings`
- `src/lib/workout.ts` — pure session-plan + progression logic
- `src/lib/store.ts` — tiny local store persisted to AsyncStorage
- `android/` — committed prebuild output; CI builds it directly
## Development
```sh
npm install
npm start # Expo dev server
npm run typecheck
```
## Release
Push to `main` → Gitea Actions on the desktop runner (`runs-on: desktop`,
never the VPS) builds a signed APK and publishes a Gitea release — install via
Obtainium. Keystore: `~/.android-keys/kegel-release.jks` (repo secrets
`KEYSTORE_B64`, `KEYSTORE_PASSWORD`; alias `kegel`). iOS runs via
`npx expo run:ios` from a Mac.