Cycle tracking app built with Expo + React Native + Supabase, with a companion Next.js website.
GitHub repo description: Privacy-first cycle tracking app (Expo + React Native + Supabase) with partner sync, daily logs, and web download.
- Authentication: email login/signup + anonymous session flow
- Onboarding: welcome + setup flow for initial profile/cycle start
- Core tabs: Home, Calendar, Insights, Profile/Settings
- Logging: period range modal, daily flow/symptom/notes logging, quick check-in
- Partner sync: code-based linking and permission toggles
- Notifications: daily reminder scheduling and permission handling
- Data controls: export (JSON/CSV) and delete account data
- Analytics/error hooks integrated in key flows
- Marketing pages: Home, Features, Download, Privacy, Terms, Support
- Download links point to GitHub latest release asset:
https://github.com/848deepak/Soma-/releases/latest/download/soma.apk
Representative app mockups:
| Home | Calendar |
|---|---|
![]() |
![]() |
| Insights | Profile |
|---|---|
![]() |
![]() |
- Expo SDK 55, React Native 0.83, Expo Router
- TanStack Query + Supabase
- NativeWind + Reanimated
- Jest + Testing Library
- Next.js 16 (website)
app/ Expo Router routes (mobile)
src/ App screens/components/services/hooks
hooks/ Shared hooks
lib/ Auth + Supabase client
supabase/ SQL schema + RLS policies
web/ Next.js marketing/download website
__tests__/ Unit/component/integration tests
- Node.js 20+
- npm
- Expo CLI / EAS CLI (for cloud builds)
npm install
cd web && npm install && cd ..npm run startcd web
npm run devCreate local env file from example:
cp .env.example .env.localRequired public vars:
EXPO_PUBLIC_SUPABASE_URLEXPO_PUBLIC_SUPABASE_ANON_KEY
Function/ops secret template:
supabase/.env.secrets.example
For EAS cloud builds, prefer project secrets:
eas secret:create --scope project --name EXPO_PUBLIC_SUPABASE_URL --value "https://YOUR_PROJECT_REF.supabase.co"
eas secret:create --scope project --name EXPO_PUBLIC_SUPABASE_ANON_KEY --value "YOUR_SUPABASE_ANON_KEY"For Supabase edge function secrets (COPPA, data-rights, FCM), use a private env file:
cp supabase/.env.secrets.example supabase/.env.secrets.local
# fill real values in supabase/.env.secrets.local
npx supabase secrets set --env-file supabase/.env.secrets.localnpm run typecheck
npm test
cd web && npm run buildExpo project:
Android preview APK:
eas build --platform android --profile previewAndroid production AAB:
eas build --platform android --profile productioniOS production build:
eas build --platform ios --profile productionThe website download buttons use GitHub Releases latest/download/soma.apk, so keeping the release asset updated is enough.
Upload/replace APK on release:
gh release upload v1.0.0 android/app/build/outputs/apk/debug/app-debug.apk#soma.apk --clobber- This README intentionally reflects implemented functionality only.
- If features change, update both website copy and this README together.



