Project Info

RadAssist

Devpost

How we built it

# RadAssist β€” Explainable AI Radiology Assistant An AI that reads alongside radiologists β€” it drafts, highlights, and explains, but the clinician decides. And it's honest about exactly how good it is. πŸ”— Try it out Use only public / de-identified images β€” it's a research demo, not for real patient data. πŸ’‘ About the project RadAssist is a full-stack, decision-support workspace for chest X-ray, CT, and MRI. Upload a scan and a deep-learning model flags possible findings and highlights where it looked; the radiologist confirms, edits, or dismisses each one; and the app drafts a complete report β€” clinical, a plain-English patient summary, and differentials β€” that a named clinician signs before it can be exported. Its guiding principle is unusual for a medical-AI demo: the model suggests, it never diagnoses β€” and it never claims more than it can measure. It provides the accuracy ** It shows a ranking score instead of a fake "probability", it **abstains on images it can't read instead of guessing, it never calls a scan "normal" on its own, and it publishes its real measured accuracy β€” including where it fails. πŸ“– The story It started with an uncomfortable observation: the world has a shortage of radiologists and a surplus of "AI that diagnoses" β€” tools that confidently label a scan and hope nobody reads the fine print. In medicine, a confident wrong answer is worse than no answer at all. RadAssist took the opposite bet β€” an AI that earns trust by being honest. It reads a scan with the clinician, shows its reasoning with Grad-CAM attention maps, admits its uncertainty, and refuses to overrule the human. When it isn't sure, it says so. When it sees an image it wasn't trained on, it abstains. And it puts its own scorecard on the wall β€” AUROC, calibration error, and the labels it's weak at. What began as a chest-X-ray demo grew into a real clinical product: a CT/MRI viewer with a full measurement suite and clearly-labelled research AI, structured reporting with mandatory human sign-off, and a production-grade backend β€” an optional database, two-factor authentication, session management, encrypted secrets, ~300 automated tests, a CI pipeline, and a one-command Docker deploy that's live on its own domain. RadAssist is a research/education prototype β€” not FDA-cleared, not a medical device. That honesty isn't a disclaimer bolted on at the end; it is the design. This cannot be used on real Patients 🧰 Tech stack Frontend [x] React 19 + Vite 8 (SPA, custom lightweight routing) [x] Plain CSS design-token system β€” light/dark, 4 accent themes, flash-free [x] three.js β€” interactive 3D "scan volume" hero [x] jsPDF β€” in-browser PDF report export (nothing stored server-side) [x] qrcode β€” 2FA enrollment QR [x] Web Speech API β€” voice dictation for findings Backend / API [x] Python 3.11 Β· FastAPI Β· Uvicorn (ASGI) Β· Pydantic [x] REST API (~30 endpoints) serving the SPA same-origin AI / ML [x] PyTorch + TorchXRayVision β€” DenseNet-121 chest-X-ray ensemble (18 pathologies) [x] pytorch-grad-cam β€” attention/explainability overlays [x] OpenCV, NumPy, SciPy, scikit-image, pandas β€” imaging, measurements, classical CT/MRI candidate detection [x] pydicom + Pillow β€” DICOM parsing, windowing, de-identification [x] Out-of-distribution abstain gate + isotonic calibration + an on-repo validation harness (AUROC / ECE / NPV) [x] Optional LLM report formatter β€” Gemini / Groq / Ollama, with a deterministic template fallback (the LLM only formats, never invents findings) Database / persistence [x] SQLModel (SQLAlchemy 2.0) β€” SQLite β†’ PostgreSQL, versioned with Alembic [x] PHI-safe by design (no pixels or patient identifiers in the DB); off by default (zero-config demo) Security [x] Stateless HMAC signed-cookie sessions + DB-backed revocation [x] scrypt password hashing Β· TOTP two-factor auth Β· 2FA secrets encrypted at rest (Fernet / cryptography) [x] Double-submit CSRF, per-account lockout, rate limiting, CSP/HSTS headers, fail-closed secrets [x] In-memory DICOM de-identification + secondary-capture quarantine DevOps / quality [x] Docker (multi-stage: builds the SPA, bakes the model weights) [x] GitHub Actions CI (tests + build + dependency audits) Β· Dependabot [x] pytest β€” ~294 automated tests Β· pip-audit / npm audit (0 known vulnerabilities) [x] Hosted on Fly.io + Cloudflare (also deployable to Hugging Face Spaces) ⭐ What makes it different Honest by construction β€” ranking scores not fake probabilities; abstains rather than guesses; a "not a normal read" safeguard so a no-flag scan is never mistaken for a clean bill of health. Explainable β€” every finding carries a Grad-CAM attention map, a reliability label, and a plain-language explanation. Measured, not claimed β€” a live Evidence page shows the model's real performance and its weak spots. Human-in-the-loop, always β€” AI flags arrive unchecked; nothing is finalized until a clinician signs. Genuinely full-stack β€” model, API, database, auth/2FA, security, tests, CI, and a live deployment. ⚠️ Honest limitations Metrics are measured on a public in-distribution benchmark and are optimistic; the chest-X-ray model is reliable only as a high-sensitivity review prompt for a few findings, and CT/MRI AI is unvalidated research. RadAssist is not a diagnostic device and not FDA-cleared β€” it's a demonstration of how to build medical AI responsibly.

Analysis

Compare with all teams

View

Metric

Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.

Technology

Found in codeClaimed only
  • CSSIn code
  • FastAPIIn code
  • HTMLIn code
  • JavaScriptIn code
  • PythonIn code
  • ReactIn code
  • DockerClaimed
  • PostgreSQLClaimed
  • PyTorchClaimed

6 of 9 appear in the indexed code. 3 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.

AI coding agents

No AI coding agent signals were found in this repository.

Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.

Codebase size

Source size

1.7 MB

Source files

210

Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.

0 stars