Inspiration
A midwife already writes each visit on a paper fiche de surveillance de la grossesse et du post-partum. Once it is on paper, the next visit cannot see it. She can photograph the page from the phone she already uses.
What it does
She sends one page on WhatsApp. DayOne stores the photo, reads the clinical lines, and asks her to confirm, correct, or attach the visit to a dossier. Her name, her spouse, her CIN, her phone number, and her address are dropped. If the read fails, the photo stays in Postgres and is tried again a minute later.
How we built it
The record is the fields on the fiche, each with a status. Claude receives the photo plus the line, the column, and the words that belong there, including RAS and NF. The code checks the guess. A date has to parse. A count has to be digits, RAS, or NF. Visible ink and a value that fits the column become KNOWN. The API only stores the photo. The worker does the read.
Challenges we ran into
A blood pressure in the second visit column has to stay in that column. OCR returns characters in the order it saw them, and there is no labeled training set for this form. WhatsApp will not take the photo while the phone has no network. After the photo is stored, a failed read leaves it in the queue. Meta also needs a public URL. A live read needs Anthropic credits.
Accomplishments that we're proud of
Two demo dossiers share the fiche code CM-1001: DOS-1A and DOS-1B. "Je ne sais pas" creates nothing. "Aucune créer" opens a new profile. A second photo of a stored page asks her to replace it or keep it. The tests run with a stand-in reader and never call Meta or Anthropic.
What we learned
The readable part of a bad scrawl is knowing the cell. The TA row is a blood pressure, so 11/7 is a reading. RAS means nothing to report. NF means not done. The model returns the text and whether it sees ink. The status is assigned afterward, in code.
What's next for DayOne
Delivery, postpartum, labs, temperature, and the newborn are still on paper. The field has no confidence score. SYNC_FAILED is a legal state and the current code never enters it. A live read sends the image to Anthropic, so it stays on the synthetic pages.
Built With
- docker
- fastapi
- postgresql
- python
- whatsapp-cloud-api
Log in or sign up for Devpost to join the conversation.