Nabz — a calm companion through medical tests
Nabz is a patient-first health app by Azma. Its mission: give people going through treatment a sense of safety, calm and ease. I lead the product and build it end to end — the Kotlin Multiplatform app, the Ktor backend, the admin panel and the infrastructure.
Status: live on Cafe Bazaar, Iran's Android store — since October 2026





The problem
Lab tests are stressful. People don't know how to prepare, what a test is for, or what their results mean — and their results end up scattered across paper and chat apps. Most health apps add noise: ads, pressure, alarming language.
What it does
Test encyclopedia
Plain-language explanations of common lab tests.
Preparation guides
What to do before a test — fasting, medication, timing.
Private results archive
Results stay on the device; nothing is uploaded without consent.
Medication reminders
Local reminders that work offline.
Nabz service
Request help; the team follows up personally.
Architecture
Kotlin Multiplatform app
Shared UI, ViewModels, repositories, networking and storage in commonMain with Compose Multiplatform; Android ships first, desktop runs from the same code.
MVVM with clear boundaries
Koin for DI. Screens never talk to the API client or the database directly — only through repositories.
Offline-aware data layer
Ktor client plus Room KMP (8 local tables) with a cache and invalidation strategy.
Ktor backend
Routes → services → Exposed → PostgreSQL (19 tables), 80+ endpoints with authentication and rate limits, an HTML + JSON admin panel.
Auth that respects users
Phone OTP via SMS, short-lived JWT access tokens, rotating refresh tokens stored only as hashes, automatic refresh on 401.
Shipping
Docker Compose on a VPS behind nginx, FCM push, documented endpoints and data flow for every screen.
Product decisions I'm proud of
- Launch with real value before any lab partnership: knowledge, preparation and a private archive — instead of waiting for contracts.
- Keep the marketplace architecture intact: the labs list says "coming soon" and switches to real labs automatically when the backend has active partners.
- Privacy by default: medical results stay on the device in the first release.
- Calm UI as a requirement — every empty state, notification and CTA is reviewed against the mission: safety, calm, ease.