Radbase
A de-identified teaching-case archive for hospital radiology departments, with a mandatory consultant sign-off, AI-suggested tagging and a cited reference library.

Radbase turns the imaging studies and reports that radiology departments already produce into a teaching library that trainees can search. A resident uploads a DICOM study and its report. The system removes identifying information from the image headers, from text burned into the pixels and from the report itself. A consultant confirms the result, and only then does the case join the department's archive.
Once published, a case can be browsed in a faceted library, read in a built-in DICOM viewer, collected into teaching sets, quizzed on with spaced repetition, and read alongside a licensed reference library whose answers cite their sources. It is an educational tool: it has no reporting or dictation features, and AI output is always presented as a suggestion for a teacher to check.
Radbase is pre-pilot. The full case pipeline runs on the development stack; hospital deployment and a consultant-labelled AI evaluation are the next milestones. No usage figures exist yet, and none are claimed here.
Real cases teach best, and they are full of patient data
Radiology trainees learn from real cases, and departments are full of them. In practice those cases are collected informally: screenshots in messaging groups, folders on shared drives, slide decks that go stale. Nothing is categorised or searchable, and a collection often leaves with the person who built it.
A shared archive is simple in principle and hard to build responsibly, because every study carries patient information in three places: the DICOM headers, text burned into the pixels by ultrasound machines and screen captures, and the free-text report. Missing any one of them publishes patient data to a whole department. Hospitals also expect the system to run on their own hardware, inside their own network.

Privacy enforced by permissions, not good intentions
The de-identification boundary is enforced by storage permissions. Uploads go straight from the browser into a quarantine bucket that only the Python processing worker can read. The API can write a presigned upload into it and nothing more, so even a serious flaw in the API tier cannot reach raw patient data.
A person decides what gets published. The pipeline never publishes anything itself: every case stops at a review screen where a consultant sees each image that had a text detection, the redactions already applied and the rewritten report. High-risk modalities cannot be passed by the person who uploaded them, a case whose pixels were never OCR-scanned cannot be passed at all, and publishing re-checks the decision on the server.
AI only suggests. Classification and report extraction run on de-identified text, every suggested tag must quote the passage it came from, and suggestions stay visibly unconfirmed until a person confirms them.

From upload to a published, citable teaching case
A guided upload wizard accepts ZIP and RAR archives, DICOM files, pasted report text and PDF reports, and streams live processing progress back to the browser. Original filenames are never stored, because they routinely contain patient names. An optional gateway accepts studies pushed straight from the PACS workstation.
The worker rebuilds DICOM headers from an allowlist based on DICOM PS3.15, burns redactions into the stored pixels after OCR, and replaces identifiers in reports with placeholders such as [NAME] and [DATE] so sentences keep their teaching value. Every run writes an append-only record of what was removed, never the removed values.
Published cases appear in a faceted library, a 3D anatomical navigator and a taxonomy tree. Each hospital is isolated by forced PostgreSQL row-level security, and the whole stack installs on a single on-premise machine with preflight checks, encrypted backups and versioned upgrades.
Three-layer de-identification
DICOM headers rebuilt from an allowlist, burned-in pixel text found by OCR and redacted in the stored pixels, and report identifiers replaced with placeholders that keep the sentence readable.
Consultant review gate
Pass, redact more with drawn boxes applied to the stored pixels, or reject. Independent review is required for high-risk image types, and a case with no OCR scan cannot be passed.
AI tagging that shows its evidence
Classification and report extraction quote the passage behind every value, may explicitly decline to answer, and stay marked as suggestions until a person confirms them.
Reference library with citations
Answers drawn only from licensed sources, every sentence tied to a numbered passage, and an explicit refusal when the library holds nothing relevant.
Case library, viewer and quiz
Faceted search with live counts, a Cornerstone3D DICOM reader, teaching collections and FSRS spaced-repetition quizzes.
Built for on-premise hospitals
A single-machine install with preflight checks, an air-gap bundle, encrypted backups with a restore drill, and upgrade and rollback scripts.








- 01
Credentials guard raw patient data
Storage access is split across three service accounts. The API has no credential that can read quarantine, so the most important privacy property survives a code mistake.
- 02
Two isolation layers per hospital
Application role checks plus forced row-level security in PostgreSQL. The API refuses to start under a database role that could bypass those policies, and CI fails any table without one.
- 03
Two runtimes for a reason
Next.js 15 and NestJS 10 in TypeScript for everything user-facing, and a Python 3.12 worker on ARQ for DICOM, OCR and report processing, the only process allowed to touch raw uploads.
- 04
Model-agnostic AI layer
A provider abstraction with a Claude adapter using structured outputs, prompt caching and batch processing, a mock adapter for CI, and an evaluation harness ready for consultant-labelled cases.
- 05
Hybrid retrieval, honestly reported
Full-text search and pgvector retrieval merged by reciprocal rank fusion, with an optional reranker. Each answer states whether it was lexical-only or hybrid and whether reranking ran.
- 06
Tested at depth
CI runs type checks including mypy strict, unit and integration suites and a 56-study synthetic DICOM corpus with planted fake identifiers, about 2,200 automated tests in total.
- A department can collect teaching cases in one place without putting raw patient data in front of the application tier.
- Every case needs a named consultant's sign-off before anyone else can see it.
- Trainees can find cases by facet, anatomy or text, read them in a DICOM viewer and ask questions answered only from licensed, cited sources.
- A hospital can run the complete system on one machine inside its own network.