Migraine Tracker
Lead Developer
Mobile app για παρακολούθηση ημικρανίας όπου το export είναι πραγματικό FHIR 4.0.1: τα επεισόδια ως Observations με κωδικούς SNOMED CT και HL7, όχι αυθαίρετο JSON με ντύμα FHIR. iOS και Android, λειτουργεί offline.
Το ραντεβού των δέκα λεπτών
Όποιος ζει με ημικρανία κρατάει σημειώσεις: σε τετράδιο, σε σημειώσεις κινητού, σε screenshots. Στο ραντεβού με τον νευρολόγο όλα αυτά γίνονται μια προφορική περίληψη, και ο γιατρός ξαναγράφει ό,τι προλάβει στο δικό του σύστημα. Έφτιαξα μια εφαρμογή που καταγράφει την κρίση τη στιγμή που συμβαίνει και βγάζει στο τέλος ένα αρχείο που το σύστημα του γιατρού διαβάζει μόνο του.
Καταγραφή όσο η κρίση κρατάει ακόμα
Η καταγραφή γίνεται με τον πόνο σε εξέλιξη, οπότε πρέπει να είναι σύντομη: ένταση, σημείο του κεφαλιού, συμπτώματα, τι προηγήθηκε, τι πήρες. Ένα χρονόμετρο κρατάει την κρίση ανοιχτή και κλείνει όταν περάσει.
Τίποτα δεν περιμένει δίκτυο. Η καταγραφή γράφεται πρώτα στη συσκευή και συγχρονίζεται μετά, γιατί μια κρίση δεν περιμένει να βρεις σήμα.

Πώς λειτουργεί
- Τι κρατάει μια εγγραφή: ένταση 0 έως 10, ώρα έναρξης και λήξης, τύπος διάρκειας, σημεία πόνου σε χάρτη κεφαλιού, συμπτώματα με βαθμό, πυροδοτήσεις, φάρμακα με δοσολογία και αν βοήθησαν, και σημειώσεις.
- Τοπικά πρώτα: τοπική βάση SQLite με ουρά εγγραφών, ώστε η οθόνη να μην περιμένει ποτέ τον server.
- Συγχρονισμός: αμφίδρομο
/api/syncendpoint με last-write-wins, που είναι η σωστή επιλογή για δεδομένα ενός χρήστη: απλό και χωρίς οθόνη επίλυσης συγκρούσεων. - Διαγραφές: οι σβησμένες εγγραφές ταξιδεύουν ως tombstones, ώστε μια διαγραφή να μην επανεμφανίζεται από άλλη συσκευή.
- Backend: Express 5 με Drizzle ORM πάνω σε PostgreSQL, με Better Auth.
Μοτίβα, όχι εντυπώσεις
Μετά από λίγες εβδομάδες η εφαρμογή αρχίζει να απαντάει σε ερωτήσεις που κανείς δεν θυμάται σωστά: πόσο συχνά, πόσο έντονα, τι προηγείται, ποιο φάρμακο πραγματικά δουλεύει.
Ο καιρός καταγράφεται μαζί με κάθε κρίση, οπότε η μεταβολή της ατμοσφαιρικής πίεσης είναι μετρημένη και όχι εντύπωση.

Πώς λειτουργεί
- Καιρός: θερμοκρασία, υγρασία, συνθήκη και ατμοσφαιρική πίεση αποθηκεύονται με κάθε εγγραφή, μαζί με τη μεταβολή πίεσης του τελευταίου εικοσιτετραώρου.
- Ανάλυση: συχνότητα ανά περίοδο, τάσεις, ευαισθησία ανά πυροδότηση και ένδειξη κινδύνου για την ημέρα, όλα υπολογισμένα από τις ίδιες τις εγγραφές.
- Φάρμακα: δοσολογίες, υπενθυμίσεις και ιστορικό λήψης ανά φάρμακο.
- Έλεγχοι: 793 αυτόματα tests σε 115 αρχεία καλύπτουν τους υπολογισμούς, τον συγχρονισμό και τις οθόνες.
Ένα αρχείο που το σύστημα του γιατρού διαβάζει

Οι περισσότερες εφαρμογές υγείας δίνουν ένα PDF. Εδώ υπάρχει και ο άλλος δρόμος: το ιστορικό βγαίνει ως FHIR, η γλώσσα που ήδη μιλούν τα νοσοκομειακά συστήματα, με διεθνείς ιατρικούς κωδικούς αντί για ελεύθερο κείμενο. Ο γιατρός το εισάγει αντί να το πληκτρολογήσει.
Πώς λειτουργεί
- Τι εκτίθεται: ένα REST API που δημοσιεύει CapabilityStatement με
fhirVersion4.0.1, και δίνει Patient, Observation (ανάγνωση και αναζήτηση με ημερομηνία,_count,_sort) και MedicationStatement, μεapplication/fhir+jsonκαι σφάλματα ως OperationOutcome. - Η κρίση ως Observation:
statusfinal, κατηγορίαsurveyαπό την ορολογία HL7,codeο κωδικός SNOMED CT 37796009 (Migraine),subjectαναφορά στον Patient, καιeffectivePeriodγια έναρξη και λήξη. - Ένταση: μπαίνει ως
valueIntegerστην κλίμακα 0 έως 10, μεinterpretationαπό το v3-ObservationInterpretation του HL7. - Σημεία και συμπτώματα: 8 κωδικοί SNOMED για περιοχές του κεφαλιού στο
bodySiteκαι 6 για συμπτώματα ως components, καθένας με βαθμό. - Διάρκεια και πυροδοτήσεις: components με τους κωδικούς SNOMED 103335007 και 134296009, με την ίδια την πυροδότηση ως τιμή κειμένου.
- Πρόσβαση: το endpoint δέχεται είτε τη συνεδρία του ασθενούς είτε Patient Access Token, αποθηκευμένο μόνο ως SHA-256 hash, με ετικέτα, scope, λήξη και ανάκληση.
Τα δεδομένα μένουν του ασθενή
Ένα ημερολόγιο πόνου είναι από τα πιο προσωπικά αρχεία που κρατάει κανείς. Τίποτα δεν φεύγει χωρίς ρητή ενέργεια του χρήστη, και ο χρήστης μπορεί να πάρει τα πάντα μαζί του ή να τα σβήσει.
Πώς λειτουργεί
- Εξαγωγή και διαγραφή: GDPR endpoint που επιστρέφει όλα τα δεδομένα του λογαριασμού, και διαγραφή λογαριασμού με επιβεβαίωση.
- Υγεία της συσκευής: HealthKit entitlement
health-recordsστο iOS και Android Health Connect μέσω δικού μας expo plugin, ώστε να μη χρειάζεται να πληκτρολογηθεί ξανά ιστορικό που υπάρχει ήδη. - Κλείδωμα: overlay κλειδώματος της εφαρμογής όταν φεύγει στο παρασκήνιο.
- Παρακολούθηση σφαλμάτων: Sentry σε εφαρμογή και backend.
Σύνδεσμοι
- Repo:
jimrarras/migraine-app(private)
Παρόμοια έργα
- Γηροκομείο Healthcare Ops Stack: άλλο λογισμικό υγείας, αλλά λειτουργίες ιδρύματος αντί για προσωπική υγεία
- collection-app (μέρος του Γηροκομείου stack): άλλη offline-first mobile εφαρμογή