Project Info
Inspiration
Studies show adverse drug interactions cause over a million preventable hospital admissions annually in the US. Despite this, clinicians lack quick access to real-world evidence at the point of care. The FDA's FAERS database contains over 10 million adverse event reports—but it's buried behind technical barriers and complex statistics. I built SpliceSentinel to bridge that gap: making FDA evidence instantly actionable in plain English during the prescribing decision.
What it does
SpliceSentinel helps a doctor check the safety of a drug combination using real FDA data. The doctor uploads a patient's medical records and prescriptions, and the tool: Extracts medications and history from the documents using Claude Pulls real adverse event reports for that drug combo from FDA FAERS Flags statistically significant risks using the Proportional Reporting Ratio (PRR ≥ 2) Surfaces similar real patient cases with matching conditions Writes a clinical summary explaining the risk in plain English The result: a doctor gets evidence-backed answers in seconds instead of hours of manual research.
How we built it
The backend runs on Python and FastAPI, with Claude handling document parsing, FDA data analysis, and the final plain-English summary. Sentry tracks performance and errors. The frontend is React, with drag-and-drop upload and an interactive graph of adverse events. Results are cached in JSON for speed.
Challenges we ran into
Files weren't fully saved before we read them. Temporary files were sometimes read before they finished writing to disk. Fixed with explicit file.flush() and os.fsync() calls. Multi-file upload kept breaking. React wasn't applying the multiple attribute consistently. Fixed by separating the input elements and adding deduplication logic. Hundreds of adverse events were impossible to read at a glance. Solved with an interactive, color-coded network graph with search and hover tooltips. Sentry needs real signal, not noise. We had to instrument FDA queries carefully so slow calls were tracked meaningfully without adding unnecessary overhead.
Accomplishments we're proud of
A statistically sound signal detection method (PRR), not just raw event counts Reliable file handling that holds up with real, messy medical documents A visualization that makes thousands of FDA data points understandable at a glance Full observability into performance and errors via Sentry A complete, working full-stack app — not just a prototype
What we learned
How FDA adverse event reporting actually works, and where its limits are How to reliably parse real-world medical documents (encoding issues, large files, messy formatting) How to turn statistics into clear, trustworthy clinical language without oversimplifying How to use Sentry to catch slowness, not just crashes — critical in a healthcare context How much careful I/O handling and error recovery matters once you're handling real medical data
What's next
A faster way for individual doctors to onboard — no IT department or hospital procurement needed More data sources — FDA drug labels, contraindication databases, clinical literature A second opinion mode so a doctor can quickly sanity-check a prescribing decision before signing off Mobile app so a doctor can use it at the bedside, not just at a desk
🔬 Drug Interaction Checker
A hackathon-ready tool for doctors to check if a drug combination is dangerous for a specific patient using real FDA adverse event data.
🎯 What It Does
- Doctor enters: 2 drugs, patient age/sex/conditions/meds
- System queries: openFDA FAERS database (30M+ adverse events)
- Calculates: Statistical signal (PRR) for dangerous combinations
- Finds: Real similar patient cases from FDA data
- Generates: AI summaries & clinical documentation (with Claude API)
Result: Beautiful progressive reveal showing investigation happening in real-time
🏗️ Architecture
Frontend (React + Framer Motion)
↓ (axios calls)
Backend (FastAPI + async)
↓
openFDA API (real data, no key required)
↓
Claude API (optional, for narratives)
📦 What's Built
PARTS 1-3: Core Functionality (Ready Now ✅)
- PART 1: openFDA query layer (1,600+ reports tested)
- PART 2: PRR signal detection (266 elevated signals found)
- PART 3: Patient similarity scorer (5 similar cases found)
PARTS 4-7: Backend Complete ✅
- PART 4: Claude AI integration (narratives + notes)
- PART 5: Confidence/data-quality handling
- PART 6: Arize Phoenix observability
- PART 7: Complete FastAPI endpoints
PARTS 8-15: Beautiful Frontend ✅
- PART 8: Check combination form
- PART 9: Live query progress indicator
- PART 10: Signal results table
- PART 11: Similar cases cards (staggered animation)
- PART 12: AI narrative summary
- PART 13: Copy-ready clinical note
- PART 14: Progressive reveal container
- PART 15: Framer Motion animations
🚀 Quick Start
Prerequisites
- Python 3.9+
- Node.js 16+
Backend Setup
# Install Python dependencies
cd backend
python3 -m pip install -r requirements.txt
# Copy env template and add your APIs (optional)
cp .env.example .env
# Run backend
python3 app.py
# Runs on http://localhost:8000
Frontend Setup
# Install Node dependencies
cd frontend
npm install
# Run dev server
npm run dev
# Opens http://localhost:3000
Test PARTS 1-3 (No API key needed!)
cd backend
python3 test_parts_1_to_3.py
Expected output:
- 1,628 Warfarin + Ibuprofen reports
- 266 elevated signals
- 5 similar patient cases found
🔑 Optional: Add Claude (PART 4)
- Buy $5 API credit from https://console.anthropic.com/account/keys
- Update
.env:ANTHROPIC_API_KEY=your_key_here - Restart backend
- Claude narratives & clinical notes auto-activate
Cost: ~$0.006 per drug check (833 checks for $5)
📊 Test Case: Warfarin + Ibuprofen
A real, dangerous combination. Expected results:
✅ 1,628 combination reports
⚠️ 266 elevated signals
🔴 Top: INR increased (PRR 218.89x vs Warfarin)
👥 Similar cases found: 5
Try with patient profile:
- Age: 67
- Sex: Male
- Conditions: Atrial fibrillation, Hypertension
- Current meds: Warfarin, Metoprolol
🎨 Frontend Features
- Progressive Reveal UI: Results appear step-by-step as data loads
- Smooth Animations: Framer Motion for polished feel
- Responsive Design: Tailwind CSS for all screen sizes
- Copy-Ready Clinical Note: One-click clipboard for EHR integration
- Real-Time Progress: Visual indicators showing what's happening
📈 Data Confidence Handling
HIGH (≥30 reports): Results reliable
MODERATE (10-29): Interpret cautiously
LOW (<10): May be random, flag explicitly
⚠️ Known Limitations
- Simplified PRR (not Omega shrinkage/BCPNN used in published research)
- Patient data manually entered (not from real EHR)
- FAERS narratives vary in availability/quality
- Tool is for clinical review, not recommendations
🏥 FDA Data
- Source: openFDA Drug Adverse Event API
- Database: FAERS (30M+ reports since 2004)
- Updates: Daily
- Coverage: US adverse events + international
- No API key required for low-volume queries
📚 Example Reactions Detected
For Warfarin + Ibuprofen:
- International Normalised Ratio increased (PRR: 218×)
- Completed suicide (PRR: 999×)
- Pulmonary embolism (PRR: 231×)
- Gastrointestinal bleeding (detected reliably)
🎯 Next Steps for Hackathon
- ✅ Run both servers
- ✅ Test form with Warfarin + Ibuprofen
- ✅ Watch progressive reveal animation
- ✅ Copy clinical note to clipboard
- 🎁 (Optional) Add Claude API key for AI summaries
📝 Architecture Notes
Why FastAPI + async?
- Parallel openFDA queries (fast)
- Graceful Claude API calls (slow network-bound)
- Real-time feel with progress updates
Why Framer Motion?
- Industry-standard React animations
- 60fps smooth reveals
- Small bundle (~45kb)
Why Tailwind?
- Rapid styling (no CSS writing)
- Consistent design tokens
- Mobile-first responsive
🔗 Resources
📜 License
Built for hackathon. Use at your own risk. Not for clinical decisions.
Built with: Python, FastAPI, React, Tailwind, Framer Motion, openFDA, Claude AI
Status: Ready for demo 🚀
Analysis
View
Metric
- 50
- 43
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
- AnthropicIn code
- CSSIn code
- FastAPIIn code
- HTMLIn code
- JavaScriptIn code
- PythonIn code
- ReactIn code
- Tailwind CSSIn code
8 of 8 appear in the indexed code.
AI coding agents
- Claude CodeConfig · Commits
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
818 KB
Source files
199
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
AnushaAgarwal27/SpliceSentinel
219 files · 1.9 MB · @ 1e9acfb
Structure
Interface
20 files · 9%Screens, components and styles rendered to the user.
Application logic
37 files · 17%Domain rules, services and shared utilities.
+2 more
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- Markdown59%
- JavaScript25%
- Python15%
- CSS1%
- HTML0%
- Shell0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
backend/requirements.txt
pypi · 14- anthropic
- arize-phoenix
- fastapi
- httpx
- openinference-instrumentation-anthropic
- opentelemetry-api
- opentelemetry-exporter-otlp
- opentelemetry-sdk
- pydantic
- PyPDF2
- python-dotenv
- python-multipart
- sentry-sdk[fastapi]
- uvicorn
frontend/package.json
npm · 13- axios
- clsx
- framer-motion
- lucide-react
- react
- react-dom
- react-force-graph-2d
- recharts
- +5 more
requirements.txt
pypi · 8- arize-phoenix
- fastapi
- google-generativeai
- httpx
- pydantic
- python-dotenv
- sentry-sdk[fastapi]
- uvicorn
package.json
npm · 4- react
- react-dom
- react-force-graph-2d
- react-scripts
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
This project’s features have not been analysed yet.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.