Inspiration

In many Indian households, a grandparent comes home from the doctor with a slip of paper that reads like code: Tab. Metformin 500 1-0-1 PC, Tab. Atorvastatin 10 HS, Paracetamol 650 SOS. That shorthand is written for the pharmacist, not for the person who has to take seven tablets a day, often without their glasses, and often in a language other than English.

The numbers back this up. A pooled review of 27 Indian studies found that about half of older adults in India take five or more medicines at once (Bhagavathula et al., Frontiers in Pharmacology, 2021). The WHO estimates that people with long-term illnesses take their medicines as prescribed only about half the time, and less in lower-income settings.

Families already have a low-tech fix: a handwritten chart taped to the fridge. Dose Card makes that chart automatically, clearly, and in Nani's own language.

What it does

Dose Card turns a prescription into a big, picture-based medicine timetable you print and stick on the fridge.

  1. Photograph the prescription, try the built-in sample, or type the medicines in. Dose Card reads each medicine's name, amount, times of day, and whether it goes before or after food. It understands Indian shorthand like 1-0-1, ½-0-½, OD, BD, TDS, QID, HS, SOS, AC, and PC.
  2. Check every row against the paper. Anything unclear is marked Please check. You can fix amounts with + and −, tap the times of day, and choose before or after food.
  3. Pick the grandparent's language from 15 options: Hindi, Bengali, Marathi, Telugu, Tamil, Gujarati, Kannada, Malayalam, Punjabi, Urdu, Spanish, French, Arabic, Chinese, and Portuguese. Each label prints in English with the chosen language underneath.
  4. Print one A4 card, with medicines down the side and Morning / Afternoon / Evening / Night across the top. It has a picture for every dose and for before or after food, a legend, and an optional "If unsure, call" number.
  5. Scan to hear it. The QR code on the card opens a talking version. Tap a time of day and the phone reads out what to take, in the card's language, so it works for grandparents who can't read. Share on WhatsApp sends the same talking card to the rest of the family.

Two rules shape the whole product:

  • It copies, it never advises. Only medicines written on the paper go on the card. Dose Card never adds, removes, or suggests a medicine or a dose, and every card says to confirm with a doctor or pharmacist.
  • Private by design. There are no accounts and no database. The photo is sent once to be read and is never stored or logged. The list lives in your browser, and the card travels inside the link itself, so it never reaches our server.

How we built it

We planned before writing code. Using the Devpost Learn skill pack, we wrote a scope doc, a PRD, a technical spec, and a build checklist, all included in the repo's devpost/ folder. Those documents kept a hackathon-sized project focused on one screen and one job.

  • Stack: Next.js with TypeScript, deployed on Vercel, with pnpm for packages and Vitest for unit tests.
  • One screen: Start buttons, the editable medicine list, card details, and a live card preview all sit on a single page. The list is saved only in the browser's localStorage.
  • One server function: app/api/read sends the photo to Gemini's vision model (gemini-3.5-flash) with a fixed JSON schema. If it's busy, the request falls back through two more Gemini models and then to Claude Sonnet 5.5. Every response is validated with zod before it reaches the UI, so a malformed reading can't silently become a malformed card. Fields the model isn't sure about become Please check flags.
  • Translations without AI at runtime: The card's fixed labels ("Morning," "After food," "1 tablet," "If unsure, call…") for all 15 languages live in lib/translations.ts. Switching language is instant and doesn't call a model, so the AI's only job is reading the prescription.
  • The talking card: The QR code and WhatsApp links carry the whole card in the URL's # fragment, which browsers never send to the server. The /listen page decodes it and reads each time slot aloud using the browser's built-in speech voices.
  • Print: A dedicated stylesheet prints only the card, sized to fill one A4 page.
  • Works without a key: Typing and printing work with no API key, and the sample prescription falls back to a saved real reading, clearly labelled "Sample reading (saved)."
  • Evals: We made 17 fictional prescriptions with 72 medicines, drawn with handwriting typefaces and then tilted and blurred to look like phone photos. They include 13 handwriting styles, a typed discharge summary, and three hard cases: an elaborate script, a very blurry photo, and instructions written in Hindi. pnpm render-evals && pnpm eval runs each image through the same reader the app uses and scores every field against a pharmacist-style answer key. The raw readings are cached in evals/raw/, and every result is published on the Evidence page.

Challenges we ran into

  • Shorthand is ambiguous. BD means twice a day, but which two slots? One printout said "BD (8 AM, 4 PM)." The reader put 4 PM under Evening, while our answer key said Afternoon, and the row wasn't flagged. That single miss is why checking each row against the paper is a required step, not an optional one.
  • Our own answer key was wrong once. On the Hindi prescription, सुबह-शाम literally means "morning and evening." The model read it correctly, but our key had said "morning and night." Honest evals meant auditing ourselves too.
  • Keeping the AI in its lane. It would have been easy to let the model fill in missing timings or "fix" doses. We limited it to transcription with a strict schema and validation, because a confident wrong answer on a medicine chart is worse than a blank one.
  • Reliability during a demo. Free-tier model capacity isn't guaranteed, so we built a fallback chain across several Gemini models and Claude, plus a saved sample reading so the app still demos end to end.
  • Translation quality. Medical phrases like "before food" or "only when needed" have to be natural and unambiguous in 15 languages we can't all personally verify, so the labels were machine-drafted and openly marked as such.
  • Privacy without a backend. We wanted shareable, scannable cards with no database, so the whole card had to fit in a URL fragment that stays short enough for a printed QR code to scan reliably.
  • Designing for low vision and low literacy. The card needed large type, a picture for every dose, a bilingual two-line layout, a voice option, and a single printable page.

Accomplishments that we're proud of

  • On our 17-prescription test set, Dose Card found all 72 medicines and read

$$\frac{287}{288} \approx 99.7\%$$

of details correctly (amount, unit, timing, and food relation), with zero invented medicines.

  • It handles real Indian prescription patterns: half tablets, syrups in ml, eye drops, inhaler puffs, sachets, weekly doses, and instructions written in Hindi.
  • We publish every test prescription, including the one it got wrong, not just a headline number. Anyone can re-run the evals from the repo.
  • The QR-to-speech card means a grandparent who can't read either script can still use the card on their own.
  • It's free, with no sign-up and no stored data, and it's open source under MIT.

What we learned

  • For safety-critical AI, the human-in-the-loop step is the product. The Please check flags and the review screen matter as much as the model's accuracy.
  • Evals keep you honest. A small, well-designed test set caught a real model error and a mistake in our own answers. It also forced us to say clearly what the numbers do and don't show: computer-drawn prescriptions are a best case, and real handwriting is messier.
  • Use AI only where it's needed. Putting translations in fixed labels instead of model calls made the app faster, cheaper, more predictable, and easier to correct.
  • Planning documents pay off, even in a hackathon. Writing the scope, PRD, and spec first made it obvious what to leave out.
  • Accessibility goes beyond font size. Language, literacy, eyesight, and which family member manages the medicines all shape what "readable" means.

What's next for Dose card

  • Test on real, consented handwritten prescriptions with doctors and pharmacists to measure accuracy outside the lab.
  • Native-speaker review of every translation, and more Indian languages such as Odia and Assamese.
  • Recorded audio for languages where phones lack a good built-in speech voice.
  • Better flagging of ambiguous timings like "BD (8 AM, 4 PM)," so they're marked for checking rather than guessed.
  • Optional caregiver reminders through WhatsApp or SMS, while staying account-free.
  • Partnerships with clinics, pharmacies, and elder-care NGOs so the card is printed at the counter along with the medicines.

Built With

Share this project:

Updates

Submission history