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

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

Volunteer Lead Developer & Maintainer

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

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

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

Stack

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

Το ίδρυμα

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

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

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

Η βάρδια ξεκινά από μία οθόνη

Ο πίνακας ελέγχου της πλατφόρμας: η λίστα «Χρειάζονται προσοχή» με μια αίτηση εισαγωγής, έγγραφα προσωπικού και φάρμακα που λήγουν, οι δόσεις της ημέρας με κουμπί χορήγησης, η βάρδια και το εφημερεύον φαρμακείο
Στη νέα έκδοση: ό,τι χρειάζεται προσοχή σήμερα, οι δόσεις της ημέρας και η βάρδια, σε μία οθόνη

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

Ο φάκελος του κατοίκου, με την ασφάλεια πάντα στην κορυφή

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

Πάνω από όλες βρίσκεται μια λωρίδα ασφαλείας: αλλεργίες, επιθυμίες για ΚΑΡΠΑ, κίνδυνοι, δίαιτα και απομόνωση. Όποια ενότητα κι αν ανοίξει η νοσηλεύτρια, τη βλέπει πρώτη.

Ο φάκελος ενός κατοίκου στην ενότητα Κλινικά, Ασφάλεια: λωρίδα με αλλεργίες, σήμανση DNR, κινδύνους και δίαιτα, και κάρτες για κρίσιμες πληροφορίες, αλλεργίες, σημάνσεις κινδύνου και πτώσεις
Στη νέα έκδοση: η λωρίδα ασφαλείας βρίσκεται πάνω από κάθε ενότητα του φακέλου
Η επισκόπηση του ίδιου φακέλου σε tablet: η λωρίδα ασφαλείας, οι δόσεις της ημέρας με μία σε αναστολή, και οι τελευταίες σημειώσεις βάρδιας, ιατρού και οικογένειας
Στο tablet, στη νέα έκδοση: οι δόσεις της ημέρας και οι τελευταίες σημειώσεις, στο χέρι της νοσηλεύτριας
Πώς λειτουργεί
  • Backend: Bun και Elysia σε αυστηρό TypeScript, πάνω σε μία κοινή data source: 14 domain modules σήμερα και 21 στη νέα έκδοση (κάτοικοι, εισαγωγή, ιατρικός φάκελος, φαρμακευτική αγωγή, φαρμακείο, προσωπικό, χρεώσεις, εξιτήριο, παράπονα, επισκέπτες, έκτακτα συμβάντα, αιτήματα πρόσβασης σε δεδομένα, διατήρηση δεδομένων και άλλα).
  • Δεδομένα: PostgreSQL 18 με TypeORM, Redis 7 για cache, και αποθήκευση αρχείων στο MinIO μέσω του S3 API του. Η νέα έκδοση φέρνει 88 migrations αντί για 9, περίπου 160 entities αντί για 66, και το Silo στη θέση του MinIO.
  • Πρόσβαση: Better Auth, έλεγχος ρόλου στις διαδρομές του API και υποχρεωτικό TOTP για διαχειριστές, γιατρούς και νοσηλευτές. Η νέα έκδοση έχει 13 ρόλους, TOTP και για την προϊσταμένη νοσηλευτικής και τον ελεγκτή, και πίνακα δικαιωμάτων για 858 διαδρομές του API που ελέγχεται από test σε κάθε αλλαγή.
  • Ακεραιότητα: κάθε ανεβασμένο αρχείο κρατά SHA-256 checksum, ώστε μια αλλοίωση να μπορεί να εντοπιστεί.
  • Frontend: React 19 με TanStack Router και Query, με τα ελληνικά ως βασική γλώσσα και πλήρη αγγλικά: 10 ενότητες στο μενού και 51 οθόνες σήμερα, 12 και 93 στη νέα έκδοση.

Κάθε δόση, μία φορά, με ώρα και υπεύθυνο

Η οθόνη χορήγησης φαρμάκων: οι μετρητές της ημέρας, οι ολοκληρωμένοι γύροι 07:00 και 08:00, και ο γύρος 14:00 ανοιχτός με την αλλεργία και τους κινδύνους του κατοίκου δίπλα στη δόση
Στη νέα έκδοση: γύροι χορήγησης ανά ώρα, με τις αλλεργίες δίπλα σε κάθε δόση

Η χορήγηση φαρμάκων είναι η μεγαλύτερη αλλαγή της νέας έκδοσης. Εκεί οργανώνεται σε γύρους ανά ώρα και κάτοικο. Δίπλα σε κάθε δόση φαίνονται οι αλλεργίες, οι κίνδυνοι και η δίαιτα του κατοίκου, και κάθε δόση καταγράφεται μία φορά, με ώρα και υπεύθυνο. Ό,τι δεν δόθηκε, από άρνηση, αναστολή ή παράλειψη, πηγαίνει στη λίστα που παρακολουθεί ο γιατρός.

Μηνιαία καρτέλα χορήγησης για τον Σεπτέμβριο: πέντε φάρμακα ανά ώρα και ημέρα, με τα αρχικά της νοσηλεύτριας σε κάθε κελί και σημάνσεις για άρνηση και κράτηση
Στη νέα έκδοση: ποιος έδωσε κάθε δόση, όλον τον μήνα, με εξαγωγή σε PDF
Πώς λειτουργεί
  • Δόσεις: δημιουργούνται αυτόματα από τις εντολές του γιατρού, για σήμερα και αύριο.
  • Προθεσμίες: μια δόση σε εκκρεμότητα γίνεται εκπρόθεσμη μετά από 30 λεπτά και κλείνει ως παράλειψη μετά από 2 ώρες.
  • Διπλός έλεγχος: τα φάρμακα υψηλού κινδύνου και τα ελεγχόμενα ζητούν δεύτερο ελεγκτή ή γραπτή αιτιολογία.
  • Παρακολούθηση: κάθε άρνηση, αναστολή ή παράλειψη μπαίνει στη λίστα του γιατρού, και η μηνιαία καρτέλα κρατά τα αρχικά όποιου έδωσε κάθε δόση.

Διαγνώσεις και φαρμακείο, στα ελληνικά

Ο γιατρός κωδικοποιεί διαγνώσεις ψάχνοντας με ελληνικούς όρους. Η «άνοια» στο κεφάλαιο V επιστρέφει τις αγγειακές άνοιες, την άνοια στη νόσο Alzheimer και τις υπόλοιπες κατηγορίες, η καθεμία με τον κωδικό της.

Ο κατάλογος έχει 27.015 κωδικούς ICD-10, οι 10.259 με ελληνική περιγραφή, και 686 κωδικούς ICPC-2. Η αναζήτηση ανέχεται ορθογραφικές αποκλίσεις και δουλεύει με ελληνικό ή αγγλικό κείμενο.

Αναζήτηση κωδικών ICD-10 για «άνοια» στο κεφάλαιο V: λίστα κωδικών με ελληνική περιγραφή, κεφάλαιο και ενότητα
Κωδικοποίηση διαγνώσεων με ελληνικούς όρους

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

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

Οι παραγγελίες προς τα φαρμακεία: έξι παραγγελίες σε διαφορετικά στάδια, από πρόχειρο έως παραδομένη, με κουμπί για το επόμενο βήμα
Στη νέα έκδοση: κάθε παραγγελία με το επόμενο βήμα της

Σχέδια φροντίδας που δεν ξεχνιούνται

Η λίστα των ενεργών σχεδίων φροντίδας ταξινομημένη κατά την επόμενη αναθεώρηση, με μία εκπρόθεσμη στην κορυφή
Πρώτα ό,τι έχει καθυστερήσει

Κάθε σχέδιο φροντίδας έχει ημερομηνία επόμενης αναθεώρησης, και η λίστα ταξινομείται με αυτήν: ό,τι έχει καθυστερήσει εμφανίζεται πρώτο. Στη νέα έκδοση, με τον ίδιο τρόπο δουλεύουν και οι επαναξιολογήσεις κινδύνου (Braden, MMSE, Barthel) και τα έγγραφα του προσωπικού που λήγουν.

Πώς λειτουργεί
  • Αυτοματισμοί: προγραμματισμένες εργασίες από 10 job modules σήμερα, ανάμεσά τους ο έλεγχος ακεραιότητας του ημερολογίου ενεργειών και τα αντίγραφα ασφαλείας. Η νέα έκδοση έχει 41 εργασίες από 25 job modules, μαζί με τις τρεις αναφορές παράδοσης βάρδιας στις 06:45, 14:45 και 22:45.
  • Υπενθυμίσεις: οι αναθεωρήσεις των σχεδίων φροντίδας και οι λήξεις εγγράφων των κατοίκων φτάνουν στο προσωπικό ως ειδοποιήσεις, αντί να περιμένουν να τις θυμηθεί κάποιος. Η νέα έκδοση προσθέτει τις επαναξιολογήσεις και τα έγγραφα του προσωπικού.

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

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

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

Σχεδιαστικό 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, με μόνο τον proxy ανοιχτό προς τον host, ώστε τα backends να μην εκτίθενται.
  • Proxy: ένας nginx μπροστά από τα δύο frontends, με πιστοποιητικά mkcert για εσωτερικό HTTPS.
  • Αναβάθμιση βάσης: μετάβαση από PostgreSQL 16 σε 18 τον Μάιο του 2026, δοκιμασμένη πρώτα από άκρη σε άκρη σε δοκιμαστικό μηχάνημα, με σύγκριση του πλήθους εγγραφών πριν και μετά. Τα migrations τρέχουν με advisory lock κατά των παράλληλων εκτελέσεων, έλεγχο checksum και snapshot της βάσης πριν από κάθε deploy.
  • Δικλείδα: η νέα διαδικασία εγκατάστασης, που θα χρησιμοποιηθεί πρώτη φορά για τη νέα έκδοση, επαναφέρει μόνη της την προηγούμενη όταν αποτύχει ο health check μετά από deploy.
  • Έλεγχοι: 342 αρχεία tests στη νέα έκδοση της κλινικής πλατφόρμας, έναντι 125 σε αυτή που τρέχει σήμερα: unit tests, integration tests πάνω σε πραγματική PostgreSQL, tests για τα migrations και σενάρια Playwright από άκρη σε άκρη.

Σύνδεσμοι

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

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

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

ΕΠΟΜΕΝΟ ΒΗΜΑ

Θέλετε κάτι ανάλογο για τη δική σας επιχείρηση;

Γράψτε μου δυο γραμμές για το project σας ή πάρτε με τηλέφωνο. Θα σας απαντήσω εγώ, όχι κάποιος συνεργάτης.

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

Κείμενο

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

Χρώμα

Αντίθεση

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

Ανάγνωση

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