See all works
iOS App 0→1 Product Design & Code Health Tech SwiftUI

Designing and building a medication tracker for kidney patients — because nothing on the App Store came close

Dose Diary started as a weekend project born from real necessity — managing my wife's post-transplant immunosuppressant schedule and my own hormone therapy. When I couldn't find an app that handled complex schedules, lab tracking, and dialysis sessions without demanding cloud accounts or subscriptions, I designed and built one myself.

My Role

Designer & Developer

Year

2026

Stack

SwiftUI · SwiftData · iOS

Kidney Mode — eGFR trend tracking, period report comparison, and PDF export for physician review

Download on App Store
Section I

This app exists because I needed it

My wife is a kidney transplant recipient. Her daily medication schedule involves immunosuppressants that must be taken at precise times, at precise doses, and tracked against lab results — eGFR, creatinine, tacrolimus trough levels — that shift the clinical picture every few weeks. I'm managing hormone therapy myself, which adds its own set of weekly and bi-weekly schedules.

Every medication app I tried made the same assumptions: daily doses, single user, maybe a reminder. None of them handled weekly, bi-weekly, or monthly intervals without workarounds. None of them connected medication logs to lab results. And almost all of them required a cloud account — which, for sensitive health data, felt like a trust trade I wasn't willing to make.

So I built Dose Diary on weekends. The design decisions came directly from lived experience, not from user personas.

2

Real users who shaped every design decision — my wife and myself

≥85%

Adherence rate Dose Diary tracks — clinical standard for kidney patients

0

Cloud accounts required — all data stays on device

Section II

The App Store has hundreds of medication trackers. None of them are for patients managing serious illness.

Most medication apps are designed for the general population: once-daily pills, simple reminders, maybe a refill alert. They're fine for the majority of users. But kidney transplant recipients, dialysis patients, and people on complex hormone therapy protocols exist at a different level of complexity — multiple drugs with different intervals, vitals that need logging before and after dialysis sessions, lab panels that need to be compared across months, not days.

The existing solutions forced these users to either use an app that was too simple to be useful, or a clinical system that was too complex and cold to be sustainable in daily life. There was no middle ground: an app with consumer-quality UX built specifically for the clinical depth these patients needed.

Generic apps

  • Daily-only scheduling — no weekly or bi-weekly intervals
  • No lab result tracking or trend analysis
  • No dialysis session management
  • Cloud-first — health data leaves the device
  • No adherence rate calculation
  • One-size UX for a highly varied patient population

Dose Diary

  • Flexible intervals: daily through monthly, fully configurable
  • Lab tracking with 30/60/90-day trend analysis
  • Dialysis session scheduling with pre/post vitals logging
  • Local-only storage — SwiftData, no account required
  • ≥85% adherence tracking — clinical standard for CKD
  • Separate modes for medication, kidney, and HRT workflows
Section III

Three non-negotiable principles before writing a single line of code

Privacy is not a feature — it's the architecture

Health data is among the most sensitive data a person generates. I made the decision early that Dose Diary would never send data to a server. Everything uses Apple's SwiftData framework and stays on device. No account creation, no sync, no telemetry tied to health behaviour. Ad support through Google AdMob is transparent and opt-outable. This wasn't a compromise — it was the founding constraint that shaped everything else.

Design for the worst day, not the average day

Patients managing kidney disease or post-transplant recovery have hard days. The UI needs to work when someone is fatigued, stressed, or in a clinical environment. That means large touch targets, clear hierarchy, no cognitive load for the logging interaction — the most frequent action in the app. One tap to log. Confirmation visible immediately. No buried menus for the daily workflow.

Bilingual from day one, not as an afterthought

My wife reads Vietnamese more comfortably than English in medical contexts. Language switching had to be instant, complete, and available at the system level — not buried in settings. Dose Diary supports English and Vietnamese with a single toggle in the app settings, with all clinical terminology translated accurately, not just approximated.

Section IV

Two modes, one system — medication management built for clinical complexity

The core medication system supports scheduling at any interval from daily to monthly. Each medication has its own timing rules, meal-time relationships, and stock tracking. Reminders are tied to meal times rather than arbitrary clock times — which matters clinically, because most immunosuppressants are taken at consistent meal-relative intervals rather than strict hours.

Core

Flexible Scheduling

Daily, weekly, bi-weekly, monthly intervals — fully configurable per medication, not a fixed preset list

Core

One-tap Logging

Log a dose in one tap with automatic timestamp; confirmation visible immediately on the today screen

Core

Camera Scanning

Scan a prescription label to auto-populate medication name, dosage, and schedule — reducing setup friction

Core

Stock & Refill Alerts

Track remaining supply; automatic notification when stock falls below a user-set threshold

Core

Home Screen Widget

Today's medications visible on the home screen; tap to log without opening the app

Core

Adherence Analytics

Per-medication adherence rate calculated against the ≥85% clinical standard for chronic kidney disease

The design goal for the daily logging screen was zero hesitation. If a patient wakes up, opens the app, and has to think about what to tap — the design has failed.

Section V

Kidney Mode — the feature that makes Dose Diary different

Kidney Mode is a dedicated layer built for dialysis patients, transplant recipients, and anyone managing CKD. It extends the base medication system with clinical workflows that no general medication app attempts. The design challenge was making these features feel like a natural part of the same app — not a bolt-on clinical tool that broke the experience.

Kidney

Dialysis Scheduling

Three-times-weekly session scheduling with automatic reminders; tracks session start, end, and duration

Kidney

Pre/Post Vitals

Blood pressure and weight logged before and after each session; automatically attached to session records

Kidney

Lab Panel Tracking

eGFR, creatinine, potassium, hemoglobin, phosphorus, bicarbonate — logged per exam date and trended over time

Kidney

Period Reports

Side-by-side comparison of two exam dates with color-coded trend indicators; exportable as PDF for physician sharing

Kidney

Schedule Scanning

Photograph a printed dialysis schedule from a clinic and auto-populate the session calendar

Kidney

Post-session Wellness

5-point emoji-based wellbeing rating logged after each session — simple enough to complete while still fatigued

The HRT Reference Library sits alongside Kidney Mode as a separate informational layer: medically-cited guidance on hormone therapies drawn from WPATH, UCSF, and Endocrine Society sources. It's not a feature for tracking — it's a place for patients to access reliable clinical information without leaving the app or opening a browser.

6

Lab markers tracked with 30/60/90-day trend analysis

PDF

Exportable kidney reports formatted for physician review

EN · VI

Full bilingual support with instant language switching

Section VI

What I learned building something for people I love

Building an app where you are also the primary user changes every decision. There's no ambiguity about whether a feature is needed — you know, because you've felt the absence of it. And there's no tolerance for friction in the daily logging flow, because you experience that friction every morning.

What surprised me was how much the privacy constraint simplified the architecture. Removing cloud sync eliminated an entire class of problems: sync conflicts, latency, authentication flows, data breach liability. The SwiftData model is clean and fast. The app launches instantly. There's no onboarding because there's nothing to sign in to.

The other thing I learned: designing for edge cases first produces better general design. Every interaction pattern I designed for a fatigued dialysis patient — large targets, minimal steps, immediate confirmation — made the app better for everyone. The clinical context was a forcing function for the kind of design rigour that consumer apps often skip.

SwiftUI · SwiftData Privacy-first architecture Clinical UX design Bilingual (EN · VI) End-to-end: design to App Store Health analytics

Other mobile projects

Personal · iOS

WordPopi — Vocabulary Learning App

Freelance · iOS · Android

Cold Storage Logistics App