Inspiration
Consumer research consistently shows that food-label awareness is high, but functional use is low. Many people notice nutrition labels, yet far fewer use them meaningfully when making a purchase decision. The gap is not motivation. It is access to understanding.
LabelWise started from my health psychology research project on food-label literacy, consumer behaviour, and packaged-food decision-making. The research examined why labels are difficult to use in real life: technical ingredient names, additive codes, health-halo claims, time pressure, and the cognitive load of interpreting dense nutrition information.
At its heart, LabelWise is built on the belief that understanding food should not require technical expertise; everyone deserves the clarity to decide what they want to put into their body.
I applied the COM-B model of behaviour change (Capability, Opportunity, and Motivation) to identify a clear design opportunity: a tool that reads the actual text on the label, not just a barcode database, and translates it into plain-language guidance matched to what the user already cares about.
LabelWise is that intervention.
What It Does
LabelWise reads the ingredients and nutrition panel from packaged food through camera upload, photo upload, or manual entry, then turns that label into a structured, personalized explanation.
It provides:
- Ingredient analysis matched to saved allergies, sensitivities, diet preferences, and custom avoids
- Dietary compatibility for vegan, vegetarian, keto-style, gluten-free, dairy-free, and nut-free preferences using transparent rules, not AI guesswork
- Nutrition context per serving compared with user-defined daily preferences
- Plain-language AI summaries using Gemini, grounded in the rule-based findings
- Saved scans, folders, and reflections to revisit and compare products over time
LabelWise is intentionally not a calorie tracker, dieting app, barcode-only scanner, or medical tool. Its goal is food-label literacy. The language avoids shame and uses calm prompts such as Good to know, Worth reviewing, and Matched your saved preference.
How I Built It
The architecture is facts-first by design.
A curated local rule engine handles ingredient concern detection, additive and INS-code mapping, and dietary compatibility classification. These rules run in the browser, so the core analysis does not depend on a product database or a language model.
OCR is handled by Tesseract.js in the browser, with an optional AWS Textract path for denser label text. Because OCR can be imperfect, users can review and correct extracted text or enter ingredients manually before analysis.
Gemini (gemini-2.5-flash-lite) sits on top of the rule engine as an explanation layer. It receives structured analysis results and turns them into a personalized plain-language summary. AI helps explain the findings, but it does not decide compatibility labels. If no API key is configured, the app falls back to template-based explanations.
Supabase handles authentication and cloud persistence with Row Level Security. The app is deployed on Vercel and connects to a hosted Supabase project, so judges can try it live without any setup. The frontend is built with React 18, TypeScript, Vite, Tailwind CSS, and shadcn/ui.
Challenges
OCR on real food labels is difficult. Ingredient lists are dense, small, curved, reflective, and inconsistently printed. Tesseract accuracy varies with lighting, cropping, and image quality, so manual correction and full manual-entry fallback became essential features.
Keeping the system facts-first required discipline. I wanted AI assistance without AI hallucination. That meant designing the app so dietary compatibility, ingredient flags, and nutrition context come from transparent rules, while Gemini only explains the structured findings in plain language.
Designing without shame was harder than it sounds. Many food apps focus heavily on calories, restriction, or "good versus bad" food. LabelWise needed a different tone: educational, calm, non-judgmental, and supportive of user agency.
Supabase session handling created a subtle local development issue. The Supabase JS client's getSession() call stalled inside the browser's Navigator LockManager before any database request reached the network. The fix required a dual-client architecture: one standard client for authentication and a separate data client that reads the stored access token directly from localStorage, bypassing the stalled session path.
What I Learned
The biggest lesson was that behaviour-change design is not just a UX layer. It shapes the entire product.
Using the COM-B framework helped me think beyond simply "showing more information." For food labels to become useful, information must be understandable, available at the moment of decision, and personally relevant enough to act on.
I also learned that responsible AI can be more powerful when it is constrained. In LabelWise, AI is not used to guess whether something is safe or compatible. Instead, it makes structured, rule-based findings easier to understand. That separation made the product safer, clearer, and more trustworthy.
LabelWise does not tell people what to eat. It helps people understand the label in front of them, based on what they already care about.
Built With
- aws-textract
- google-gemini-api
- lucide-react
- postgresql
- react-18
- shadcn/ui
- supabase
- tailwind-css
- tanstack-react-query
- tesseract.js
- testing-library
- typescript
- vite
- vitest
Log in or sign up for Devpost to join the conversation.