All work Case 02 · Prototype · Mobile app and site · 2026

Lysa by ERRATA

Three screens of the app: the conversation where she writes in plain words, capturing a symptom, and the dark voice recording screen.
A health notebook for women whose conditions were measured against the wrong reference data. A prototype.

Result

A prototype that puts her story back in order and never reads a value for her.

My part
Everything, alone: product, brand system, mobile app, API, regulatory notes and the marketing site. [Confirm: did a lawyer review anything?]
Time
16 March to 17 May 2026, 33 commits. Prototype: some screens run on fixtures, no users yet.
Constraint
One individual suggestion would make it a medical device under EU law.

[See it] [Repo or walkthrough]

She writes in plain words, Lysa keeps it, reads her documents, and compiles one PDF. Everything about that invites the app to go one step further and read her values for her, and one individual suggestion, a test, a specialist, a drug, would make it a medical device under EU law.

[What she does today: how her history gets to the doctor without Lysa.]

In May I took the clever parts out.

Two months in, the product had pattern-detection mock data on home, records and tracking, value flags coupled to the cycle phase, and cycle prediction markers. It felt like care.

The regulatory dossier in May 2026 flagged every one of them as a trigger for medical device law. Down that road: 24 to 36 months and €0.6M to €2M through a notified body. Staying out of it: a wellness app under GDPR consent and the AI Act’s transparency rule, shippable now. So they were purged, and every lab value is restated only against the range printed on her own report.

docs/regulatory-notes.md · Decision 005, May 2026 · [Confirm who wrote the dossier]

  1. Rejected

    Keep the clever parts

    Phase-coupled flags and predictions are interpretation, and interpretation is a medical device.

  2. Rejected

    Flag it red

    A warning from her own data is monitoring. Safety lives on one static page, the same for everyone.

  3. Chosen

    Say what the paper says

    Plain language, her report’s own range, nothing added.

I chose

A wellness app under GDPR consent and the AI Act, shippable now.

It cost

The clever parts, and the satisfying answer.

The model extracts. It does not read into anything.

Input Her words and documents
Hono, Prisma, Postgres FHIR-aligned, cycle day tagged
Model · Claude Extraction, plain language
Check She reviews and removes anything
No model · one static page Safety information, shown the same way to everyone
What she gets One PDF for her doctor

Where it does not decide

Seven legal lines, each one drawn into the product. Crossing any of them would change what Lysa legally is. They came in May, two months in, when the dossier landed, and the product was cut back to fit them.

The line What it became in the product
No diagnosis, no prediction None of the regulated verbs in any copy: diagnose, prevent, monitor, predict, treat.
No individual next step Lysa never names a test, condition, drug, specialty or referral for her.
No red flags from her own data Safety information sits on one static page, shown the same way to everyone.
No cross-correlation Documents and logs are never compared with each other. Chronology, not correlation.
No phase-adjusted ranges The cycle day is a tag on an entry, never a lens on a value.
AI Act Art. 50(1) disclosure Shown on every surface where she talks to the model, and it can’t be closed.
No claims against clinical practice The site persuades on structure, rigour and data ownership. Never “what your doctor missed”.

Not yet

Extraction is not evaluated: no test set and no German lab samples yet. [How you will check it: how many documents, against what, graded by whom.]

Where it still breaks.

The case What it did What I did about it
A value with no printed range The flag is null. Lysa says nothing about it. By design: the flag comes only from the range printed on the document.
Three screens of the app. Home: she writes that she woke up at 4 again, and Lysa answers that it recorded the waking and that it is the fourth 4am waking noted this month (1). Capture symptom: a migraine at severity 7, tagged automatically with day 22, luteal (2). Capture voice, designed but not yet built: a dark recording screen at 0:38 (3).
  1. Reflects, doesn’t read into it It counts what she wrote, “the fourth 4am waking this month”, and stops there.
  2. The cycle day, nothing more Every entry carries the day it was recorded. No value is re-read by phase.
  3. Talk instead of type Designed, not yet built. No audio library in the app.
[MP4 · Talk, then the entry appears]

What it does for her

Type, or attach a document. Nothing she enters is interpreted. [Voice input is designed, not built: no audio library in the app.]

extraction-document.ts · lines 43 to 44
Determine the flag (high/low/normal) ONLY from
the reference range printed on this document
alongside each value.
If no reference range is printed for a value,
set flag to null.

What to notice

No health data lives on the phone. Sign-in is a magic link, no passwords.

No users yet.

A prototype. The middle is built, the edges are not: 1 of 4 onboarding screens, 5 of 7 flows without an error state, the language toggle deferred, the end-to-end smoke test still open.

[What you would do differently. Two months of building what the dossier then removed is the obvious first line.]