Inspiration

Skincare reviews tell you whether other people liked a product, not whether it works on your skin. And the changes a good product makes are usually too small to judge by eye: you look in the mirror, you think it might be helping, and you never really know. I wanted to replace that guesswork with measurement, and the YouCam Skin AI APIs made it possible to measure skin from an ordinary selfie.

What it does

Undertone turns YouCam's skin AI into a measuring tool and runs proper trials on your own skin.

  • Scan: a selfie goes through the YouCam Skin Analysis API, which scores eight areas (Hydration, Calmness, Clear skin, Oil balance, Smooth pores, Smoothness, Radiance, Bright eyes). Higher is always better, and your weakest areas come first.
  • Calibrate: AI scores move a few points between photos even when your skin hasn't changed. Undertone takes a few photos in one sitting and measures that natural variation, so later changes only count when they're bigger than it.
  • Products: products are ranked by how well their ingredients target your weakest scores. Possible irritants are flagged, reaction reports to the US FDA are shown, and the likely result is estimated from clinical studies. The YouCam Skin Simulation API shows that estimate on your own face.
  • Trial: you take a few "before" photos, then one selfie every few days while using the product. The first week is ignored while the product settles in. After that you get an honest verdict: improving, worsening, no clear effect or inconclusive. Skin Simulation can show the measured change on your "before" photo.
  • Shades: the YouCam Skin Tone API reads your skin's depth and undertone, Undertone finds the closest matching foundation shades, and the YouCam Makeup VTO API lets you try them on before buying.

How we built it

  • Backend: Python and FastAPI. All YouCam calls happen on the server, so the API key never reaches the browser. Faces are detected and cropped with OpenCV and Pillow before upload, and results and photos are stored in SQLite.
  • Statistics: NumPy and SciPy. Calibration gives each score a minimal detectable change from repeated same-sitting captures:

$$\text{MDC}{95} = 1.96 \cdot \sqrt{2} \cdot SD{\text{error}}$$

The trial verdict compares the post-settling period with the baseline, using that measurement noise and a conservative prior. It only reports improving or worsening when the change is both statistically convincing and at least 2 points.

  • Frontend: Next.js 15, React 19, TypeScript and Tailwind CSS, designed mobile-first, since every capture is a phone selfie.
  • Testing: pytest for the backend and Playwright browser tests on phone and desktop sizes. The tests use a fake YouCam key and fail if a real (paid) call slips through.
  • Hosting: the frontend runs on Vercel, and the backend runs on Railway with a persistent volume. Vercel forwards /api/* to Railway.

Challenges we ran into

  • Noise vs. change: a raw AI score can't tell you whether a product works when the score moves a few points on its own. Calibration and a verdict that is willing to say "no clear effect" were the core design work.
  • A limited unit budget: every scan, try-on and simulation costs YouCam units. I added a unit budget guard with a reserve and a permanent result cache, so the same photo is never paid for twice. The cache matters because YouCam deletes results after 24 hours.
  • Scores that read backwards: a score of "Acne 86" sounded like a lot of acne, when it actually meant clear skin. I renamed every score after the healthy quality it measures.
  • Testing without spending units: the whole test suite runs against a seeded backend with faked YouCam responses.

Accomplishments that we're proud of

  • A verdict that is honest. It says "no clear effect" or "too early" instead of inventing a result.
  • Four YouCam APIs working together in a single flow, from diagnosis to a product to proof.
  • Every bug found after release became a regression test before it was fixed.

What we learned

  • An AI score only becomes useful once you know how much it moves on its own.
  • Products take time to work, so a trial has to wait for the settling period before judging.
  • Wording matters as much as accuracy: how a score is labelled changes how people read it.

What's next for Undertone

  • Community results: combine anonymous trial results from many users, so every product shows how it actually changed real people's skin, not just star ratings.
  • Retailer widget: let shops show those measured results on their product pages, next to YouCam's virtual try-on.

Built With

Share this project:

Updates

Submission history