Marcus Rehbock 6e7e28a38d
All checks were successful
Build & Release APK / build (push) Successful in 4m11s
Retrigger CI (transient npm ECONNRESET)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-15 00:33:55 -07:00

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

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.

Description
Him: Kegel Exercises for Men — free, open-source, offline pelvic floor trainer for iOS & Android (Expo/React Native). MIT.
https://rehbock.xyz/kegel/privacy.html Readme MIT 4.5 MiB
v1.6 Latest
2026-08-18 06:12:31 +10:00
Languages
TypeScript 60.9%
JavaScript 30.4%
Kotlin 5.9%
HTML 2.8%