The problem
When skin reacts to a new product, people usually know which product, almost never which ingredient. A serum lists 20 to 40 ingredients, so the irritant ends up in the next product they buy. Dermatologists solve this by comparing what a patient reacted to with what they tolerate, then confirming with a patch test. Nobody does that reasoning at home, and nobody has objective daily measurements to do it with.
Market
- A large, underserved audience. In a meta-analysis of self-reported data, about 71% of adults describe some degree of sensitive skin and about 40% moderately or very sensitive skin (Chen et al., JEADV, 2020).
- A big spending category. The global skincare market is estimated at $122 to 200 billion in 2025, depending on scope (Fortune Business Insights; The Business Research Company).
- A known cause, hidden in plain sight. Fragrance mixes and preservatives such as methylisothiazolinone are consistently among the most frequent cosmetic allergens in patch-test clinics. About 1 to 3% of Europeans are allergic to fragrance ingredients (SCCS, 2012).
- Regulation is pushing transparency. The EU is extending the fragrance allergens that labels must name from 26 to 80 (Regulation (EU) 2023/1545). The data is on the label; nobody connects it to their own skin.
- The gap. Ingredient scanner apps rate products in general. Culprit is personal: it learns which ingredient affects you, from measured skin changes.
What it does
- Daily check-in. One selfie, quality-checked on the device (format, resolution, light, framing), then measured by the YouCam AI Skin Analysis API: redness, acne, texture, pores, oiliness, moisture.
- Products as experiments. Each product is added by barcode (ingredients from Open Beauty Facts) or by pasting the label, with the date it was started.
- Reaction detection. Culprit builds a composite irritation index from the YouCam scores and compares each product's before and after windows against the user's own baseline. The threshold adapts to each person's normal day-to-day variation, so one bad photo cannot convict a product, and overlapping product starts are flagged instead of guessed.
- The deduction. Ingredients shared by products that caused a reaction become suspects; any ingredient the user tolerates in another product is cleared, except irritants whose effect depends on concentration. Suspects are grouped into known families (fragrance allergens, isothiazolinones, acids, retinoids).
- Evidence you can see. A timeline with each product's test window, before/after comparison, and a day-by-day photo diary.
- In the store. Shop check compares any label with the user's suspects (avoid, caution, looks safe), and every check is pinned on a personal store map.
- For the dermatologist. A printable case report to guide the patch test.
Architecture
- YouCam integration (Skin Analysis API, V2): register the file, upload it to the signed URL, start an asynchronous skin-analysis task, poll until it succeeds, and store the per-concern scores. Error codes (face too small or out of frame, low light, image size) are mapped to clear user messages, and photos are pre-checked locally so units are not wasted.
- Backend: Python, FastAPI, SQLite, httpx. The analysis engine is independent of the API layer and unit-tested; a mock YouCam server checks that every request matches the documented contract.
- Frontend: responsive web app (vanilla JavaScript, Chart.js, Leaflet with OpenStreetMap).
- Privacy: data stays in the user's own database; only the selfie is sent for analysis.
- Packaging: Docker and Docker Compose. A clearly labelled demo mode with simulated history lets anyone explore the app without a key.
Challenges
- Signal versus noise. Skin varies daily with light, sleep and season. Fixed thresholds produced false reactions, so detection is calibrated on each person's own variability.
- Confounding. Products started together cannot be separated; the app says so and recommends spacing them.
- Dose matters. Some irritants are tolerated at low concentration and not at high, so they are never cleared by a single tolerated product.
- Honest demo. A real reaction takes weeks to observe, so the six-week history in the demo is simulated and labelled as such, while the live check-in is a real YouCam call.
Accomplishments
- An end-to-end loop from a selfie to a named ingredient, with reasoning a dermatologist can follow and verify.
- Real YouCam measurements inside the app in seconds, with robust handling of bad photos.
- A consumer feature (Shop check) that turns skin data into a buying decision at the shelf.
What I learned
- Designing around an asynchronous AI API and its unit costs.
- How contact dermatitis is investigated in practice, and why clearing ingredients through tolerated products matters as much as detecting the reaction.
What's next
- Mobile app with reminders, for consistent daily photos.
- Retail integration: Shop check as an in-store or e-commerce widget recommending suspect-free alternatives, reducing returns for sensitive-skin shoppers.
- Cosmetic tolerance studies: objective daily skin scores for brands running user trials, instead of questionnaires.
- Clinical export: a report format dermatologists can import before patch testing.
Try it
Code and run instructions (Python or Docker): https://github.com/gaiaflaviamezaib/culprit. Without a key the app runs in demo mode; with a YouCam API key it uses the real Skin Analysis API.
Culprit finds patterns in your own data. It is not a medical diagnosis; a dermatologist patch test confirms an allergy.
Built With
- chart.js
- docker
- fastapi
- httpx
- javascript
- leaflet.js
- open-beauty-facts
- openstreetmap
- python
- sqlite
- youcam-api

Log in or sign up for Devpost to join the conversation.