Skip to content
yalt8826.com
← projects/
projects/medintel/finishedfull stackai

MedIntel

Upload a medical report and get a summary you can check, a risk score that explains itself, and answers that cite the page they came from.

Aug – Sept 2026

01 / overview

It started with my granddad's checkups.

My granddad gets regular checkups, and each one leaves another report full of numbers. I wanted a way to keep track of them all and actually understand what they meant, and whether anything was changing from one visit to the next.

MedIntel reads a report (a PDF, a scan or a phone photo), pulls out every finding with the exact text it came from, summarises it, flags what looks worrying and why, and tracks it across reports. You can then ask questions in plain language and get answers that cite their source.

100%extraction accuracy on 41 hand-checked findings
100%top-1 retrieval for chat questions
92–100%of summaries fully traceable to the report
0features that stop working when the AI is offline
02 / screens

From upload to answer.

Every patient and report here is fictional demo data; no real medical data is involved.

01Patient dashboard with the latest risk for each patient
02Uploading a report: each processing stage lights up as it finishes
03The report with its source lines highlighted, risk score and summary
04“Why flagged”: every factor, its value and the exact line it came from
05One patient over three reports: risk trend, timeline and what changed
06Asking about a report: the answer cites page, section and source text
03 / report to answer

Every report walks the same path.

Each upload moves through a fixed sequence of stages. Every stage can be re-run without duplicating anything, and if one fails, the original file and its text are always kept.

readPDF · scan · photo
text extractionOCR when a page has no textsection detection
extractstructured findings
value + unit + range + source textLLM or regexnormaliser
summarisegrounding guardrail
every number re-checked against the report
assessdeterministic
risk score + levelcontributing factors“Why flagged”
indexpgvector
chunks + embeddingscited chatwhat changed between reports
04 / built to be trusted

Medical numbers leave no room for guessing.

riskThe AI never scores risk

Risk comes from a fixed, weighted rule set over the extracted findings, so the same report always gets the same score. Every score is labelled as screening help, not a diagnosis.

summariesNothing untraceable gets through

A guardrail checks every value and name in a summary against the report. Anything it can't trace is stored as an issue, not quietly shown.

chatAnswers only from the report

Chat answers come from retrieved passages, with page and section citations. If nothing relevant is found, it says so instead of guessing.

offlineWorks with the AI switched off

Extraction, summaries, risk and search all have deterministic fallbacks. Only free-form chat needs the language model.

evidenceClick a factor, see the line

Each risk factor links to the finding behind it, and each finding links to the highlighted text in the original report.

exportA PDF to take to the doctor

Summary, risk and findings, exported as one document.

05 / evaluation

Measured against hand-checked reports.

An evaluation script runs the system against nine synthetic reports written to be awkward: missing values, repeated readings, multi-page layouts, poor formatting. Each metric has a pass mark set in advance.

MetricResultPass mark
Extraction: value, unit and status100% (41 findings)≥ 90% · pass
Summary grounding (deterministic)100% (9 summaries)≥ 95% · pass
Summary grounding (stored, incl. LLM)92.3% (13 summaries)reported
Retrieval: right passage in top 1 / 3 / 5100% / 100% / 100% (27 questions)top-5 ≥ 90% · pass
Risk checks: score, level, factors, confidence13 / 13 on eachall pass

These are synthetic test reports, not a clinical validation.

06 / architecture

Five layers, one command to run.

A React dashboard talks to a FastAPI backend, which separates the API, the business logic and the AI components, all on PostgreSQL with pgvector. docker compose up brings up the whole stack with the demo patients already loaded.

React 19ViteTailwind 4rechartsFastAPISQLAlchemyPostgreSQL 16pgvectorsentence-transformersTesseract OCRReportLabDocker Compose