Inspiration
A food label tells you what is in a product. It does not tell you if that product is right for you. Scanner apps like Yuka give one score to everybody. But a person who avoids seed oils, a person with high blood pressure and a person who wants more protein should not get the same number for the same yogurt.
We also saw a second problem. Many small, emerging food brands make better products, but shoppers do not find them. The large brands own the shelf space.
So we wanted a scanner that people can trust. It must be personal (the score changes with your goals), transparent (every point has a rule and a source) and useful (it shows you a better product when one exists).
What it does
Pantree scans the barcode of a packaged food. In approximately two seconds, it shows:
- A personalized health score from 0 to 100.
- A "Why this score" sheet. Each factor shows its points and a source (FDA, EFSA, WHO, the Dietary Guidelines, AHA).
- Ingredient flags for additives and for ingredients that you said you avoid.
- Better-scoring swaps, if a product that fits you exists.
You can also save favorites, make a want-to-try list and look at products that you scanned before. You do not need an account, and there are no ads. The first 10 products are free. Pantree Pro gives unlimited scans ($4.99/month or $29.99/year).
How we built it
Pantree is a native SwiftUI app for iOS.
- Scanning: VisionKit reads barcodes live. If a product is not in the database, the user can scan the Nutrition Facts and ingredients panels. On-device Vision OCR reads the values, and the user checks them before we use them.
- Product data: Open Food Facts, plus a local catalog that updates between App Store releases.
Scoring: a deterministic engine that uses rules only. There is no LLM and no network call, so the result is instant and the same every time. Each goal changes the weights of the formula so each user gets their own custom score.
Monetization with RevenueCat: the paywall comes at the end of onboarding and is built with RevenueCatUI. A metered gate starts after 10 distinct products, and the products that you already opened s*Pro entitlement* to unlock unlimited scans and CustomerCenter for subscription management. Restore works quietly aat let us change plans and paywalls from the dashboard with no new build. When we removed the lifetime plan, we did not have
Privacy: no account and no ads. Analytics stay off until the user opts in.
Challenges we ran into
1. Missing data is not neutral. The score starts at 65, and the penalties subtract points. So if a label does not show sugar or sodium, the product gets a higher score. First, we put a limit on scores that had thin evidence. But most records do not show at least one of sodium, saturatefat or added sugar, so most users saw a weak score with a war. Now the app shows the plain score, and it quietly logsrecords with missing data so that we can fill them.
2. Swaps need data that does not exist yet. At the start, only 2 of 215 rows in our brand catalog had nutrition data. The swap feature is only as good as its catalog, so we built the label-scan recovery flow and a pipeline to fill that data.
3. A trustworthy score and a paywall. We did not want the paywall to feel like a trap. We changed the onboarding so that it shows value first: you see a real scan and a real swap before the app asks for anything. The free plan also shows the number of products that you have left, not a vague limit.
4. App Store setup. The order of the steps is very important. The Paid Applications agreement blocks the in-app purchases, and the in-app purchases block RevenueCat. We wrote a runbook so that we do not make the same mistakes again.
Accomplishments that we're proud of
- From first commit to App Store submission in a few weeks with approximately 100 commits and more than 30,000 lines of Swift.
- Every point in the score has a source. Users can open any score and see where each number comes from.
- Proprietary Taste Score. Users can see how a product will taste based on product info before they buy it.
- A swap guardrail that money cannot break. A brand can never put a product that scores lower in front of a user.
- A scanner test suite. It checks a 20-product corpus against live Open Food Facts. It fails if fewer than 85% of scans give usable data, or if the median time is more than 2 seconds.
- Accessibility from the start: Dynamic Type, VoiceOver score labels, verdicts that are safe for color-blind users, Reduce Motion support and dark mode.
What we learned
- A clear, simple score is better than a "smart" score. Users trust what they can check.
- In a food app, the data is the product. The code was the easy part.
- It is better to earn the ask before you make it. This is true for payments and for permissions.
- With RevenueCat, the paywall is something you can test and change quickly. It is not a fixed wall.
What's next for Pantree
- More verified nutrition data for emerging brands, so that more scans can show a swap.
- Brand Connect: an opt-in, direct line between shoppers ands that they find.
- An Android version.
Log in or sign up for Devpost to join the conversation.