← All Projects

Migraine Control

A private migraine tracker and headache diary for one-tap attack logging, offline use, and clear reports for doctor visits.

  • typescript
  • expo
  • react-native
  • tamagui
  • turso
Migraine Control home screen with Quick Log and recent attack historyQuick Log screen for recording migraine pain intensity

Why I Made It

I live with migraine. During an attack, even a simple form can be too much. I made this migraine tracker so I could start a record right away, then add the details when I felt better.

The Android app is available on Google Play as a one-time purchase, with no ads or subscriptions.

Product Decisions

Quick Log comes first. One tap starts an attack and its timer. Details can wait until the pain lifts.

Details stay flexible. The migraine diary covers pain, symptoms, possible triggers, medication, relief, and notes. Custom lists make the next entry quicker.

History should help. A list, calendar, and 30-day summary make patterns easier to see. PDF reports and spreadsheet exports make that history easier to share with a doctor, without presenting it as a diagnosis.

The screen should stay calm. Low-glare colors, large touch targets, and restrained motion help when light and concentration are hard to tolerate.

Privacy should be the default. The diary works offline and stores health data on the device. Cloud Sync is optional; tracking and reports don’t require an account.

Engineering Decisions

One TypeScript codebase. Expo and React Native power Android, the upcoming iOS app, and a web implementation. Small platform-specific files handle storage differences.

A clear boundary around health data. Screens use a HealthRepository contract instead of a database driver. Native devices use embedded Turso/libSQL; the web uses IndexedDB.

Reports run locally. The 30-day summary, PDF report, and CSV export are computed on the device, without uploading health history.

A shared design system. Tamagui keeps the low-glare interface consistent across platforms while preserving native accessibility behavior.

How an Attack Moves Through the App

Hard Parts

Time is harder than it looks. An attack can cross midnight, start times can change, and the app can resume hours later. I kept those rules out of the screen code and tested the full sequences with unit tests and Maestro flows.

Sync without a sign-in wall. Everyday tracking had to work without an account. I kept Cloud Sync behind its own sign-in, status, and recovery flows. Better Auth and Amazon SES handle email codes; each signed-in user gets a scoped Turso database.

What’s Next

  • iOS release — the native app is implemented and in the final App Store release work.
  • Deeper reporting — show longer-term patterns without turning correlations into medical conclusions.