Inspiration

Most period and health trackers are built for someone who reads English, has a steady connection, keeps a phone to herself, and is happy to be told what her body means. A lot of women are none of those things. In Pakistan a phone is often shared with family, set down on a table, or passed around to show a photo. Urdu is the language people think in, whatever the app store listing says. And a health app that confidently names a condition or calls a lab result "abnormal" doesn't help anyone. It either frightens her or gets ignored.

So I set out to build a tracker that works offline, speaks Urdu properly, protects what's on screen, and describes her own patterns without ever diagnosing her.

What it does

SheTrack+ is a women's health tracker for Android that changes to match the stage of life she's in:

Cycle tracking: periods, phases, fertile window and predictions from her own recorded cycles PCOS: prediction windows instead of single dates, symptom patterns over months, and a lab-value record to take to an appointment Trying to conceive: fertile window, one-tap basal temperature and ovulation-test logging, and a 14-day chart Pregnancy: week-by-week development, a kick counter and a contraction timer Postpartum: recovery, sleep and mood, without a schedule she's "behind" on Perimenopause: hot-flash logging timed to the minute, symptom patterns and a transition timeline

Across all of those it has a daily check-in, water tracking with streaks, a journal, medication reminders with adherence tracking, phase-aware food and movement guidance, a health library, and an AI assistant she can ask about her own logs. She can export everything as JSON or CSV.

It's available in English, Urdu and Roman Urdu. That covers the guidance and the insights, not just the buttons, and Urdu gets a full right-to-left layout. Every screen can be read aloud, and many fields accept voice input.

How I built it

The app is Flutter (Dart), running on Android. Cloud sync uses Firebase (Auth, Firestore and Storage), and the assistant runs in a Cloud Function that calls an open model (gpt-oss-120b) on Groq. Everything is stored on the phone first, so the app is fully usable with no account and no connection. Cloud sync is opt-in.

The code follows clean architecture, and tests enforce it rather than leaving it as a convention. The domain layer is pure Dart with no Flutter and no I/O. An architecture test fails the build if a domain file imports anything outside the domain, if a screen imports a cloud SDK, or if a screen becomes unreachable from navigation. The suite has 202 tests.

Predictions are honest on purpose. For a regular cycle of length ( L ) with a period of ( P ) days, ovulation is placed a fixed luteal span before the next period, never inside the bleed:

$$d_{ov} = \max(L - 14,\; P + 2), \qquad \text{fertile window} = [\,d_{ov} - 5,\; d_{ov} + 1\,]$$

That single-date model breaks for PCOS. Someone whose cycles ran 26, 44 and 61 days doesn't have a "next period on the 14th". So from her last period start ( t_0 ) and her own recorded cycle lengths ( \ell_1, \dots, \ell_n ), the app predicts a window:

$$\big[\, t_0 + \min\limits_i \ell_i,\;\; t_0 + \max\limits_i \ell_i \,\big], \qquad \text{most likely } t_0 + \mathrm{median}(\ell_i)$$

It uses the median rather than the mean, so one long gap after a stressful few months doesn't drag every future guess. If the window is wider than 30 days, it could no longer tell her where in the month to expect a period. Past that point the app draws nothing and shows her recorded pattern instead, which is also the useful thing to take to a doctor.

The design system is written out as explicit tokens instead of generated from a seed colour, and a test measures every text/background pair against the WCAG 4.5:1 contrast ratio.

Challenges I ran into Read-aloud went silent in Urdu. On a real Samsung phone, Google's speech engine reported Urdu as available. Its only Urdu voice was online-only, though, and every request timed out after two seconds. The app now looks for a voice that is actually downloaded to the phone, selects it by name, and offers a one-tap link to the voice download screen when there isn't one. An English voice can't read Urdu script. The original fallback read the Urdu page in an English voice, which just produces noise. The fallback notice is now spoken in Roman Urdu, which the English voice can actually pronounce, in her own language. Every voice-input button after the first one broke. The speech plugin is a singleton that keeps the callbacks from its first initialize() call only. So the first mic used in a session worked, and every other mic in the app stayed stuck on "stop". Each button now takes over the callbacks when it's tapped. Keeping health claims honest. Lab results are shown against the range printed on her own report and described as indicative, never "normal" or "abnormal", because reference ranges belong to the lab. While reviewing the nutrition screen I found protein and iron bars showing fixed mockup numbers under a "real-time tracking" heading. I removed them rather than leave numbers that described nobody. Privacy on a shared phone. Screenshots and the recent-apps preview are blocked, Android auto-backup is off so logs aren't copied to Drive, and a privacy lock can close the app after inactivity. Accomplishments that I'm proud of A health app that stays useful by knowing what it shouldn't say Full Urdu and Roman Urdu, including right-to-left layout, read-aloud and voice input Six life stages in one app, with the whole thing working offline Architecture and accessibility rules that the test suite checks, not just good intentions What I learned

Passing the availability check is not the same as working. isLanguageAvailable said yes, and the phone still couldn't speak Urdu. The bugs that mattered most only showed up on a real phone, in the language people actually use, so I tested there and read the device logs rather than trusting what the code seemed to guarantee.

I also learned that in health software, restraint is a feature. Every time the app says less but says it accurately, it earns more trust than a confident prediction that turns out wrong.

What's next for SheTrack+ Publishing on Google Play (the listing, icon and feature graphic are ready) Real food logging, so nutrition can show actual intake instead of nothing An iOS build Guiding people to download the Urdu voice during onboarding, before they first need it

Built With

  • android
  • cloud-firestore
  • dart
  • firebase
  • firebase-authentication
  • firebase-storage
  • flutter
  • flutter-local-notifications
  • flutter-localizations
  • flutter-tts
  • google-cloud-functions
  • google-sign-in
  • gpt-oss-120b
  • groq
  • home-widget
  • kotlin
  • material-design-3
  • node.js
  • provider
  • shared-preferences
  • speech-to-text
  • typescript
  • urdu
  • wcag
Share this project:

Updates

Submission history