Inspiration

We built ALRI to help adults understand laboratory results and other health information in clear, everyday language. Users can upload a lab report, read AI-assisted explanations of its results, and ask follow-up questions about medical terms and reported values. They can review recent scans, explore AI-assisted skin insights with safety guidance, and find nearby care when professional support is needed.

ALRI uses RevenueCat to offer in-app credit packs for features including full lab-scan access, follow-up chat, and skin analysis. New accounts receive 50 free credits to try the app before buying more. Our Android app is published on Google Play Store.

ALRI provides educational information, not a medical diagnosis or treatment. AI-generated information may be incomplete or inaccurate. Users should consult a qualified healthcare professional before making health decisions.

What it does

  • Scan any lab report printout or PDF. A vision model extracts every marker, value, unit and reference range.
  • Explain each marker in plain English, for someone with no medical training.
  • Track markers grouped canonically across labs, so the same test named three ways still lands on one chart.
  • Query the results through an LLM chat interface within the context of your report, not generic health advice.
  • Perform skin analysis and search for nearby labs and clinics, to perform the next step: an appointment with a health provider.

How we built it

Flutter on Android, a FastAPI backend, a Next.js web app, and OpenRouter routing each feature to its own model, extraction is a vision problem, interpretation is a reasoning problem, support chat is a latency problem.

Credits, not tiers powered by RevenueCat

A lab report costs what it costs to process; a chat message costs far less. A subscription tier that bundles them is a worse deal for light users and a worse business for heavy ones. So Alri runs on credits one unit, priced in USD, spent per action: $$1\ \text{credit} = \$0.10 \qquad \text{scan} = 10 \qquad \text{chat} = 5 \qquad \text{skin analysis} = 15$$

The hard part isn't the spending it's that the balance must be the same balance whether it was bought on iOS, Android or the web. That's exactly what RevenueCat Virtual Currency solves. We defined a currency, associated every pack across all three storefronts with the amount it grants, and made RevenueCat the source of truth:

app  →  RevenueCat paywall  →  SDK purchase  →  RevenueCat grants credits
                                                      ↓
                                   webhook  →  our backend mirrors the balance

One ledger, three storefronts, zero receipt-validation code written by us.

We also shipped RevenueCat Ads: out of credits, you can watch a rewarded ad to unlock a chat message instead of paying. A better free tier than a feature lock the user still gets what they came for, and the app still earns.

Challenges we ran into

Failing honestly. When the AI pipeline errored, our API returned the raw exception which could echo back fragments of the user's own report. We rewrote every failure path to return a typed code and a human sentence. One distinction mattered most, and our mobile developer asked for it by name: "you're out of credits" and "we couldn't read this" are different problems with different fixes, and the app must never confuse them. Running out now returns a 402 the paywall can pre-fill from:

{
  "error_code": "insufficient_credits",
  "message": "You need 10 credits for this and have 4. Top up to continue.",
  "required_credits": 10,
  "balance_credits": 4
}

No account until the email is proved. We originally created the user at signup and verified later — so abandoned signups left real accounts behind, and an address could be squatted by someone who didn't own it. Signup now lives in a pending record with hashed codes, a short TTL and a hard attempt cap. The account is created at the moment the code is confirmed, not before.

What we learned

That monetization is where a cross-platform product usually breaks, and treating it as infrastructure one currency, one source of truth, one webhook, turns "buy on your phone, spend anywhere" into a two-day feature instead of a two-month one.

And that in health, the interface is the product. The model is the easy part. Deciding what to say when a marker is slightly high without alarming someone, without pretending to be their doctor took more iterations than any code in the repo.

What's next for ALRI

iOS, multi-language interpretation, shareable summaries you can hand to a clinician, and lab integrations so results arrive without a photo; list of pharmacies / drug stores with current availability of the medicines prescribed by a doctor / physician; vademecum integration to understand which products and active ingredients are recommended in cases similar to yours, so you know what to expect from the doctor's appointment and prepare your budget to acquire these items accordingly.

Built With

Share this project:

Updates

Submission history