Migraine Tracker
Lead Developer
Mobile app για παρακολούθηση ημικρανίας όπου το FHIR export είναι πραγματικά συμβατό: ένας νευρολόγος μπορεί να εισάγει το ιστορικό του ασθενούς απευθείας στο EHR του. iOS και Android, λειτουργεί offline.
Το σύστημα
Το Migraine Tracker είναι ένα mobile health app όπου το FHIR export είναι πραγματικά συμβατό, δηλαδή ο νευρολόγος που λαμβάνει το αρχείο μπορεί να εισάγει το ιστορικό ημικρανιών του ασθενούς απευθείας στο EHR του, αντί να το πληκτρολογήσει ξανά από screenshots. React Native 0.81 + Expo 54 στη συσκευή, Express 5 + PostgreSQL + Drizzle + Better Auth στον server, expo-sqlite για offline αποθήκευση. Το FHIR layer υλοποιεί πραγματικά Observation, Patient, και MedicationStatement resources με SNOMED κωδικούς και HL7 ορολογία, επαληθευμένα έναντι της 4.0.1 specification, όχι ad-hoc JSON ντυμένο σαν FHIR. Το privacy είναι ενσωματωμένο: HealthKit entitlements στο iOS, Android Health Connect στο Android, privacy policy screen, και GDPR data export endpoint. Offline-capable μέσω expo-sqlite τοπικής βάσης με bidirectional sync (ένα /api/sync endpoint αντικατοπτρίζει το server schema στη συσκευή). 99 commits, 16 test suites (717 LOC), Sentry error tracking ενεργό σε frontend και backend. Pre-launch, εκκρεμούν final App Store + Play Store assets.
Αρχιτεκτονική
- Mobile app: React Native 0.81 + Expo 54, expo-sqlite για local storage, AsyncStorage για session
- Backend: Express 5 + PostgreSQL + Drizzle ORM, Better Auth, 4 dedicated FHIR routes με auth middleware
- FHIR (verified από κώδικα, όχι marketing): Observation, Patient, MedicationStatement resources με SNOMED codes + HL7 terminology systems
- Health integrations: HealthKit entitlements (
health-records) για iOS, Android Health Connect permissions για Android - Privacy: Privacy policy screen, GDPR data export endpoint
- Offline sync: Bidirectional
/api/syncendpoint, expo-sqlite mirrors backend schema - Observability: Sentry στο frontend + backend
- Tests: 16 test suites (717 LOC) με Jest + supertest για backend, native builds για Android + iOS
Η συνεισφορά μου
Έχτισα όλο το stack μόνος μου: mobile app, backend, FHIR layer, offline sync. Η επιλογή React Native + Expo ήταν συνειδητή, για ένα codebase σε iOS και Android και για OTA updates χωρίς να περνάμε από app-store review σε κάθε διόρθωση. Στο backend έγραψα ξεχωριστές FHIR routes με dedicated middleware, γιατί τα clinical exports ακολουθούν διαφορετική ροή auth από τις κανονικές API κλήσεις (ένας γιατρός που λαμβάνει export δεν είναι κατ’ ανάγκη ο χρήστης που δημιούργησε τα δεδομένα). Επαλήθευσα το FHIR output έναντι της 4.0.1 spec, byte προς byte: τα Observation resources έχουν σωστό resourceType, status, SNOMED code.coding, subject reference, και valueQuantity. Το offline sync χρησιμοποιεί last-write-wins semantics, που είναι η σωστή επιλογή για single-user personal health data (απλό, προβλέψιμο, χωρίς UI επίλυσης συγκρούσεων). Τα 16 test suites καλύπτουν FHIR routes, sync logic, και auth middleware.
Stack λεπτομέρειες
Η verified FHIR implementation είναι το πιο noteworthy τεχνικό στοιχείο. Πολλές health apps ισχυρίζονται FHIR compliance, εδώ ο κώδικας επαληθεύεται: Observation.code.coding περιέχει SNOMED CT system URL (http://snomed.info/sct) με αντίστοιχο code, MedicationStatement.medicationCodeableConcept χρησιμοποιεί HL7 terminology. Το expo-sqlite bidirectional sync λύνει το κλασικό πρόβλημα: ο χρήστης καταγράφει ημικρανία offline στο τρένο, το app αποθηκεύει τοπικά, και όταν επιστρέψει σε δίκτυο, ο /api/sync endpoint κάνει merge. Τα HealthKit entitlements για health-records επιτρέπουν ανάγνωση υπαρχόντων medical records από το iOS Health app, ο χρήστης μπορεί να import ιστορικό φαρμακευτικής αγωγής αντί να το πληκτρολογεί.
Αποτελέσματα
- Verified FHIR 4.0.1 compliance: όχι marketing claim, πραγματικός κώδικας με SNOMED + HL7
- Offline-first sync mirroring backend schema
- Privacy-first design με GDPR data export
- Έτοιμο για App Store / Play Store submission (pending Sentry DSN + final asset polish)
Πρόκληση
Η πιο απαιτητική πτυχή ήταν το modeling ημικρανιακών επεισοδίων ως FHIR Observation resources. Η ημικρανία δεν είναι μια απλή measurement (π.χ. heart rate), είναι episodic event με onset, duration, severity, triggers και associated medications. Στο FHIR 4.0.1, το Observation resource είναι σχεδιασμένο κυρίως για measurements. Έπρεπε να επιλέξω: χρησιμοποιώ valueQuantity για severity (0-10 scale), component array για triggers, και separate MedicationStatement resources για φάρμακα που ελήφθησαν. Το onset/duration μπαίνει στο effectivePeriod (start + end timestamps). Για triggers χρησιμοποίησα component.code.coding με custom SNOMED codes για κοινούς triggers (stress, sleep, caffeine). Το αποτέλεσμα είναι valid FHIR που ένας γιατρός μπορεί να import στο EHR σύστημά του, αυτός ήταν ο στόχος.
Σύνδεσμοι
- Repo:
jimrarras/migraine-app(private)
Παρόμοια έργα
- Γηροκομείο Healthcare Ops Stack: άλλη healthcare software, αλλά institutional ops αντί personal health
- collection-app (μέρος του Γηροκομείου stack): άλλο offline-first mobile app
Στιγμιότυπα