Γηροκομείο Ζωσιμάδων Ιωαννίνων: Healthcare Ops Stack
Volunteer Lead Developer & Maintainer
Three integrated systems that took the Zosimades Nursing Home of Ioannina off paper: clinical operations, inventory management, and a handheld scanner for shift inventory counts. Built as volunteer work, in production daily.
Results
- systems in daily use at the home
- 3
- areas of the file, from admission to discharge
- 14
- ICD-10 diagnoses in Greek, searchable
- 27,015
- jobs that run on their own every day
- 10

The home
The Zosimades Nursing Home of Ioannina looked after its residents on paper: files in cabinets, medication schedules in notebooks, a store room counted by eye. I was asked to move the institution onto a computer without changing the way staff work through a shift. I built three systems that run there every day now, and I keep maintaining them.
A resident’s file on one screen
A nurse opens a resident and sees everything in order: admission, medical history, medication, care plan, charges, discharge. No question needs a search through three cabinets any more.
The week’s medication schedule builds itself from each resident’s regimen, and the same is true of the pharmacy rotation and the reminders sent to staff.

How it works
- Backend: Bun and Elysia in strict TypeScript, 14 domain modules (admission intake, medical record, medication, pharmacy, residents, staff, billing, discharge, messaging, notifications, data access requests, facility, system, auth) over one shared data source.
- Data: PostgreSQL 18 with TypeORM, Redis 7 for cache and MinIO for files, with Better Auth for roles and sessions.
- Diagnoses: 27,015 ICD-10 codes with Greek descriptions, loaded by a seed script and searchable inside the file.
- Integrity: every uploaded file keeps a SHA-256 checksum and a version, so tampering is visible.
- Automation: 10 scheduled jobs for medication schedules, pharmacy rotation, billing, care-plan review, document expiry, backups, audit-log integrity and log cleanup.
- Frontend: React 18 with TanStack Router and Query across 17 modules, built with
tsc -b.
The store room knows what it has and when it expires
Consumables and medicines now have a quantity, a location and an expiry date. The system shows what is running out and what is going out of date before it becomes a problem, rather than someone finding out at the moment they need it.
Inventory is a separate system from the clinical platform, because different staff open it and it changes at a different pace.

How it works
- Backend: Hono with Drizzle ORM and Better Auth over PostgreSQL 18, inside a Turborepo workspace.
- API contract: a shared package of Zod schemas between backend and frontend, giving type-safe calls without code generation.
- Frontend: Vite, React, TanStack Router and Query, Tailwind.
- Checks: 208 automated tests across 33 backend files, with Vitest and ESLint in CI and container images on every push.
Counting on a phone, even with no network

Stocktaking happens on an Android phone inside the store room: scan, quantity, next item. The Wi-Fi there is weak, so the app does not wait for the network. It writes locally and submits in batches once the connection returns, so a whole shift is not lost because the line went down.
How it works
- Platform: Expo and React Native, with an internal Android build through EAS.
- Workflows: item lookup, expiry, counts, receiving, fast receiving, picklists, environmental readings and a submission queue.
- Offline: every request is cut off at 3 seconds and falls back to a local SQLite database, and scans leave the queue in batches.
- Auth: a bearer token held in the device’s secure store.
Two systems, one computer on site
The nursing home has no IT department. Both systems run on the same computer inside the building, behind one shared proxy that tells apart which of them a person is opening, with certificates the home’s browsers accept without warnings.
How it works
- Networking: each stack in Docker containers on one shared external network, with the backends never exposed to the host.
- Proxy: a single nginx in front of both frontends, with mkcert certificates for internal HTTPS.
- Database upgrade: a move from PostgreSQL 16 to 18, rehearsed on a copy first, with checksums before and after, an advisory lock against concurrent migrations and a snapshot taken before the deploy.
- Safety catch: automatic rollback when a health check fails after a deploy.
- Version: the clinical platform is at 1.0.50, with 125 test files in the monorepo.
Links
- Internal-only deployment (at the nursing home). No public URL.
- Repos:
jimrarras/healthcare(monorepo),jimrarras/ims(monorepo)
Related work
- Π.Γ.Ν.Ι. StorageManagement: other volunteer civic-tech work for a Greek hospital, but a desktop app rather than an ops platform
- Migraine Tracker: other healthcare software, but mobile and FHIR rather than institutional ops