Back to projects
MediTrack
MediTrack is a private, local-only lab results tracker that turns PDFs into plain-language, trended insights with on-device OCR and encrypted storage.
- Year
- 2026
- Type
- Web app
- Status
- Live
The problem. People collect lab results as a pile of cryptic PDFs. The apps that make them readable want you to upload your bloodwork to their servers — so the fix for confusion costs you your medical privacy. MediTrack refuses that trade: it turns lab PDFs into plain-language, trended insights while every piece of health data stays on your own device. No accounts, no servers, no telemetry.
The hard part. "Local-only" and "AI analysis" pull in opposite directions — a plain-language summary normally means shipping the results to a model in the cloud. I kept both by drawing the privacy boundary inside the device: results are parsed and stored in an encrypted on-device SQLite database, and the one time the network is touched — the optional AI summary — the payload is stripped of identifying data on-device first. The model sees values, never a patient.
The approach. One canonical JSON schema code-generates the models for both the Vue 3 PWA and the Flutter app, so web and mobile can never drift apart. On-device OCR (Tesseract WASM) maps an uploaded PDF or photo onto a 70-test catalogue for review before save; reference-range markers and 12-month trend charts do the interpretation. A Clean Architecture split keeps the presentation layer from ever reaching into storage or the AI client directly, and mobile encrypts at rest with SQLCipher (AES-256).
The outcome. A genuinely private health tracker that still feels modern — family profiles, retest reminders, password-gated encrypted backups, idle and tab-blur auto-lock, and full Arabic/English RTL enforced by a CI gate that fails the build on a physical-direction CSS rule.
The hard part. "Local-only" and "AI analysis" pull in opposite directions — a plain-language summary normally means shipping the results to a model in the cloud. I kept both by drawing the privacy boundary inside the device: results are parsed and stored in an encrypted on-device SQLite database, and the one time the network is touched — the optional AI summary — the payload is stripped of identifying data on-device first. The model sees values, never a patient.
The approach. One canonical JSON schema code-generates the models for both the Vue 3 PWA and the Flutter app, so web and mobile can never drift apart. On-device OCR (Tesseract WASM) maps an uploaded PDF or photo onto a 70-test catalogue for review before save; reference-range markers and 12-month trend charts do the interpretation. A Clean Architecture split keeps the presentation layer from ever reaching into storage or the AI client directly, and mobile encrypts at rest with SQLCipher (AES-256).
The outcome. A genuinely private health tracker that still feels modern — family profiles, retest reminders, password-gated encrypted backups, idle and tab-blur auto-lock, and full Arabic/English RTL enforced by a CI gate that fails the build on a physical-direction CSS rule.
My Role
Architect & Full-Stack Developer — sole engineer across the shared schema, the Vue PWA, and the Flutter app. Owned the on-device privacy model, the schema-driven codegen that keeps both apps in lockstep, the OCR + encrypted-storage pipeline, and the CI gates enforcing RTL parity and layered architecture across web and mobile.
- Vue 3
- TypeScript
- Vite
- Pinia
- Tailwind CSS
- vite-plugin-pwa
- Flutter
- Riverpod
- Drift (SQLCipher)
- SQLite
- Tesseract WASM
- Claude API
- Vitest
- Playwright
- GitHub Actions
