Project Info
Inspiration
Every day, radiology reports flag findings that need a follow-up scan, a specialist referral, or a repeat in six months. And every day, a huge number of those follow-ups never happen. The patient leaves the imaging center, the recommendation sits in a PDF, and nobody closes the loop. These missed follow-ups are one of the most preventable failure points in healthcare, and they fall hardest on patients who don't speak English well or don't know how to navigate the system. We wanted to build the thing that actually makes the follow-up happen proactively, without taking the doctor out of the decision.
What it does
Recall closes the loop on radiology follow-ups: An imaging center's radiology report comes in as a PDF. Claude parses the report and classifies the finding against published clinical guidelines (Fleischner, BI-RADS, and others) to decide whether a follow-up is needed and how urgent it is. It drafts a patient-facing call script, then routes the case to a radiologist for sign-off. No patient is ever contacted without explicit human approval. Once the radiologist approves, a multilingual voice agent calls the patient, explains the follow-up, and books the appointment, in the patient's preferred language. The whole pipeline is decision-support, not autonomous diagnosis. The human sign-off gate is the floor: the system physically cannot dial a patient on an unapproved case.
How we built it
The backend is a FastAPI service that orchestrates the pipeline. Claude handles the report parsing, guideline classification, urgency triage, and script drafting. The voice agent is built on a Twilio + Deepgram bridge, with Claude as the reasoning layer driving the conversation, and it streams audio in real time over a websocket for the length of the call. Radiologist sign-off happens by email or directly from the doctor dashboard; both paths converge on the same approval function, which flips the case to approved and triggers the outbound call. The frontend is a Next.js app on Vercel with a landing page, a patient portal, and a doctor dashboard. Case data, audit logs, and call outcomes live in Supabase. The multilingual support is real: the voice agent swaps its speech and transcription models per language and localizes the greeting, so a French-speaking patient hears a fluent French call, not English with an accent.
Challenges we ran into
Holding a live phone call open. A patient call lasts minutes, and the websocket to the voice provider would silently drop during conversational pauses. We had to add a keepalive heartbeat to hold the connection open while the patient was thinking. Multilingual speech recognition. Getting a non-English call to actually transcribe correctly meant pinning the recognition language explicitly, because the model would otherwise default to English and turn French replies into word-salad. Keeping the safety gate airtight. We wanted the approval-to-call flow to be impossible to bypass, so the call function re-checks the approval status from the database at dial time rather than trusting the caller. Integrating four people's work under a deadline. Voice, orchestrator, and frontend were built in parallel and had to converge cleanly.
What we learned
How much of a "working AI product" is actually the unglamorous plumbing, the keepalives, the language pinning, the idempotency, the human-in-the-loop gate. The Claude reasoning was the easy part; making it safe and reliable enough to put on a real phone call to a real person was the hard part.
What's next
Real clinical validation, proper patient consent flows, HIPAA-grade infrastructure, and retry cadences for patients who miss the first call. We deliberately scoped the human sign-off as mandatory and would keep it that way in production.
Recall
Voice agent that closes the radiology follow-up gap. Decision support only; a radiologist signs off before any patient is contacted.
Read CLAUDE.md first. It is the source of truth for architecture, the safety
invariants, the 5 Claude tools, and lane ownership.
Lanes
api/orchestrator— Vedant (FastAPI + Claude tools)api/voice— Anish (Deepgram Voice Agent + Twilio + SMS sign-off)supabase/— Anish (schema, realtime, storage)web/— Aditya (Next.js dashboard)
Setup
cp .env.example .envand fill keys.- Apply
supabase/schema.sqlto the Supabase Postgres instance. - Each lane runs its own service. Deploy api -> Render, web -> Vercel.
Branches
main (protected, PR + 1 review until code freeze), vedant/backend,
anish/voice, aditya/dashboard.
Analysis
View
Metric
- 22
- 16
- 7
- 4
- 2
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
- Next.jsIn code
- PythonIn code
- ReactIn code
- SQLIn code
- SupabaseIn code
- Tailwind CSSIn code
- TypeScriptIn code
- VercelClaimed
10 of 11 appear in the indexed code. 1 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
AI coding agents
- Claude CodeConfig · Commits
- CodexConfig
- CursorCommits
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
563 KB
Source files
157
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
anishko/recall
202 files · 4.1 MB · @ 8226030
Structure
Interface
68 files · 34%Screens, components and styles rendered to the user.
API & routing
41 files · 20%Request entry points: routes, handlers and controllers.
Application logic
26 files · 13%Domain rules, services and shared utilities.
Data & schema
7 files · 3%Schema definitions, migrations and data access.
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
- TypeScript66%
- Python17%
- Markdown13%
- CSS2%
- Shell1%
- SQL0%
- Other (1)0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
new-web/package.json
npm · 27- @radix-ui/react-avatar
- @radix-ui/react-collapsible
- @radix-ui/react-dialog
- @radix-ui/react-progress
- @radix-ui/react-select
- @radix-ui/react-separator
- @radix-ui/react-tabs
- @radix-ui/react-tooltip
- @supabase/supabase-js
- @tanstack/react-virtual
- class-variance-authority
- clsx
- framer-motion
- lucide-react
- next
- partysocket
- react
- react-dom
- +9 more
web/package.json
npm · 21- @base-ui/react
- @supabase/supabase-js
- @tanstack/react-table
- class-variance-authority
- clsx
- lucide-react
- next
- next-themes
- react
- react-dom
- shadcn
- tailwind-merge
- tw-animate-css
- +8 more
api/requirements.txt
pypi · 11- anthropic
- fastapi
- httpx
- PyJWT
- pytest
- python-dotenv
- python-multipart
- supabase
- twilio
- uvicorn[standard]
- websockets
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.