william garrow

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.

medlit.williamgarrow.com
MedLit landing page

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.

DATA SOURCESFHIR R4 BundlePatient, Conditions, Meds, LabsMedlinePlusNLM health educationopenFDADrug interaction labelsLOINC RangesLab reference valuesPROCESSINGFHIR ParserExtract clinical dataRAG Prompt BuilderPatient context + references + levelGENERATIONLLMGroq / Ollama / ClaudeNo LLM neededLab InterpretationColor-coded statusOUTPUTReadability ScoringFlesch-Kincaid + Gunning FogStructured Patient SummarySections + sources + scores

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.

medlit.williamgarrow.com
Patient detail with coded conditions and a structured summary
medlit.williamgarrow.com
A generated explanation with citations and a measured reading level

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 →
medlit.williamgarrow.com
The patient dashboard

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.