Inspiration

Virtual try-on answers "do I like how this looks?" It doesn't answer the question people actually shop with: "will this cover my dark circles or my redness?" We wanted a try-on that can back its claim. We also noticed that YouCam ships both a try-on API and a skin analyzer. If you analyze the try-on result, you can measure it instead of just looking at it.

What it does

You upload or take a selfie and rank what matters most to you. Proof Beauty then plans several makeup looks, renders each one with YouCam's makeup try-on, and re-analyzes every render with YouCam's skin analysis. Each look is scored on how much it reduced your measured concerns, not on how it looks.

You get a before/after slider on the winning look, per-concern changes with a confidence label (clear, likely, or within noise), a plain-language explanation written from the numbers, and a shopping list with the shade to buy. A product only gets the "verified at render shade" badge if a concern it targets measurably improved.

Every run also renders a deliberately bad "control" look, a whole-face foundation a few shades too light. A naive score rises for it because the whole face got brighter, not because the dark circles were treated. We show whether the score would have been fooled. A final Stage 2 step lets you apply the look for real and compares the measured result with the prediction.

How we built it

  • YouCam APIs: skin analysis (baseline, and a re-check of every render), makeup try-on (the renders), and optional skin-tone analysis for lighting-corrected shopping shades.
  • Scoring engine: a small deterministic module with unit tests. A look only counts as proven if it improves a concern beyond measured test-retest noise and keeps the skin shade within a small colour difference of your own.
  • App: Next.js (App Router) and React, with Framer Motion and Tailwind. A run streams live as NDJSON, so you watch each render and its re-analysis arrive. An on-device face detector (MediaPipe) checks the shot before anything is uploaded.
  • Deployment: Vercel, with private Blob storage for photos and Redis for the credit ledger and a per-IP rate limit. Photos are deleted after an hour or on one tap.
  • Fallback: when the real YouCam credit pool runs out, the app switches to a clearly labelled simulated engine instead of failing.

Challenges we ran into

  • Credits cost more than we assumed. We first assumed one credit per task and burned through the free pool. We then matched our runs against YouCam's usage export: skin analysis is about 10 credits, tone analysis 20, and a render 1. A run is about 54 credits, and the tone API is now opt-in.
  • Scores can be gamed. Brightening the whole face raised the dark-circle score by 8 raw points at a clearly visible shade shift, versus 3 to 4 for the best honest concealer. That is why the control look and the shade-drift check exist.
  • Noise. Re-analysing near-identical photos moved scores by 0.5 to 2.4 points. Without noise bands we would have reported changes that were just wobble.
  • YouCam specifics. Different makeup categories take different payloads, there is no powder category, and skin analysis rejects faces that are small in the frame. We calibrated these against the real API.
  • Going serverless. The 4.5 MB request limit, no persistent disk, and shared state across instances meant moving to Blob and Redis and shrinking uploads in the browser.

Accomplishments that we're proud of

  • The closed loop works end to end on the real YouCam APIs, and the control look catches a score-gaming shortcut on real photos.
  • The app reports honest numbers. Where the renderer can only do a little (a concealer moved dark circles by about 5% of severity), we say so instead of tuning until it looks impressive.
  • Credit costs were validated: the app's counter read 870 and YouCam's console read 871 after a run.
  • The scoring and integrity logic has unit tests, the deployment is rate-limited, and it degrades to a labelled demo instead of failing.

What we learned

  • Measuring beats looking, but only if you also measure how the measurement can be fooled.
  • A try-on that scores itself needs a reference point to show what a shortcut would have scored.
  • The raw score responded to a visible makeup change about three times more than the display score did, at similar noise, so which field you read matters.
  • Cost and noise are product constraints, not footnotes.

What's next for Proof Beauty

  • Skin tones: test across a wide range of skin tones. Verification may be less reliable on deeper tones, and we warn about that but have not tested it yet.
  • Real-world calibration: collect Stage 2 results to see how closely real results track the simulated predictions.
  • Retail integration: tie the shade and product guidance to a retailer's real catalogue and shade ranges, and measure whether it reduces wrong-shade purchases. That is the goal, but we haven't measured it.
  • Minimum effective dose: show the lightest amount of product that still gives most of the effect.
  • More looks: add variants only once their YouCam patterns are verified.

Built With

  • framer-motion
  • mediapipe
  • next.js
  • react
  • sharp
  • tailwindcss
  • typescript
  • upstash-redis
  • vercel
  • vercel-blob
  • youcam-api
Share this project:

Updates

Submission history