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

  1. 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.
  2. 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.
  3. 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.
  4. 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).
  5. Evidence you can see. A timeline with each product's test window, before/after comparison, and a day-by-day photo diary.
  6. 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.
  7. 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

Share this project:

Updates

Submission history