Volunteer Production 2024–present

Γηροκομείο Ζωσιμάδων Ιωαννίνων: 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.

Stack

  • Bun + Elysia
  • Hono
  • PostgreSQL 18
  • TypeORM + Drizzle
  • MinIO
  • React 18 + TanStack
  • Better Auth
  • Expo React Native
  • Docker + Coolify
Γηροκομείο Ζωσιμάδων Ιωαννίνων: Healthcare Ops Stack

The system

The Zosimades Nursing Home of Ioannina (Γηροκομείο Ζωσιμάδων Ιωαννίνων) was running on paper. As volunteer Lead Developer, I built three integrated systems that took the institution digital and keep it there. The Healthcare Platform is a Bun + Elysia monorepo with 13 domain modules covering the entire clinical cycle (admission, medical records, medication schedule automation, pharmacy rotation, billing, discharge), backed by PostgreSQL 18 + TypeORM + MinIO + Redis with Better Auth and 7 cron jobs. The IMS (Inventory Management System) is a separate Hono + Drizzle stack with 108 backend tests and a shared Zod schema package that gives the React frontend a type-safe API contract without code generation. The collection-app is an Expo React Native Android scanner for offline-first inventory counts during shifts: lookup, expiry, counts, receiving, with SQLite fallback when the on-site Wi-Fi drops. All three are in production at the nursing home today. All three were built without payment.

Architecture

Healthcare Platform

  • Backend: Bun + Elysia (strict TypeScript), 13 domain modules, TypeORM, PostgreSQL 18, MinIO S3, Redis 7, Better Auth, Pino logging, 7 cron jobs
  • Frontend: React 18 + TanStack Router/Query, Radix UI primitives, strict TypeScript build (tsc -b)
  • Production: On-site Windows + Docker Desktop, admin.local with mkcert, pre-deploy Postgres snapshots, auto-rollback on failed health checks
  • Production discipline: Postgres 16→18 migration plan with dry-run + checksums + advisory lock, MinIO volume carry-over, cutover runbook at infra/docs/cutover-runbook.md

IMS (Inventory Management)

  • Backend: Hono + Better Auth + Drizzle ORM + PostgreSQL 18
  • Frontend: Vite + React + TanStack Router/Query + Tailwind
  • Shared package: Zod schemas (type-safe API contract)
  • Production: On-site Windows Docker Desktop at apoth.local, Coolify-managed demo standby
  • Tests: 108 backend tests passing, Vitest + ESLint CI, GHCR images on every push to main

collection-app (Android QR scanner)

  • Framework: Expo + React Native
  • Workflows: lookup · expiry · counts · receiving
  • Offline-first: 3s network timeout → SQLite fallback, bulk submission semantics
  • Auth: Bearer JWT via expo-secure-store

My contribution

I designed and built each system as a volunteer, and I continue as maintainer. The architectural decision that mattered most was modular decomposition: 13 domain modules (admission, medical, medication, pharmacy, billing, discharge, etc.) inside a single Bun + Elysia monorepo, sharing one data source instead of fragmenting into microservices the nursing home would have to operate. Each module has its own TypeORM entities, services, and routes, but they all share Better Auth, MinIO storage, and Redis. I wrote the ICD-10 seeding script, document versioning with SHA-256 checksums for tamper-evidence, and the 7 cron jobs that automate medication schedules and pharmacy rotation. For the IMS I chose a shared Zod schema package between the Hono backend and the Vite + React frontend, giving a type-safe API contract without code generation. The two stacks share a Docker external network so a single nginx edge proxy can route both. The collection-app was designed offline-first from day one: a local SQLite DB with bulk submission so scanners keep working even on a poor Wi-Fi signal in the storage room.

Stack details

The 13-module monorepo decomposition wasn’t arbitrary. Each module (admission-intake, billing, medication, etc.) has its own TypeORM entities, services, and routes, but they share a single data source and infrastructure (Redis, MinIO, Better Auth). This gives low coupling without microservice overhead. The most demanding decision was the Postgres 16→18 migration strategy: a dry-run mode that verifies checksums without writing, an advisory lock preventing concurrent migrations, and a pre-deploy snapshot allowing rollback in under 2 minutes. The SHA-256 document checksum layer ensures every uploaded file (medical records, admissions) is tamper-evident. The shared Docker external network contract between Healthcare and IMS means the nginx edge proxy can route requests to both systems without a separate reverse proxy per system.

Outcomes

  • Healthcare Platform v1.0.50 in production at the nursing home, with 13 modules covering admission → medical record → medication → billing → discharge
  • IMS v1.x in production for inventory management, with the Android collection-app for offline-first scanning during kit-out shifts
  • Both systems volunteer work: free of charge to the nursing home, under active maintenance
  • Production cutover (Postgres 16→18) completed with dry-run, snapshots, auto-rollback, and runbook documentation

The challenge

The most complex design problem was running two separate production systems (Healthcare Platform + IMS) on the same on-site Windows server, without port conflicts and with unified TLS. The solution: a shared Docker external network (healthcare_network) that both stacks join. The nginx edge proxy runs as a separate container on the same network and routes by subdomain: admin.local → Healthcare frontend, apoth.local → IMS frontend. Each backend exposes its private port only within the Docker network, nothing is exposed to the host without intent. mkcert certificates ensure on-site browsers accept HTTPS without warnings. This contract was explicitly documented in the cutover runbook so it’s reproducible if a rebuild is ever needed.

  • Internal-only deployment (at the nursing home). No public URL.
  • Repos: jimrarras/healthcare (monorepo), jimrarras/ims (monorepo)
  • Π.Γ.Ν.Ι. 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 + FHIR rather than institutional ops
Get in touch