All work

Case 01 · Health · Privacy-first AI

ruwth

Turning the panic of sudden hair loss into a calm, structured, doctor-ready record, with an AI that helps you read the data but never sees your photos.

Role
Product · UX · Front-end build (solo)
Stack
React Native (Expo) · Supabase · Gemini · Stripe
For
Women 25–45 with sudden diffuse shedding
Status
Built · running on device
ruwth home: evidence dashboard with shed count, photos and the weekly check-in
ruwth Health tab: lab biomarkers shown with calm sage and amber status colours
ruwth routine: scan your products to start tracking

Real screens · built in React Native, running on device

01 · The problem

People doing all the right things about their hair loss still can't tell whether any of it is working.

Sudden, diffuse shedding is frightening in a specific way: it's visible, it's daily, and the cause is rarely obvious. The people I designed for had moved past "what's wrong with me" into "I'm doing something about it": they were on finasteride, minoxidil or supplements, they'd had blood work done, they had months of hair photos. And they were still flying blind.

The reason is that the evidence lives in disconnected places:

  • Lab results are a paper or PDF: read once, lost in a drawer. No way to track a value over time, and no idea which of the 30+ numbers actually matter for hair.
  • Treatments live in memory. "I started finasteride in… February? And my shedding was… less? I think?"
  • Photos are stranded in the camera roll: inconsistent angles, undated, mixed in with everything else.
  • Symptoms are forgotten. A stressful week's flare-up is gone by the next doctor's visit.

Nobody connects the dots. The dermatologist sees labs; the patient sees hair; no one is cross-referencing a ferritin trend against a treatment start date against photo progression against a symptom pattern. A dermatologist does exactly this in their head during a 15-minute appointment, but only with the fraction of the data the patient can remember on the spot.

02 · Who it's for

Discovery and a strategy session narrowed a broad "hair app" down to one sharp user and one breaking moment: a woman noticing sudden shedding and feeling the floor drop out. Two personas drove the design: one who wants depth, one who needs speed. Designing for both at once forced better solutions than either alone.

Nadia, the active treater
Primary persona · wants depth

Already on medication, has blood work, takes photos. She wants to see whether her protocol is working and to walk into her next appointment with evidence, not vague recollection.

"I'm doing everything I'm supposed to. I just want to know if it's actually helping."
Priya, the time-poor tracker
Secondary persona · needs speed

Will only keep using the app if every action is scan-and-done. Logging a symptom or a lab has to take seconds, or it won't happen at all.

"If it takes more than ten seconds, I'm not going to do it."

That tension (depth for Nadia, speed for Priya) became a design constraint I held throughout: rich intelligence underneath, but never more than a tap or two to feed it.

03 · The hard part

An AI that helps you read your health data, without becoming a place that data leaks.

The whole product depends on an AI that can reason over someone's blood work, medications and symptoms. That is also exactly the data you must never be careless with. So the privacy boundary wasn't a setting bolted on at the end. It was the first architectural decision, and it shaped the UX.

  • Only structured data leaves the device. Extracted biomarker values, treatment names, symptom severities. Never photos, never raw lab images. The AI reasons over numbers and labels, not pictures of you.
  • The model is reached server-side, behind auth. Calls go through an authenticated edge function (JWT), gated by an explicit per-readout consent step and a usage rate-limit, not a raw client-to-model pipe.
  • Image OCR was deliberately deferred. Reading values off a lab photo would mean sending a health image to a third-party model. I cut it from v1 specifically to keep those images on-device, and made manual entry fast instead.
  • The AI readout sits beside the factual record, never inside it. The doctor-ready PDF is pure fact: counts, dates, values, trends. The AI interpretation is a separate surface, so the clinical document keeps its credibility.

And the language is bounded at the prompt level. The readout never says "you have iron deficiency." It says "this is a pattern worth discussing with your doctor," with the specific question to ask. In health, the calm, non-diagnostic framing is the design: get it wrong and you've either frightened someone or implied a diagnosis you have no right to give.

In a health product, trust isn't a feature you add. It's the substrate every other decision sits on.
04 · The intelligence

The value is never in one stream of data. It's in the connections between them.

Five streams feed the readout: blood work, treatments, products, symptoms and photos. Any one of them is a snapshot; the insight lives in the correlation. The engine is a reasoning layer with embedded hair-science knowledge, not a chatbot.

It knows hair-optimal ranges, not just lab-normal ones

A lab flags "ferritin 15: normal." For hair, 15 is well below optimal. That single distinction is most of the product's value: surfacing the values that are technically fine but suboptimal for hair, with the reason why.

BiomarkerLab "normal"Optimal for hairWhy it matters
Ferritin12–150 ng/mL> 70 ng/mLMost common nutritional cause of shedding in women.
Vitamin D30–100 ng/mL40–60 ng/mLTied to the follicle growth cycle.
TSH0.4–4.0 mIU/L1.0–2.5 mIU/LA "normal" 3.8 can still drive diffuse loss.

It reasons across the timeline

Treatments are time-aware, so the readout can tell encouraging signal from expected side-effect:

  • Minoxidil + more shedding at week 4 → "Initial shedding is normal: it's pushing resting hairs out to make room. Usually resolves by month 3." (Reassurance, with evidence.)
  • Iron started, ferritin 15 → 38 → "Real progress. Keep going. The target for hair is above 70."
  • Low ferritin, no iron logged → a flagged gap: "the most addressable cause of your shedding isn't being treated."

The output is shaped, not dumped: lead with what's working, flag concerns with evidence rather than fear, name the gaps, and hand over specific questions for the next appointment.

05 · Design decisions

Anti-alarm by default

This audience is already anxious. A red "ABNORMAL" banner on a lab value is technically accurate and emotionally destructive. So the entire status system is built to inform without frightening: same information, calmer register.

ValueLabelTone
In healthy rangeIn rangeNeutral. No commentary needed.
Low side of normalOn the low side"Within range but on the lower end, worth keeping an eye on."
Below rangeBelow range"Below the typical range, worth discussing with your doctor."
In range
Sage · #B8D4C8
Worth watching
Amber · #F0C987
Worth discussing
Rose · #E8627C

Never: "Danger," "Critical," "Abnormal," red fills, exclamation marks. Always: "worth discussing," "worth monitoring," "your doctor can help interpret this." The AI's whole personality is a knowledgeable, calm, evidence-based companion: it celebrates progress, reassures with evidence, and never uses fear to drive action.

The payoff is a two-minute doctor visit

The exportable report isn't a data dump. It's a structured clinical summary: what the patient reports, the lab trends, the treatments and durations, the response, and the questions to discuss. It saves the dermatologist fifteen minutes and gives them something they almost never get: months of continuous, organised data.

06 · Scope discipline

The free product is four evidence pillars, each kept ruthlessly fast for Priya: a 60-second shed count with baseline and trend, guided standardized photos with a ghost-overlay for alignment, a 2–4 month trigger timeline, and manual lab entry, all exportable as the doctor-ready PDF. The AI readout is the paid layer.

What I deliberately left out says as much as what I built:

Deferred
Photo / lab-image OCR

Would put health images in front of a third-party model. Cut to v1.1 to keep them on-device.

Excluded
Daily adherence nags

That's a pill-reminder app. ruwth is an evidence log: the value is the record, not the nag.

Excluded
Drug-interaction warnings

Medical liability. "Discuss with your doctor" is the honest, safe boundary.

Compliance
Web checkout, not IAP

The paid readout bills through Stripe on the web, respecting Apple's anti-steering rules.

07 · Honest status
Where it actually is

Built end-to-end and running on a physical device. The four evidence pillars, the doctor PDF export, and the privacy-bounded AI readout (JWT-auth edge function, per-readout consent gate, usage rate-limit, and a structured schema that forces calm, non-diagnostic, baseline-only output) are all coded and committed, with zero npm vulnerabilities and a written privacy contract. It is not on TestFlight or the App Store yet, and it has no paying users. The remaining work is the live model key, the Stripe checkout deploy, and store submission.

I'm stating that plainly because the discipline of this project (privacy-first AI over sensitive health data, anxiety-aware clinical UX, non-diagnostic language) only counts if the claims around it are honest too. The product is real and demonstrable. It hasn't met its first user yet.

Next case → Brain OS