ΕθελοντικόΣε παραγωγή2024–present

Γηροκομείο Ζωσιμάδων Ιωαννίνων: Healthcare Ops Stack

Volunteer Lead Developer & Maintainer

Τρία ολοκληρωμένα συστήματα που έβγαλαν το Γηροκομείο Ζωσιμάδων Ιωαννίνων από το χαρτί: κλινικές λειτουργίες, διαχείριση αποθεμάτων, και handheld scanner για καταγραφή αποθεμάτων ανά βάρδια. Εθελοντική εργασία, σε καθημερινή παραγωγή.

Αποτελέσματα

συστήματα σε καθημερινή χρήση στο ίδρυμα
3
τομείς του φακέλου, από την εισαγωγή ως το εξιτήριο
14
διαγνώσεις ICD-10 στα ελληνικά, με αναζήτηση
27.015
εργασίες που τρέχουν μόνες τους κάθε μέρα
10
Γηροκομείο Ζωσιμάδων Ιωαννίνων: Healthcare Ops Stack

Stack

  • Bun + Elysia
  • Hono
  • PostgreSQL 18
  • TypeORM + Drizzle
  • MinIO
  • React 18 + TanStack
  • Better Auth
  • Expo React Native
  • Docker + Coolify

Το ίδρυμα

Το Γηροκομείο Ζωσιμάδων Ιωαννίνων φρόντιζε τους ενοίκους του με χαρτί: φάκελοι σε ντουλάπια, φαρμακευτικά σχήματα σε τετράδια, αποθήκη που μετριόταν με το μάτι. Μου ζητήθηκε να περάσει το ίδρυμα σε υπολογιστή χωρίς να αλλάξει ο τρόπος που δουλεύει το προσωπικό στη βάρδια. Έφτιαξα τρία συστήματα που τρέχουν σήμερα καθημερινά εκεί, και συνεχίζω να τα συντηρώ.

Ο φάκελος του ενοίκου σε μία οθόνη

Η νοσηλεύτρια ανοίγει έναν ένοικο και βλέπει τα πάντα στη σειρά: εισαγωγή, ιατρικό ιστορικό, φαρμακευτική αγωγή, σχέδιο φροντίδας, χρεώσεις, εξιτήριο. Καμία ερώτηση δεν απαιτεί πλέον ψάξιμο σε τρία ντουλάπια.

Το πρόγραμμα φαρμάκων της εβδομάδας συντάσσεται μόνο του από το σχήμα κάθε ενοίκου, και το ίδιο ισχύει για τη ροή του φαρμακείου και τις υπενθυμίσεις προς το προσωπικό.

Εικονογράφηση pixel art της κλινικής πλατφόρμας: καρτέλες για ενοίκους, προσωπικό και ειδοποιήσεις, εβδομαδιαίο πρόγραμμα φαρμάκων και φόρμα εισαγωγής
Εικονογράφηση της πλατφόρμας, όχι στιγμιότυπο με πραγματικά δεδομένα
Πώς λειτουργεί
  • Backend: Bun και Elysia σε αυστηρό TypeScript, 14 domain modules (εισαγωγή, ιατρικός φάκελος, φαρμακευτική αγωγή, φαρμακείο, ένοικοι, προσωπικό, χρέωση, εξιτήριο, μηνύματα, ειδοποιήσεις, αιτήματα πρόσβασης σε δεδομένα, εγκαταστάσεις, σύστημα, ταυτοποίηση) πάνω σε μία κοινή data source.
  • Δεδομένα: PostgreSQL 18 με TypeORM, Redis 7 για cache και MinIO για τα αρχεία, με Better Auth για ρόλους και συνεδρίες.
  • Διαγνώσεις: 27.015 κωδικοί ICD-10 με ελληνικές περιγραφές, φορτωμένοι από seed script και αναζητήσιμοι μέσα στον φάκελο.
  • Ακεραιότητα: κάθε ανεβασμένο αρχείο κρατά SHA-256 checksum και έκδοση, ώστε μια αλλοίωση να είναι ορατή.
  • Αυτοματισμοί: 10 προγραμματισμένες εργασίες για φαρμακευτικά σχήματα, ροή φαρμακείου, χρεώσεις, επανεξέταση σχεδίων φροντίδας, λήξεις εγγράφων, backup, έλεγχο ακεραιότητας του ημερολογίου και καθάρισμα logs.
  • Frontend: React 18 με TanStack Router και Query σε 17 modules, με build μέσω tsc -b.

Η αποθήκη ξέρει τι έχει και πότε λήγει

Τα αναλώσιμα και τα φάρμακα έχουν πλέον ποσότητα, θέση και ημερομηνία λήξης. Το σύστημα δείχνει τι τελειώνει και τι λήγει πριν γίνει πρόβλημα, αντί να το ανακαλύπτει κάποιος τη στιγμή που το χρειάζεται.

Η αποθήκη είναι χωριστό σύστημα από την κλινική πλατφόρμα, επειδή την ανοίγει άλλο προσωπικό και αλλάζει με άλλον ρυθμό.

Σχεδιαστικό mockup σε pixel art για τη διαχείριση αποθήκης: λίστα ειδών με ποσότητες, μπάρες και ημερομηνίες λήξης, και προεπισκόπηση συνημμένων στο πλάι
Σχεδιαστικό mockup της οθόνης αποθέματος, όχι στιγμιότυπο από το σύστημα
Πώς λειτουργεί
  • Backend: Hono με Drizzle ORM και Better Auth πάνω σε PostgreSQL 18, μέσα σε Turborepo workspace.
  • Συμβόλαιο API: κοινό package με Zod schemas ανάμεσα σε backend και frontend, που δίνει type-safe κλήσεις χωρίς code generation.
  • Frontend: Vite, React, TanStack Router και Query, Tailwind.
  • Έλεγχοι: 208 αυτόματα tests σε 33 αρχεία στο backend, με Vitest και ESLint στο CI και εικόνες container σε κάθε push.

Καταμέτρηση με το κινητό, ακόμα και χωρίς δίκτυο

Εικονογράφηση pixel art της εφαρμογής σάρωσης: κινητό που διαβάζει κωδικό QR, κάρτα με το είδος και την ποσότητα, και ένδειξη OFFLINE στη γωνία
Η σάρωση συνεχίζει να δουλεύει όταν πέφτει το Wi-Fi της αποθήκης

Η απογραφή γίνεται με ένα Android κινητό μέσα στην αποθήκη: σάρωση, ποσότητα, επόμενο είδος. Το Wi-Fi εκεί είναι αδύναμο, οπότε η εφαρμογή δεν περιμένει το δίκτυο. Γράφει τοπικά και στέλνει μαζικά όταν επανέλθει η σύνδεση, ώστε μια ολόκληρη βάρδια να μη χάνεται επειδή έπεσε η γραμμή.

Πώς λειτουργεί
  • Πλατφόρμα: Expo και React Native, με εσωτερικό Android build μέσω EAS.
  • Ροές: αναζήτηση είδους, λήξεις, καταμετρήσεις, παραλαβές, γρήγορη παραλαβή, λίστες συλλογής, περιβαλλοντικές μετρήσεις και ουρά αποστολής.
  • Offline: κάθε αίτημα κόβεται στα 3 δευτερόλεπτα και πέφτει σε τοπική SQLite, και οι σαρώσεις φεύγουν σε παρτίδες από την ουρά.
  • Ταυτοποίηση: bearer token αποθηκευμένο στο secure store της συσκευής.

Δύο συστήματα, ένας υπολογιστής στο ίδρυμα

Το γηροκομείο δεν έχει τμήμα πληροφορικής. Και τα δύο συστήματα τρέχουν στον ίδιο υπολογιστή μέσα στο κτίριο, πίσω από έναν κοινό proxy που ξεχωρίζει ποιο ανοίγει ο καθένας, με πιστοποιητικά που οι browsers του ιδρύματος δέχονται χωρίς προειδοποιήσεις.

Πώς λειτουργεί
  • Δικτύωση: κάθε stack σε containers Docker πάνω σε κοινό εξωτερικό network, με τα backends να μην εκτίθενται στον host.
  • Proxy: ένας nginx μπροστά από τα δύο frontends, με πιστοποιητικά mkcert για εσωτερικό HTTPS.
  • Αναβάθμιση βάσης: μετάβαση από PostgreSQL 16 σε 18, δοκιμασμένη πρώτα σε αντίγραφο, με checksums πριν και μετά, advisory lock κατά των παράλληλων migrations και snapshot πριν το deploy.
  • Δικλείδα: αυτόματη επαναφορά όταν αποτύχει ο health check μετά από deploy.
  • Έκδοση: η κλινική πλατφόρμα βρίσκεται στην 1.0.50, με 125 αρχεία tests στο monorepo.

Σύνδεσμοι

  • Εσωτερική εγκατάσταση (στο γηροκομείο). Δεν υπάρχει δημόσιο URL.
  • Repos: jimrarras/healthcare (monorepo), jimrarras/ims (monorepo)

Παρόμοια έργα

  • Π.Γ.Ν.Ι. StorageManagement: άλλη εθελοντική civic-tech εργασία για ελληνικό νοσοκομείο, αλλά desktop εφαρμογή αντί για πλατφόρμα λειτουργιών
  • Migraine Tracker: άλλο λογισμικό υγείας, αλλά mobile και FHIR αντί για λειτουργίες ιδρύματος
Επικοινωνία

Ρυθμίσεις εμφάνισης

Κείμενο

Μέγεθος κειμένου
Απόσταση γραμμών
Απόσταση γραμμάτων

Χρώμα

Αντίθεση

Κίνηση και εικόνες

Ανάγνωση

Βοήθημα ανάγνωσης
Καμία αλλαγή