Case study
MedLit: medical records, explained at your reading level
A grounded pipeline that turns FHIR records into cited plain-language explanations. Built solo as graduate research, in the same months the entire industry converged on the same architecture.

The problem
Patients got their records. They didn’t get understanding.
Federal information-blocking rules require providers to hand patients their electronic health information, and portals satisfy the rule with raw data: “Essential hypertension (disorder), SNOMED 59621000,” medications by clinical name, lab values with no context. About 36% of US adults have basic or below-basic health literacy. The channel that empowers patients also overwhelms them.
The obvious shortcut, pasting a chart into a general-purpose chatbot, has a measured accuracy problem: in one JMIR study, GPT-4 fully correctly answered only 46.7% of patient lab-interpretation questions. The behavior is already mainstream: by early 2026, one in four US adults was asking AI about health, and 11% of recent users reported getting advice they believed unsafe. Generation is commodity. Disciplined grounding is not.
The approach
Three rules the system never breaks
Grounded in sources you can check
The patient's own SNOMED, RxNorm, and LOINC codes key retrieval from NIH MedlinePlus, FDA drug labels, and RxNav. The model personalizes and simplifies retrieved content instead of generating claims, and every response returns its citations.
Labs never touch the model
Reference ranges decide normal versus abnormal deterministically. A model cannot hallucinate a lab value into range because the model is not in that code path.
Reading levels measured, never assumed
Every output is post-scored with Flesch-Kincaid and Gunning Fog, so the interface shows the realized reading level instead of trusting that the prompt's instruction landed.
The pipeline
Retrieval is keyed by the chart’s own codes
A FHIR record already names what to look up. Every condition, medication, and lab carries a SNOMED, RxNorm, or LOINC code, and the federal health APIs accept those same codes as query parameters. MedLit passes them straight through. There is no embedding search and no vector database, so retrieval cannot fetch an article about a lookalike drug; it is exact by construction, and a citation is always about the coded entity in the patient’s chart. What that buys is a testable failure surface: if a citation is ever wrong, the code in the record is wrong, and codes can be checked at ingest.
Sourcing decisions the big launches never have to show
Drug interaction text comes from openFDA labels, and the reason says something about the ecosystem: the best free structured interaction API, RxNav’s, was retired in January 2024 when the DrugBank license behind it expired, and no public replacement has appeared. Condition-to-condition interactions have no public API at all; nothing free encodes “diabetes raises cardiovascular risk” as structured data. MedLit covers that gap by feeding the retrieved content for every active condition into one prompt and treating the result as synthesis, which is looser grounding than the rest of the pipeline and labeled accordingly.
01 · The record, readable
One patient, one page, plain language
A patient’s conditions, medications, and labs arrive as coded FHIR entries and leave as a structured summary a person can act on. Medications show the name from the pill bottle (Spiriva) via RxNav alongside the clinical name tiotropium bromide, interactions come from the FDA label, and each abnormal lab is flagged by its reference range, never by the model’s opinion.


02 · Receipts included
Every explanation shows its sources and its score
Each generated explanation carries a “Grounded in” panel linking to the exact MedlinePlus, openFDA, and RxNav references behind it, plus a readability badge computed on the output text. Toggle between Simple, Standard, and Detailed and the score updates, measured each time.
03 · Try it in one click
A demo that costs nothing to run
Eight synthetic patients with real clinical coding, a one-click demo session, and a pre-generated explanation cache, so the live site answers instantly and never touches an API key. The repo runs locally the same way: docker compose up, no accounts required.
Enter the demo →
By the numbers
01234567890123456789
sources
MedlinePlus, openFDA, RxNav, LOINC, and FHIR ground every claim
01234567890123456789
LLM calls
in lab interpretation; reference ranges decide
0123456789012345678901234567890123456789
errors flagged
plus 22 warnings, first validator run on ten patients; zero errors after cleanup
01234567890123456789
miscoded drugs
plus 4 stale codes, all caught before any user saw them
012345678901234567890123456789012345678901234567890123456789
ms cached
for a repeat answer; cold generation runs about 2 seconds
0123456789012345678901234567890123456789
dollars a month
total monthly infrastructure for the live system
What the build surfaced
The synthetic data was lying
During a review, a physician panelist noticed a medication card citing a topic for ticagrelor, a blood thinner, under a tiotropium label, a COPD inhaler. The pipeline was correct. The code in the synthetic record was wrong. The fix became a validator that checks every coded value against its authoritative source; it caught two more wrong medications and several deprecated codes. If a pipeline joins coded clinical data with external knowledge, it needs to validate code and display consistency at ingest.
The evaluation also replicated a published finding: even prompted for 5th grade, output floors near grade 7.7 (Flesch-Kincaid rose 7.7, 8.1, 9.4 across the three levels, monotonic and in the right direction, and still floored above the Simple target). Lifting that floor is an open research question the system is instrumented to explore.
Two designed comparisons never ran. The pipeline has three grounding modes (full, MedlinePlus-only, none) built to measure how grounding depth changes hallucination rate, and that ablation is still waiting; a multi-model comparison stalled on free-tier rate limits after one model. The evaluation that did run is small: nine generations, one model, automated metrics only. The harness and raw outputs ship in the repo, so both questions can be answered by anyone with an API key.
The timing
Epic, OpenAI, Anthropic, Google, Amazon, and Microsoft all shipped patient-facing record explanation within months of this build. None of us were copying each other. The problem was ripe, and everyone landed on the same shape.
The dates are public now. OpenAI shipped ChatGPT Health on January 7, Anthropic shipped Claude for Healthcare on January 11, Epic rolled its Emmie assistant into MyChart, Amazon took its Health AI from One Medical members to amazon.com in March, Microsoft announced Copilot Health on March 12, and Google connected medical records to its health coach on March 17. All six ground answers in the patient’s own record, explain results in plain language, disclaim diagnosis, and keep physicians in the evaluation loop. Epic’s R&D director gave the reason plainly: grounding in the chart “makes a pretty big difference from an accuracy and safety standpoint.” That is the bet this architecture made in February.
What none of them ship
Five of MedLit’s design decisions still have no counterpart in any of the six launches. None documents per-claim citations a patient can open; Microsoft is the only one that cites sources at all, and to vetted publisher content rather than the references behind each answer. None states that lab interpretation bypasses the model. None commits to a numeric reading-grade target or scores its output. None runs locally; every product sends records to a cloud provider, and privacy researchers spent the spring pointing out that doing so moves those records outside HIPAA. And none has published accuracy numbers for the patient-facing product itself. A solo research build holds none of their advantages in data, distribution, or clinical review. These five decisions are the lane it holds instead.
The receipts are public. So is the person who built them.
