Inspiration
Women all across the globe use tampons or pads during their periods, trusting they’re safe because they’re sold everywhere. A study at UC Berkeley found detectable levels of lead, arsenic, cadmium, mercury, and nickel in tampons from 14 major brands, with lead levels particularly concerning. Popular pad brands like Always have raised concerns through user reports and independent testing, with organizations such as Women’s Voices for the Earth identifying chemicals, including styrene and fragrances, associated with irritation, endocrine disruption, and potential reproductive harm.
Women are also pressured into using unnecessary and often harmful vaginal products through marketing that promotes unrealistic, misogynistic, and hygiene-based insecurities. While the vagina is self-cleaning, a multi-billion dollar industry has created a culture where natural bodily functions are framed as "dirty" or "inadequate," pushing products like douches, washes, and wipes that can disrupt the natural, healthy microbiome.
What it does
A Closer Look enables users to scan menstrual products and over-the-counter feminine health products to assess their safety. Each product is scored using a clear safety meter based on its ingredients and known health risks. Users can create a personalized health profile that includes skin type, sensitivities, medical conditions, and product preferences. When an item is scanned, the app generates an LLM-powered summary explaining what’s in the product, how it may affect the user, and whether it’s safe based on their profile. If a product is flagged as unsafe, A Closer Look recommends safer alternatives that align with the user’s needs and budget.
How we built it
For the frontend, we designed the UI in Figma and used Figma Make to jumpstart the conversion to React. The app is built with TypeScript and Vite for speed and stability. For the scanner, we used HTML5-qrcode to handle barcode processing directly in the mobile browser.
Backend & AI The backend is a FastAPI server that runs our ingredient analysis logic. We integrated LangChain and OpenAI to handle the risk assessments, using vector embeddings to match ingredients against our database of harmful chemicals based on their meaning rather than just keywords.
For the database, we use Supabase for our database and authentication. It stores user profiles, health data, and our ingredient library. The app personalizes every scan by checking the product’s ingredients against the user’s specific allergies and health conditions in real-time.
Challenges we ran into
Barcode scanning accuracy was a problem we were constantly running into. Ensuring reliable operation of the camera-based barcode scanner across different devices and lighting conditions required fine-tuning the scanning parameters.
Accomplishments that we're proud of
We are proud to have built a complete scanning experience, from opening the camera to seeing personalized health recommendations in under 3 seconds. We are also proud to have implemented semantic ingredient matching using vector embeddings.
We are also proud to have chosen to focus on an understudied and often overlooked area of health that affects both women and men, yet remains largely misunderstood.
What we learned
How to implement real-time barcode scanning in a web application Working with vector embeddings and semantic search for ingredient matching Integrating Supabase for authentication, database storage, and row-level security
What's next for A Closer Look
Rating & Review System: We propose adding a community-driven feature that lets women rate and review products they've used. This would give other users real perspectives on product experiences, both positive and negative, helping them make more informed purchasing decisions. Product Database Expansion: Partner with retailers and brands to expand our ingredient database to cover more feminine care products.
Built With
- fastapi
- langchain
- openai
- pillow
- pydantic
- python
- sentry
- supabase
- typescript
- uvincorn
Log in or sign up for Devpost to join the conversation.