Read the prescription. Not the handwriting.
Photograph a prescription. Get a large-type medicine schedule you can read aloud.
Free. A capstone project, not a company. It reads and organises — it gives no medical advice.
Every value shows the handwriting it came from
Two vision models read the page separately — neither sees the other’s answer. Tap any field to see the crop it was read from, both readings with their confidence, and the rule in application code that decided between them.
- The crop comes from the image as captured, never the contrast-enhanced copy — that can thicken a stroke until a 1 reads as a 7.
- Both model names and prompt versions are recorded against every value.
- Adjudication is application code. A model never decides what you are shown.
How it works
Four steps. The two in the middle are where most of the engineering went, and they are the two a person actually notices.
-
Photograph the page
Sharpness, glare, skew and stroke width are measured on your own device before anything is uploaded. A page too blurred to read is refused here, with the reason, rather than becoming a confident wrong reading later.
-
Cover the personal details
Two guided taps put black boxes over the name and phone number. The pixels are destroyed on a canvas, not hidden with an overlay. Your original stays in your own storage; only the covered copy is ever sent to be read. Skipping is allowed and recorded as your choice.
-
Two readers, working separately
The covered page goes to two different vision models at once — Claude Sonnet 5 on the image as captured, Gemini 3.1 Pro on a straightened, contrast-adjusted copy. Neither sees the other’s answer. They are from different families on purpose: two models that share a blind spot would agree with each other and tell you nothing.
-
You confirm before it becomes a schedule
Where the two readings differ, or a value is unclear, the field stops and asks you — showing the crop of handwriting it came from. Nothing becomes a time until you say so. A blank stays blank; it is never filled in.
Three limits it will not cross
- It never fills in a blank
- If a duration is not written on the page, the schedule says it is not written on the page. Nothing is inferred, completed or tidied. A field the two readers disagree on stops and waits for you.
- Every value shows its source
- Tap any field to see the crop of handwriting it was read from, both readings side by side with their confidence, the models and prompt versions that produced them, and the rule in application code that decided between them.
- It reads and organises. Nothing more.
- Docuroutine transcribes what a clinician wrote and lays it out in large type, in your language, with audio. It does not originate, alter or recommend a dose, and it offers no advice about diet, alcohol or exercise. Those are permanent limits, not features waiting to be built.
Measured, with the scope attached
Every figure below came from a run in this repository. Each is printed with what it does not cover, because a number without its scope is a claim about something else.
-
0 dangerous errors
across 78 scored runs
On ten synthetic pages, not real prescriptions. A dangerous error is a field the screen showed as settled fact that the page does not say — defined in code before anything was measured.
-
9 pages scored
1 refused by the quality gate
The tenth page was refused on this device before any model saw it. A refusal is the product’s answer about that page, so it is counted rather than dropped.
-
12 Pass B failures
of 90 reads. Pass A failed none.
A 13% provider failure rate, recorded rather than retried around. It is why one page reports as an observation instead of a property: it reached four scored runs, not five.
-
795 tests
passing on the commit this site ships from
Unit and integration tests over parsing, adjudication, translation and the audit trail. Not a measure of reading accuracy — that is the number above.
What these numbers do not say
Everything above is measured. This is what it does not cover, kept at the same size as the claims rather than in a footer.
- No real prescription has been scored.
- The ten pages are synthetic — authored from published ISMP look-alike and sound-alike pairs, then machine-rendered from a manifest. That is why the numbers may be published at all. They are clean renders of one to three printed lines. The one real photograph this project was given defeated both readers at the size it arrived, and is the subject of four decision records.
- “0 traps hit” means no confusion occurred, not that the ensemble catches it.
- Each page carries a named wrong answer — Metronidazole for Metformin, Glyburide for Glipizide. None was produced. That is a fact about ten renders. It is not the same claim as “two readers detect a look-alike substitution”, which would need a page where one reader actually falls for it.
- A dangerous-error rate on synthetic pages is evidence the instrument works.
- It is not evidence the product is safe. The held-out set of consented real documents does not exist yet, so no figure here describes the corpus the harness was built for.
What the person taking the medicines sees
A link you send them. No account, no password, nothing to install.
- Large type, one control, times grouped by part of the day.
- One button reads the schedule aloud, in their language.
- Turn the link off at any moment — it stops the audio too.
Questions
Does it decide anything about my medicines?
No. It reads what is written on the page and lays it out. It never originates, alters or suggests a dose, drug, strength or duration, and it never fills in a field it could not read. Where the two readers disagree, it stops and asks you rather than picking one.
Who sees my prescription?
A copy with the name and phone number blacked out is sent to Anthropic and Google to be read. The original never leaves your own storage — it sits in a private bucket that only your account can open, behind short-lived signed links. Neither provider is given the unmasked page.
Why two models instead of one good one?
Because a single reading cannot be checked against anything. Two models from different families are given deliberately different pixels and never see each other’s output, so when they disagree the disagreement is informative. That disagreement is what raises a field to you instead of letting it through.
What happens to my documents if I want them gone?
You can delete a single document or a whole person’s record from inside the app. Both remove the rows and the stored images, and the deletion is confirmed against the storage API rather than assumed from a success response. The audit trail of what happened is kept for a year, as India’s DPDP Act requires — it holds no picture of your page and no medicine from it.
Is it accurate?
On ten synthetic pages it produced 0 dangerous errors across 78 scored runs. No real prescription has been scored yet, and that number is evidence the measuring instrument works rather than evidence the product is safe. The harness, the metric definitions and the runs are public.
Does the person taking the medicine need an account?
No. They open a link you send them and see their times in large type, in their language, with a button that reads the schedule aloud. You can turn the link off at any moment, and turning it off stops the audio too.
What languages does it ship in?
English, with Hindi, Bengali, Marathi, Tamil and Telugu built and marked as awaiting native-speaker review. Drug names are never translated. An instruction that has not been reviewed by a speaker of that language is not shown as reviewed.
Is this a medical device?
No. It transcribes and organises a document a clinician already wrote. It makes no claim about whether what is written is correct, and it gives no health advice. The schedule times it proposes are ordinary conventions that you approve before anything activates.
About
Docuroutine is a solo capstone project, built in the open between August and September 2026. It exists because handing an elderly parent a photograph of a prescription is not the same as handing them a schedule they can read.
The engineering decisions are written down as they were made — including the wrong ones. Twenty-seven decision records cover, among other things: a metric that improved as the product got worse, a quality gate that measured the camera instead of the page, and four separate records about one photograph that both readers failed to read.