Case study

Plant Doctor: a vision-model MVP that returns answers in 2 seconds

How a consumer plant-health app went from idea to a deployed mobile-first React MVP — with a tuned vision model returning species, diagnosis and treatment plans in under two seconds.

Plant Doctor mobile app — case study cover
Client
Indie consumer founder
Industry
Consumer / horticulture
Timeline
5 weeks, solo
Stack
React, TypeScript, Vision model API
<2s
End-to-end response time
5 wks
First photo to App Store-ready
1 photo
Entire onboarding flow

The problem

The founder had a clear thesis: plant owners don't want a forum or a search engine. They want to point their phone at a sad-looking houseplant and get a real answer in seconds. Existing apps either bury the answer behind a paywall, require a 12-photo onboarding, or rely on generic LLMs that confidently misidentify a pothos as a philodendron. We had five weeks and a small budget to prove the experience could feel native — fast enough that users would actually open it the next time their fiddle leaf dropped a leaf.

The scope

One screen on launch: a camera button. One result screen: species, health score, diagnosis, treatment plan. No accounts in v1 — anonymous use, optional save via email magic link. The risky bet was the model. We didn't have the data or budget to train from scratch, so the plan was: prompt a strong general vision model with curated few-shot examples per common house plant family, layered with a domain-specific diagnosis prompt. If accuracy on a hand-labelled test set hit 80%+, we'd ship. If not, we'd pivot to a narrower 'is your plant overwatered' tool.

How it was built

React + TypeScript mobile-first PWA. The camera flow uses the native file input with `capture="environment"` — works on every phone, no app store review, installable from Safari. The vision pipeline runs on edge functions: image upload → resize and compress → vision model call with structured-output schema → diagnosis prompt → response. The structured-output schema is the key — it forces the model to return JSON the UI can render, instead of prose the UI has to parse. We cached recent results in Postgres so repeat photos of the same plant return instantly and don't burn API budget. Total cold-start response time landed under two seconds on 4G.

The outcome

Shipped at the end of week five. The founder ran a soft launch to 200 beta users from r/houseplants — feedback was strong enough on accuracy and speed that they raised a small angel round on the back of the demo. The model hit 84% top-1 species accuracy on the test set and 91% on the top-3, comfortably above the 'ship it' bar. Diagnosis accuracy is harder to measure objectively, but qualitative feedback was overwhelmingly that the answers felt grounded — not the usual generic 'water less and check the light' from generic chatbots.

What I'd do differently

We spent week two building an account system 'in case we needed it.' We didn't. Users happily used the app anonymously, and we ripped half of it out in week four to simplify the UI. Lesson: in a consumer MVP, auth is the easiest feature to defer and the most expensive to build speculatively. Ship anonymous, add accounts only when you have a reason — a save action, a paid tier, anything but 'we'll probably need it eventually.'