Inspiration

A patient goes to the emergency department with rib pain after a fall. The chest CT finds the fracture, and a lung nodule. That nodule is a single sentence in the middle of a long radiology report. The patient is treated for the rib, sent home, and nobody books the follow-up.

Incidental lung nodules are common, and most are harmless. The ones that matter need a follow-up scan at the right time, and they often fall through the gap between the ER, the report and the family doctor. The guidelines already exist (Fleischner Society 2017). What's missing is a bridge that turns that one sentence into a clear next step for the patient, their family and their doctor.

That's NoduleBridge: no nodule left behind.

What it does

  • Reads the report: an LLM extracts the nodule sentence, size, type (solid or subsolid) and location.
  • Shows it on the real scan: a browser DICOM viewer jumps to the nodule's slice, outlines it and highlights the matching report sentence.
  • Applies the guideline: a deterministic Fleischner 2017 engine (no AI) suggests the next step and cites the rule.
  • Explains it to the patient: plain language in English and Arabic, with a short voice summary.
  • Closes the loop: a referral passport for the doctor (PDF + FHIR summary) and calendar reminders the family can share.

It supports follow-up; it never diagnoses. AI reads. Rules suggest. Doctor decides.

How we built it

Stack

  • Frontend: Next.js (App Router, TypeScript) with a Cornerstone3D DICOM viewer, styled with our Asklevia design system.
  • Backend: FastAPI (Python 3.11) for extraction, the rule engine and the referral passport.
  • Data: real chest CTs from the public LIDC-IDRI collection (TCIA / NCI Imaging Data Commons), prepared offline with pydicom and pylidc.
  • AI: Nebius Token Factory, with Qwen3-235B-A22B-Instruct-2507 as the main model and gpt-oss-120b as fallback, using structured output validated against a schema.
  • Outputs: PDF referral, FHIR R4 summary, .ics reminders.
  • Testing and deployment: pytest, vitest and Playwright for tests; Vercel, Google Cloud Run and Cloud Storage for deployment.

From the report to the voxel

The report says where the nodule is in words; the viewer needs where it is in pixels. A voxel index $(i, j, k)$ maps to patient space in millimetres through the scan's pixel spacing and slice thickness:

$$ (x, y, z)_{\text{mm}} = \big(i \cdot \Delta x,\; j \cdot \Delta y,\; k \cdot \Delta z\big) $$

For our demo case, $\Delta x = \Delta y = 1.40625$ mm and $\Delta z = 2.5$ mm, over a $256 \times 256 \times 133$ volume. Every number on screen (slice, size, side) is computed from this, never typed in by hand.

Measuring the nodule

Fleischner uses the average diameter: the mean of the long and short axes on the same slice, rounded to the nearest millimetre:

$$ d = \operatorname{round}!\left(\frac{L + S}{2}\right) $$

From the radiologists' consensus outline, $L \approx S \approx 22.9$ mm, so $d = 23$ mm. Assuming a sphere, the approximate volume is:

$$ V \approx \frac{\pi}{6} d^3 \approx 6{,}370 \text{ mm}^3 $$

The guideline engine (deterministic, unit-tested)

For a single solid nodule in a low-risk adult, the rule is a simple piecewise function, written as plain code with one test per branch:

$$ f(d) = \begin{cases} \text{No routine follow-up} & d < 6 \text{ mm} \ \text{CT at 6–12 months, then consider 18–24 months} & 6 \le d \le 8 \text{ mm} \ \text{Consider CT at 3 months, PET/CT or tissue sampling} & d > 8 \text{ mm} \end{cases} $$

The LLM only extracts $d$, the nodule type and the location; it never chooses the recommendation. That split keeps the clinical logic auditable.

Challenges we ran into

  • No reports in the dataset: LIDC-IDRI has scans and annotations but no radiology reports, so we wrote demo reports and labelled them clearly as written by the team.
  • Honest AI claims: common nodule detectors are trained on LUNA16, which is built from LIDC-IDRI. Running one on LIDC cases proves nothing about accuracy, so we show the radiologists' consensus outline and label it that way.
  • Getting the guideline exactly right: a solid nodule over 8 mm is "consider CT at 3 months, PET/CT or tissue sampling", not the often-quoted "repeat in 3–6 months". We encoded every branch as tested code instead of trusting the LLM.
  • Letting the data win: we planned the demo around a 9 mm nodule. The real annotated nodule measured 23 mm, so we rebuilt every screen to read its numbers from the data.
  • Getting the imaging: pulling the right CT series from the Imaging Data Commons took longer than expected.
  • Bilingual safety: medical Arabic needs care. AI-assisted Arabic text has to be reviewed by a bilingual clinician before anyone relies on it.

What we learned

  • In healthcare AI, the hard part is often trust, not the model: clear labels, deterministic rules and honest limits.
  • Public datasets are powerful but have gaps (missing reports, overlap with training data), and you have to design around them.
  • Follow-up is a family problem, not only a clinical one: reminders shared with a son or daughter can be what gets the scan booked.
  • Wording matters. "Needs a follow-up check" helps a patient act without causing panic.

What's next for NoduleBridge by Asklevia

  • Clinical validation: test extraction against radiologist-labelled reports, and get the Arabic text reviewed by bilingual clinicians.
  • More guidelines: Lung-RADS for screening, multiple and subsolid nodules, and volume-based thresholds.
  • Hospital integration: RIS/PACS and EHR connections through FHIR, so the flag is raised the moment a report is signed.
  • Pilot: a supervised pilot in a hospital emergency department, under ethics approval.

Example data only. CT: LIDC-IDRI (TCIA), CC BY 3.0. NoduleBridge is follow-up support, not a diagnostic device.

Built With

Share this project:

Updates

Submission history