# Soma — case study by Anton Kozionov

> Lab results read and charted on the phone, with an on-device AI that explains but never diagnoses

- Role: Solo: product, design, regulatory line and release
- Team: Solo; Claude Code agents write the code
- Timeline: Oct 14–24, 2026
- Status: In TestFlight
- Tags: health, on-device AI, solo
- Case study page: https://kodsgn.com/work/soma/

## Highlights

- Code computes the facts, the on-device model only phrases them: off-topic content fell from 20.8 markers per answer to 0.03
- Free-tier chat cut from 14 elements and six routes to the paywall to one card and one action
- Report recognition at 0.976–0.998 across three test sets

I wear a Garmin and get regular blood tests, and I noticed something drifting. I uploaded the results to Gemini, but seeing the whole picture meant digging out old reports and uploading them again, and after emigrating, my results were spread across labs in different countries. Soma reads a lab report (PDF, photo or scan) on the phone, charts every marker against your own lab's range, and has an assistant that runs on the phone too. No account, no cloud, no analytics. Its core comes from Salient, an earlier project of mine I've paused: maximum privacy and an AI model on the device instead of the cloud.

[Image: Onboarding before: a spinner on an empty screen while the report is read]
[Image: Onboarding after: the report thumbnail with rows lifting into a list]
[Image: Onboarding: one insight, "ferritin has been falling for a year", with a two-sentence AI answer]

*Onboarding: from a spinner to watching the report being read, then one insight instead of a dashboard.*

## Code computes the facts; the model only puts them into words

A small on-device model mixes things up and invents causes. So code works out every status, trend and link between tests, parses the question ("bad cholesterol" → LDL) and hands the model only that slice to phrase. Off-topic content in narrow answers fell from 20.8 markers to 0.03, and answers got a third faster. I also had a cloud mode built, then kept it out of the release: fewer privacy obligations, no API costs, and no cloud code in the binary.

## "Education, not diagnosis" decides what a screen may say

Software that assesses a specific person can become a medical device: certification, a legal team and audits that a solo product can't carry. So staying a wellness app is a business decision first: launch as a non-medical product, then find partners, such as labs, to build the medical side with. A disclaimer doesn't keep you on the right side of that line; the interface does. So there are red lines: no disease names next to a result, no own alert thresholds, no risk scores, no drugs or diet for a person. Critical-value alerts were built and cancelled the same day once they ranked as the riskiest feature; Soma now only mirrors a flag the lab itself printed. Blood pressure has no category colours, and BMI is a dot on a neutral line.

[Image: Weight page: BMI as a dot on a neutral 15–40 line, no categories]
[Image: LDL page before the redesign]
[Image: LDL page after: one anatomy, reference material moved into a Details sheet]


## A wrong number is worse than a missing one

A misread comma once turned an allergy result into a false strong sensitivity. So Soma doesn't read handwritten reports, never guesses a lost unit, shows every report for checking before it's saved, and an eye icon next to each result shows that exact line cropped from the original. Recognition scores 0.976–0.998 across three test sets.

## The paywall: from "creepy" to one screen, one action

My first note was "the paywall is creepy". Five versions in two days ended on a full-screen page that leads with privacy and shows the trial as two dates. In the free chat, an audit counted 14 elements and six routes into the paywall, including sample questions that were really traps. The agent proposed unlocking part of the chat; I kept it fully behind the paywall, because a partial unlock gives away part of Pro and removes the reason to buy. What's left is one card, three skills and one button.

[Image: Paywall, first version: a sheet with a feature list and a small grey price]
[Image: Paywall, final: full screen with a breathing glow, privacy first]
[Image: Free-tier chat before: 14 elements and six routes to the paywall]
[Image: Free-tier chat after: one card, three skills, one button]


## Grey, so that red means something

A health app should feel clean and calm, almost clinical. The interface is grey, normal values are the ink colour, never green, and only out-of-range results are red or yellow, always repeated in words. Against that calm, a red dot is impossible to miss.

## How I worked

I own what gets built, how it behaves and looks, and what isn't in it; AI agents in Claude Code did the research, audits, mockups and code. Over 100 decisions in ten days went into a log as "what / why / what we deliberately skip", so agents don't undo a decision.

## Where it is now

On TestFlight, in Ukrainian for now, aimed at Europe and the US. No user numbers yet; every number above was measured on test sets and benchmarks.
