Index

Projects

Most of these sit where machine learning meets medicine. One is a recipe app.

No. 01 2026 in progress

Clinical AI agents

Why did this patient's treatment change?

An agent that explains why a patient's treatments changed, citing evidence from the record and the notes.

A patient’s record shows that a drug was started, stopped, or switched, but the reason is usually buried in the notes, if it’s written down at all. I’m building an agent that reads the structured record (drugs, labs, diagnoses) alongside the clinical notes and explains each treatment change, citing the evidence for every reason.

Diagram: a structured record and clinical notes feed an agent with tools, which explains why a treatment changed; every citation is then checked against the record.
Fig. 1: Records and notes in, cited explanations out, with every quote checked.
  • The agent works through tools: the patient's timeline, detected treatment changes, the labs around each change, note search, and read-only SQL. Every citation is checked: the cited record must exist and belong to the patient, and quoted text must appear in the note.
  • I adapted SLIDERS, an open-source method for extracting tables from documents, to clinical notes. That meant a treatment-change schema with certainty (performed, planned, considered, held), rules for things like copied-forward medication lists, and a fast profile that cut one run from 45 model calls and 265 seconds to 8 calls and 32 seconds.
  • A combined method lets SLIDERS propose candidate changes and the agent verify the most important ones. Early tests cover only a few case reports and one synthetic patient, so they're hints, not results; human-labeled evaluation is next.
  • Built on public data (the MIMIC-IV demo and PMC-Patients case reports) while access to a larger clinical dataset is pending.

LLM agents · Tool use · Clinical NLP · OMOP · Evaluation

No. 02 2026

Multi-agent LLM system

Specialist diagnosis agents

Specialist LLM agents read a medical report in parallel; a team agent combines their findings.

Three specialist agents (cardiology, psychology, pulmonology) read the same medical report in parallel. A fourth “team” agent then reconciles their findings into the three most likely explanations. I extended an open-source multi-agent project with a reusable analysis pipeline and a web app for uploading a report and reading each specialist’s notes side by side.

Diagram: a report goes to cardiologist, psychologist, and pulmonologist agents in parallel; a team agent combines them into a top three.
Fig. 2: Specialists run in parallel; a team agent reconciles their findings.
  • The three specialist agents run concurrently in a thread pool; the pipeline checks every agent answered before the team agent reconciles them.
  • A FastAPI endpoint accepts pasted text or an uploaded report and returns each specialist's notes alongside the combined assessment, with clear errors for empty input, missing API keys, or a failed agent.
  • My additions to the original project: the analysis pipeline (Utils/pipeline.py), the FastAPI server (webapp.py), and the web front end (web/).
  • All sample reports are synthetic. Research and education only, not for clinical use.

LLM agents · Python · FastAPI

No. 03 2025

Web app · Team of four

PocketCare

Explains medical bills and insurance plans in plain language.

Medical bills and insurance plans are written for billing departments, not patients. PocketCare reads a bill or a plan and explains it in plain language, then answers follow-up questions about your own documents. Bill text is de-identified (names, account numbers, and other personal details removed) before it’s sent to the language model.

Diagram: PDF bill, then Document AI OCR, then de-identification with Presidio, then Gemini.
Fig. 3: Bill text is de-identified before it reaches the model.
  • Pipeline: Google Document AI reads the PDF, a de-identification step (Microsoft Presidio plus custom recognizers for things like account numbers) strips personal details, then Gemini 1.5 Flash explains it with task-specific prompts.
  • Limits: raw documents pass through Document AI for OCR before de-identification, and a user's follow-up questions are sent to the model as written.
  • Django REST API with session auth and CSRF protection; Next.js and TypeScript front end; saved bills and analyses live in a per-user document library.

My part: Set up the Django backend and built the bill-breakdown feature end to end, from upload and document parsing to analysis, including the prompts behind the bill and insurance explanations.

Next.js · Django · Gemini · Document AI

No. 04

Computational biology · Team of two

How gene variants change a transplant drug's binding

Simulated how gene variants change a transplant drug's binding, using AlphaFold and molecular docking.

Tacrolimus keeps transplanted organs from being rejected, but the right dose varies widely from person to person. We simulated how known genetic variants change the drug’s binding to the proteins that metabolize and transport it.

Three predicted protein structures: CYP3A5*1 in cyan, the truncated CYP3A5*3 in green, and the wild type in pink.
Fig. 4: Predicted CYP3A5 structures: *1 (cyan), the truncated *3 (green), and wild type (pink). From the paper.
  • Built mutant protein sequences for five variants of CYP3A5 and ABCB1 from a pharmacogenomics database, predicted their structures with AlphaFold, and aligned them against the wild type in PyMOL.
  • Docked tacrolimus into each structure with AutoDock Vina and compared binding affinities.
  • CYP3A5*3, which truncates the protein, bound far more weakly than the wild type (−4.93 vs −7.02 kcal/mol), consistent with the slower drug metabolism seen in carriers.

AlphaFold · AutoDock Vina · PyMOL · Pharmacogenomics

No. 05 2024

Mobile app · Team of four

Munchly

A mobile app that turns what's in your pantry into recipes.

An app that turns what’s already in your pantry into recipes, and keeps your grocery list in sync with what’s missing.

Diagram: your pantry feeds a recipe search through the Spoonacular API, which returns recipes; recipes can be saved, and missing ingredients go to a grocery list.
Fig. 5: How the app fits together: pantry in, recipes out, missing ingredients onto the grocery list.
  • Recipes come from the Spoonacular API; the pantry, saved recipes, and grocery list are stored on the device.
  • Built with Expo Router tabs for search, pantry, and saved recipes.

My part: Wrote the app's foundation (search, pantry, and saved tabs), plus theming, the grocery list, and recipe details.

React Native · Expo · Spoonacular API

No. 06 2024

Research paper · Team of three

Predicting Alzheimer's disease from a blood test

Blood-protein models that predict Alzheimer's disease with a test AUC of 0.84.

Diagnosing Alzheimer’s often relies on clinical judgment or a spinal tap. We tested whether a blood draw could do the job, training classifiers on plasma protein levels. Adding the proteins lifted test AUC from 0.64 with demographics alone to 0.84.

ROC curves for logistic regression models, with proteomics AUC 0.84 highest, beside a bar chart of the top protein features.
Fig. 6: ROC curves by feature set (left) and the proteins the model weighted most (right). From the paper.
  • Data: demographics plus plasma protein measurements (SomaScan) for 2,091 patients from the Knight Alzheimer's Disease Research Center, split 70/15/15 into train, validation, and test.
  • Compared logistic regression, SVMs, XGBoost, and neural networks, tuned with cross-validation. L1-regularized logistic regression did best (test AUC 0.84), ahead of XGBoost on the top 100 proteins (0.83) and the SVM (0.78).
  • Its top features (acetylcholinesterase, SPC25, neuronal pentraxin receptor) point to biological pathways that may break down in Alzheimer's.

My part: Built the SVM and neural-network models and wrote the related-work, methods, results, and conclusion sections.

Logistic regression · SVM · XGBoost · Neural networks · Proteomics

No. 07 2024

LLM assistant for emergency medicine · Team of three

AssistEMT

An LLM assistant for EMTs; GPT-4 with retrieval scored 88.3% on a written EMT exam.

A conversational assistant that walks through an emergency medical assessment following national EMT guidelines, designed to work alongside robots that perform the physical exam. We fine-tuned GPT-3.5 on EMT datasets we built, and compared it against GPT-4 with prompt engineering and with retrieval.

Bar chart of written EMT exam scores: OpenBioLLM 71.6, GPT-3.5 76.6, fine-tuned GPT-3.5 80.0, GPT-4 87.5, GPT-4 with retrieval and prompting 88.3; passing is 70.
Fig. 7: Written exam scores by model; the fine-tuned GPT-3.5 (red) was my part. Numbers from the paper.
  • Built two EMT-specific datasets (1,056 Q&A pairs from national EMS guidelines and 1,562 from an EMT textbook) and fine-tuned GPT-3.5 on combinations of them plus PubMedQA.
  • Compared that with GPT-4 using prompt engineering, and GPT-4 with retrieval over EMT documents and web search.
  • On a 120-question written EMT exam, GPT-4 with retrieval and prompting scored 88.3% and GPT-4 alone 87.5%. Fine-tuning GPT-3.5 on all three datasets raised it from 76.6% to 80.0%.
  • Trained EMTs graded each model on clinical scenarios with the official rubric. GPT-4 with prompt engineering did best there (0.80 average), ahead of GPT-4 with retrieval (0.66) and fine-tuned GPT-3.5 (0.43).

My part: Fine-tuned the GPT-3.5 models and built our EMT datasets, including a 1,562-pair question-and-answer set drawn from an EMT textbook.

Fine-tuning · RAG · GPT-3.5 · GPT-4 · Evaluation

No. 08 2023

iOS health app · Team project

GetMoovin

An iPhone app that helps people walk more with daily step goals, progress charts, and nudges.

An iPhone app that nudges people to walk more. It reads their daily steps from Apple Health, tracks progress toward a goal they set, and keeps them going with long-term charts and motivational messages.

Sketch of two phone screens: a ring showing 7,840 of 10,000 steps with a motivational quote, and a bar chart of daily steps against a goal line.
Fig. 8: A sketch of the two main screens, not a screenshot. The progress chart (right) was my part.
  • Reads step counts from Apple Health (HealthKit) and shows progress toward a daily goal as a ring, with a long-term chart of daily steps against the goal.
  • Onboarding asks for Health and notification permissions and helps people set a goal; finishing the day's goal unlocks a shareable photo.
  • Built in Swift and SwiftUI on Stanford's CardinalKit framework for health apps, with automated builds and TestFlight releases.

My part: Built the long-term progress chart and kept it in sync with each user's goal, added the motivational messages, and designed the app icon.

Swift · SwiftUI · HealthKit · CardinalKit

No. 09

Research paper · Team of two

Brain tumor segmentation in 3D MRI

Compared three 3D models for brain tumor segmentation; the attention U-Net reached 0.88 whole-tumor Dice.

Radiologists still outline brain tumors in MRI scans by hand, which is slow and depends on the reader. We compared a 3D U-Net with an attention-based U-Net and a transformer model for labeling every voxel as one of three nested tumor regions. The attention U-Net did best, reaching a whole-tumor Dice score of 0.88.

Three brain MRI slices with predicted tumor regions colored in yellow, red, and cyan.
Fig. 9: Predicted tumor regions from (a) the Attention U-Net, (b) the 3D U-Net, and (c) DubTransBTS. From the paper.
  • Compared three models on BraTS 2020 multimodal MRI scans: a 3D U-Net baseline, a 3D Attention U-Net, and DubTransBTS, a transformer-based model built to capture long-range spatial context.
  • Dice scores for the 3D U-Net: 0.870 whole tumor, 0.782 tumor core, 0.745 enhancing tumor. The Attention U-Net improved all three, most of all on the enhancing tumor: 0.881 / 0.786 / 0.796.
  • DubTransBTS struggled to capture tumor detail (0.635 whole-tumor Dice), so attention on top of a convolutional U-Net was the most effective change we tried.

PyTorch · 3D U-Net · Attention · Transformers