Inspiration
Leaving the hospital means leaving with two crowded pages: medicines, doses, warning signs, follow-up visits. You are tired, maybe scared, maybe reading in your second language. An AI summary can help, but a fluent summary you cannot check is a risk, because a made-up dose sounds exactly as confident as a real one. We wanted a tool where trust matters more than fluency.
What it does
Sendhome turns a discharge sheet into a plain-language plan: a summary, a medicine table, a "call your care team" list, a "go to the ER" list, and follow-up visits. The reading level drops from about grade 12 to about grade 6.
- Every line has a source. Click "Show source" and the exact sentence in the original paperwork lights up.
- Missing stays missing. If the sheet gives no dose, Sendhome says "Dose not listed, confirm with your nurse" instead of guessing.
- Questions stay on the page. Ask about your sheet. If the answer is not in it, you get a fixed refusal: "That isn't in your paperwork, ask your nurse."
- Spanish you can verify. The plan is translated, then translated back to English by a separate call that only sees the Spanish, so you can check a language you do not read.
- Break it. One button corrupts a dose and adds a dangerous false line, then shows the checker catching both.
- Official label, powered by Anakin. For any medicine, we fetch the official MedlinePlus page and show a word-for-word excerpt with a link, clearly marked as not from your paperwork.
- More pages: medicine schedule, printable warning-signs card, questions for your nurse, read-aloud, and a report card of how it scored on our own tests.
How we built it
The core idea is quote-then-verify. The model must return a verbatim source_quote for every item. Deterministic Python then locates that quote in the original (exact match, then normalized, then best-sentence similarity at 0.85 or higher) and flags anything it cannot find, any missing dose, and any number that changed. The AI proposes; code checks.
- Backend: stateless FastAPI. Nothing a user types is stored.
- Refusals in code: if the model says the answer is not in the document, or its supporting quotes cannot be found, the server returns the fixed refusal text itself.
- Models: Groq (gpt-oss-120b, with fallback to gpt-oss-20b and qwen3.8-27b when the free daily cap is hit).
- Anakin: its web-data API fetches the MedlinePlus page for a medicine. Our code extracts excerpts and checks they are substrings of the page, so web information gets the same checkable-quote treatment. Only the generic medicine name is sent, never the patient's text.
- Frontend: plain HTML, CSS and JavaScript, no build step, hash-routed pages, text rendered with
textContentonly. - Hosting: Render free web service. The three built-in samples ship with saved results from a real run, labelled as such, so the demo works instantly.
Challenges we ran into
- Rate limits ate our budget. Our own evaluation runs nearly used Groq's free daily token cap. We added a model fallback chain, saved real-run results for the built-in samples, and a clear "busy" message.
- Our first test sheets were too easy. The reading grade did not drop, and two doses lost their strength. We rewrote the samples realistically, tightened the dose prompt, and kept the failed first run in the repo.
- The model silently dropped warning signs. Sometimes a whole group vanished. We added an explicit completeness rule and re-ran the evaluation.
- Matching medicine names to official pages. "Metoprolol succinate" and "amoxicillin-clavulanate" do not match page titles. We built token matching with stem handling, and excluded injection and topical pages unless asked for.
- Honest Spanish. The first translations dropped "you" and sounded impersonal. We changed the prompt and re-checked every sample.
Accomplishments that we're proud of
- A checker that catches its own tampering, live, with the Break it button.
- 19 of 19 medicines and 37 of 37 warning-sign keywords found across five hand-labelled synthetic sheets, with doses right 18 of 19 in the first run and 19 of 19 in the next two. The misses are listed in the README.
- 64 automated tests, and a fresh clone runs with no API key.
- A live deployment, and a report card that shows failed runs, not just the good ones.
What we learned
- Fluency is not accuracy. The most useful design decision was making the model quote the page, then not trusting the quote.
- Enforce important behavior in code, not in the prompt. Refusals are far more reliable as a fixed string than as model wording.
- Our own evaluation changed the product: it found the lost doses and dropped warning signs we would have missed by eye.
- Reporting failures builds more trust than hiding them.
What's next
- Next 2 weeks: photo and PDF input with OCR, and more evaluation sheets.
- Next 3 months: Spanish and other languages reviewed by native speakers, and a clinician review mode.
- Long term: testing on real de-identified documents under proper approvals, then discharge-sheet checking offered to hospitals and patient-education teams.
Sendhome is a hackathon prototype built on synthetic documents. It is not medical advice and has no clinical validation.
Built With
- anakin
- css
- fastapi
- github
- gpt-oss-20b
- groq
- groq-(openai/gpt-oss-120b
- html
- httpx
- javascript
- medlineplus
- pydantic
- pytest
- python
- qwen3.8-27b)
- render

Log in or sign up for Devpost to join the conversation.