The React Native / Expo app for HealthLens, an AI medical report companion that reads lab reports, explains every marker in plain language, and flags concerns — without diagnosing.
Live: healthlens.app
This is the mobile client. It talks to a separate backend (OCR extraction, lab-value parsing, and the LLM insight pipeline) which is not in this repo.
- Upload a lab report — PDF, JPG, or PNG
- OCR extracts the raw text
- Lab values are parsed out of the extracted text
- You review and correct any parsed markers before continuing
- An LLM generates plain-language insights — with output constrained to avoid diagnostic claims
- Results are viewable in-app and exportable as PDF/image
Medical data never persists on a server — reports and results are stored on-device.
- Rate-limit-aware error handling. The upload and parsing steps detect 429s specifically and surface a retry path, rather than a generic failure.
- Guarded async handlers. Every action handler checks
isLoadingbefore firing, so a slow network can't trigger duplicate OCR/parse/insight calls. - Reset-on-focus. Loading state resets via
useFocusEffecton screen focus, so a staleisLoadingfrom a previous navigation can't strand the UI.
| Layer | Technology |
|---|---|
| Framework | React Native (Expo), Expo Router |
| Language | TypeScript |
| State | Redux Toolkit |
| Styling | React Native StyleSheet, custom theme (light/dark) |
npm install
npx expo prebuild --clean # if native deps changed
npx expo startThen press i (iOS), a (Android), or w (web preview).
Requires a running backend — set EXPO_PUBLIC_API_URL in .env to point at it.
POST /ocr/extract → { files: [{ text, meta }] }
POST /labs/parse → [{ testName, value, unit, refRange, status, flag }]
POST /nlp/summary → { overallSummary, keyObservations, enrichedMarkers, ... }
- healthlens.app — live product