Inspiration
A boarding kennel asked for my dog's vaccination record at 7am, before an early flight. I knew he had the shots. I could not prove it — the paper card was at home, a photo of it was buried under thousands of others, and the old clinic did not open for another two hours.
That is not a storage problem. It is an access problem, and it repeats every time a pet changes vet, groomer, kennel, or owner. The veterinary industry has no shared data standard — no equivalent of healthcare's HL7/FHIR — and most practice-management vendors keep their APIs closed or fee-gated. This will not be fixed from the clinic side.
But the record was never the point either. What an owner actually needs is a professional who can help — and a vet meeting an animal for the first time works from whatever the owner can recall in the room. Booking the appointment was never the hard part. Walking into it with nothing was.
So we inverted it. The owner already carries the data. Our job is to make it clinic-ready — and, in the long gaps between visits, to notice when something has stopped being a question and become a reason to go.
What it does
PetLover Health Passport is an AI-native health record for pets, live on the Apple App Store since 18 July 2026, currently on v1.2.0, public since 2 August 2026 (Android is in closed testing).
- Snap any vet document — Gemini reads it and writes a structured health event. No typing.
- Every saved event triggers Gemini again, in real time, to write a personalised insight back into the pet's record.
- Share a revocable, read-only passport by link or QR code. Any vet, groomer or kennel opens it in a plain browser with nothing installed on their side.
- Plus the daily machinery: reminders across multiple pets and caregivers, family households, weather-safety alerts, and nearby clinic / groomer / boarding discovery.
What it changes for the owner
An animal cannot describe its own history. Everything known about a pet's health exists only where its owner put it — which, for most households, means a paper booklet in a drawer, a photo somewhere in a camera roll, and a clinic that holds the rest and closes at six.
What that costs is not inconvenience. It is a booster that lapses because the due date lived in someone's memory. A vaccine given twice because the first one could not be proven. An emergency consult where the vet has to treat an unknown animal while the owner tries to recall a dosage under stress. The owner is not careless in any of these — they are being asked to be a records clerk for a patient who cannot speak, using a filing system nobody designed.
What changes is small and daily. You photograph a document instead of filing it. The record stays complete and current without anyone maintaining it, and it is one tap from being handed to whoever treats the animal next — a new vet, a groomer, a kennel at 7am, the person who adopts the pet years from now.
But the tidier archive is not what the owner is actually getting. What they get is a vet who can see the weight trend instead of asking about it, a kennel that says yes at 7am, and — through the long stretches between appointments — something watching the record that knows when three bad days in a row have stopped being three bad days.
We are deliberate about where that line sits, and the app says so in its own words: every insight the model writes is labelled "helpful guidance, not a diagnosis — talk to your vet about anything serious." The AI is not standing in for the professional. It decides when you need one, and makes sure you do not arrive empty-handed.
Who does what, every day: human vs AI
This is the part we care most about, because it is where "AI-native" either means something or does not.
The human does: takes a photo of a document, taps a one-tap daily check-in, marks a care task done.
Gemini does: decides what kind of record the document is; extracts dates, vaccine names, dosages, clinic; decides when the next dose falls due; then reads the pet's full history and standing health profile — breed, life stage, chronic conditions, allergies, body condition, diet, activity — and writes an insight tied to that profile.
Two of those are decisions the business acts on rather than shows, which is the distinction that matters here.
The next-due date is never typed by anyone. Gemini infers it from the paper, documentsApi.confirm() writes it to metadata.next_due, and app/(app)/scanner/results-multi.tsx schedules a real reminder from that value — so a date the model decided is what makes a phone ring months later. A ten-page booklet of already-expired doses produces no reminders at all, because the same pipeline decides which of them are history rather than schedule.
Gemini also decides what the owner sees first. Every insight carries a priority it assigns itself — 2 urgent, 1 worth attention, 0 positive — and the app orders the health card by it. That is triage: out of a year of records the model chooses what rises to the top of someone's attention, and it does so unreviewed.
And two of those decisions exist specifically to route people to a professional — written into the production prompt, not into marketing copy. supabase/functions/generate-insights/index.ts:239: three consecutive daily check-ins at 2/5 or below raises a priority-2 insight recommending a vet visit, citing the dates. And :218: no vet visit in the past 180 days raises a checkup_gap insight on its own, with nobody having asked.
That is the category in one behaviour. An ordinary owner is not expected to know that three mediocre days in a row is a pattern, or that six quiet months is itself a finding. The model knows, says so in this animal's own terms, and points at a professional — which is an everyday person receiving expert guidance they did not know to ask for. The product's incentive would be to keep people in the app; the code sends them to a vet.
Against the three things the rubric asks AI-native operations to do — create goods and services, serve customers, or drive revenue — we claim the middle one and do not stretch for the third. Nothing here prices, upsells, or intervenes on churn. What it does do is decide, unprompted and unreviewed, what a specific animal's record means today. The commercial link is honest but indirect, and stated as such below: the daily-observation loop is a paid capability, and the insight that arrives seconds after a free user's first scan is the moment the product proves itself.
None of it sits behind a chat button. generate-insights fires from a Postgres trigger on health_events: the moment a vaccine, weight or vet visit is saved, Gemini reads the pet's history and writes an insight back in roughly three seconds, verified end to end. A weekly cron sweeps anything missed. No app-side polling, no manual "generate" tap. The trigger is in the repository judges have access to — supabase/migrations/20260731000003_ai_insights_realtime_trigger.sql — so this is checkable rather than asserted.
A second loop shipped on 7 August: a one-tap daily check-in, where a poor score re-runs the same pipeline against the last 14 days of observations. The engineering that matters there is the restraint — it fires only when a score crosses into concern, so editing a note or correcting a mis-tap costs nothing.
How we built it
React Native / Expo (SDK 56) for iOS and Android from one codebase. Supabase for Postgres with row-level security, Deno Edge Functions and storage — all consumption-priced, so an idle month costs almost nothing. Gemini 2.5 Flash via Vertex AI (Google Cloud), in production since 4 August 2026, for extraction and insights. Google Maps Platform — Places API (New) for nearby discovery, proxied through an Edge Function so the key never ships inside the app binary. RevenueCat for subscriptions, with the app stores as merchant of record.
Challenges we ran into
A per-call API is an unbounded bill. Places API (New) costs roughly $32 per 1,000 calls past a free allowance. An unmonetised feature that gets more expensive the more people enjoy it is the wrong shape for a business whose entire fixed cost is $15.79 a month. So the ceiling went into our own code rather than a vendor console: a shared cache keyed on category plus location rounded to a ~1.1 km cell with a 7-day TTL (clinics do not move, and "nothing within 3 km" is a real answer worth not re-buying), and above it a hard 150-calls/day limit claimed atomically under a row lock so two simultaneous misses cannot both take the last slot. Past the cap the feature degrades to a free maps hand-off. Degrading beats billing.
Coarse vocabularies fail silently. Grooming was mapped to Google's pet_store type — which is retail — so a grooming search in Hanoi returned an aquarium and a turtle store. Boarding was mapped to a type that does not exist in Places API (New) at all, so Google rejected the request outright and the empty list read as "no boarding nearby". Nobody noticed, because a rejected request and a genuinely empty result look identical. We now surface the API's own error instead of flattening it to an empty array.
A row-level-security policy that was wider than it looked. An anonymous read policy on pets allowed access where passport_token IS NOT NULL — "this pet has a token", not "this pet has the token the caller presented". Any holder of the app's bundled anon key could have enumerated every pet that had ever enabled sharing, including microchip IDs and chronic conditions. We found it, confirmed nothing depended on it, and dropped it.
Business viability — the real numbers, disclosed in full
We would rather be checkable than impressive.
- 3 paid subscriptions since launch, $6.18 in Apple-reported proceeds (net of the store fee and Vietnamese foreign-supplier tax; iOS only, so $0 on Android is expected), zero paid acquisition.
- Retention is not yet testable, and we say so. The app went live 18 Jul 2026 with a 7-day free trial, so the first real charges landed around 25–30 Jul and the first renewals fall due around 25–30 Aug — after this submission deadline. Nobody has reached a renewal decision yet, so "zero churn" would be a hollow claim and we do not make it. The honest signal available today is auto-renew status, which a subscriber can switch off at any time without waiting for the renewal date. This also explains the August row below: revenue for August reads $0 because renewals have not come due, not because subscribers left.
- Retention is therefore argued structurally, not numerically. The record compounds: on day one the AI is reading a stranger; by month six it is reading breed, life stage, two chronic conditions, an allergy, body condition, diet, the weight trend and fourteen days of check-ins — because the owner put it there, one entry at a time. Any single feature here is a sprint's work to copy; eleven months of this specific animal is not. That points the value curve the right way: the product is weakest on the day someone could most easily leave, and strongest by the time leaving would cost them something. Earned by usefulness rather than lock-in — the record stays exportable and shareable throughout.
- Of those three, two are related-party — personal acquaintances — and are reported separately here rather than merged into a customer count. The third is arms-length: someone who arrived through a referral with no personal tie to the founder and paid. That single transaction is the one carrying evidentiary weight.
- The channel that produced them is instrumented, not anecdotal. Referral is a shipped product mechanism rather than a favour we asked for: every account is issued a code at creation (
referral_codes), a public claim page grants the new user Plus, and areferralsrow tracks each one throughsigned_up → subscribed → rewarded. Our arms-length customer arrived down that path. So "can you get the second customer the same way you got the first?" has a mechanical answer rather than a hopeful one — same code, same page, same reward, already running in production and already recording its own conversion rate. What we cannot yet claim is volume: the channel has produced one arms-length conversion, and we report the count rather than dress it up as a rate. - The 7-day trial is the qualifying step, and the cost base is what makes it a strategy rather than a giveaway. All three paying subscribers reached payment through it — nobody pays here until they have used the product for a week, so the revenue is product-qualified rather than impulse. The arithmetic is why we can afford that: $2.18 of usage-priced spend across three months works out to roughly $0.023 per user per month, so a full seven-day trial costs about half a cent to serve, against $4.24 a month in net proceeds from a Plus subscriber at US list pricing. That is deliberately conservative — most of the $2.18 was June development and testing, before any user existed. A business with real per-user costs could not give away a week. We can, which is why acquisition runs on the product rather than on a budget, and why $0 CAC is structural rather than temporary.
- What the trial has not yet proven, we do not claim. It is demonstrably good at turning a user into a payer. Whether it turns a payer into a long-term payer is untested, because no renewal has fallen due. We also currently show zero subscribers in trial, and the honest reading is the one above: the constraint is install volume, not willingness to pay. An empty funnel at this stage reflects how few people have found the app, not a mechanism that stopped working.
- At this sample size we deliberately do not quote a conversion rate. Three data points cannot support one. The defensible claim is narrower and truer: the product can be sold, and all three subscribers are still set to renew.
- Total Google Cloud spend from 1 June to 31 August 2026 is ₫54,583 — about $2.18 as the meter read on 8 August 2026 (Gemini API ₫53,810, Vertex AI ₫773; converted at 24,981 ₫/USD, the rate Apple applied to our July proceeds). Most of it is development and testing that predates real users: June alone is over half the total, before anyone had downloaded the app.
- As-of note. That figure is the meter reading on 8 August 2026. It keeps rising, because the service is running: by 12 August the same report reads ₫56,253 — about $2.25 (Gemini API ₫53,864, Vertex AI ₫2,389). We state both rather than silently restating one, so the billing evidence attached to this submission reconciles against the text instead of contradicting it. The uploaded evidence covers 1 May – 31 August, which spans the whole competition window; May is ₫0 because nothing existed yet.
- Why Vertex AI is the small line. Vertex carries only ₫2,389 of the total, and that is expected rather than a contradiction of the Vertex claim elsewhere in this submission: the same extraction and insight code ran against the Gemini API until 4 August 2026, when it was moved to Vertex AI. The Gemini API line is that history; the Vertex line is nine days of it. Both are Gemini 2.5 Flash, and both are visible in the same report.
The cost base is the argument, not the revenue. Recurring fixed cost is $15.79 a month — Apple Developer, Vercel, domain. Everything else is consumption-priced, and the two line items that could run away, Places and Gemini, are capped in our own code rather than in a vendor console. That puts break-even at four subscribers at US list pricing, or eleven at the Vietnamese regional pricing all three current subscribers actually pay — and we quote the second number too, because it is the one our real customers generate. Each additional subscriber past that carries roughly two cents a month in variable cost. The AI also runs where the revenue is: the daily-observation loop is a paid capability, while free users still get an insight the moment they upload a document, which is the moment that proves the AI works.
So the three things that have to hold for this to keep working are mechanical rather than hopeful. Margin holds because cost scales with usage and usage is nearly free. The reason to stay compounds on its own, because every entry the owner makes deepens the record the AI reads — the product is weakest on the day someone could most easily leave. And distribution is a product surface rather than a budget line: every passport handed to a vet, every household member invited, every referral code issued is an install path that costs nothing to run and does not stop when a campaign does. What none of this proves is volume — 32 accounts and three subscriptions cannot. That is the fair criticism of this submission, and it is the one thing the numbers here honestly cannot answer.
What's next
Shipped today: owners can already hand any vet a revocable read-only passport, no integration required.
Next is the Vet-Ready Brief — Gemini synthesising that same scattered timeline into a structured, clinic-ready summary instead of a raw record dump.
After that, the one that matters most: consent-gated ownership transfer. A change of owner is the moment a pet's history reliably dies — rehoming, private sale, shelter adoption, breeder to first owner, a household splitting, or an owner who dies and leaves the animal to family with no handoff at all. Whatever was built up to that point becomes a paper booklet in a drawer, and the history restarts at zero with the party who needs it most. It is also, for us, the worst churn event imaginable: the account holding the record has no reason to exist afterwards. Solving it inverts both at once — the record outlives the household, and whoever receives the pet has to create an account to accept it, inheriting years of history from their first day instead of starting from scratch. An acquisition the situation requires rather than one a referral bonus incentivises.
Then clinics — but as a channel, not a customer. Receiving a brief will be free to the practice, permanently; charging a clinic to read what its own client chose to send would rebuild the exact friction we exist to avoid. A client who arrives with a structured history hands the practice back consult minutes, which is why recommending PetLover is advice in the vet's own interest — the only kind of recommendation that lasts. No clinic-side revenue is projected anywhere in this submission, and the viability case above stands on consumer subscriptions alone.
To be explicit about what we do not do: nothing reaches a clinic that an owner did not send, every share is revocable, there is no view of "all PetLover users nearby", and we do not sell, license or aggregate health records to food, pharmaceutical or insurance buyers. No revenue line here would get larger if we did. The consent layer is the product, not a tax on it.
None of that asks a single clinic to integrate anything. The owner is the only party present at every visit, in every clinic, across the animal's whole life — which is why a continuous record can only live there. But the record is the means, not the end: what it buys is a professional who can actually help on the day — and, in between, something that notices when that day has come.
Google Cloud products used
- Vertex AI — Gemini 2.5 Flash for document extraction and real-time health insights. In production since 4 August 2026.
- Google Maps Platform (Places API New) — nearby veterinary, grooming and boarding discovery.
Built With
- android
- deno
- edge-functions
- expo-push
- expo.io
- gemini
- google-cloud
- google-maps-platform
- ios
- nativewind
- next.js
- places-api
- postgresql
- react-native
- react-query
- resend
- revenuecat
- row-level-security
- supabase
- typescript
- vertex-ai
Log in or sign up for Devpost to join the conversation.