Inspiration The brief names the exact moment: someone in front of the mirror, deciding whether a product is working. That question cannot be answered by one photo, and it is usually asked at the wrong time. Retinol, vitamin C and peptides take 8 to 12 weeks to show in their best-known trials, while most people decide within two or three. A brighter bathroom can also make skin look better without anything changing. So people abandon products that would have worked, keep paying for ones that don't, and mistake an early purge for failure or a reaction for a purge. We wanted to replace that guess with a fair experiment. What it does Verdict runs a measured trial on your own face and ends with a decision you can act on at the till.

  1. Pick the product. Search Open Beauty Facts, scan the barcode, or type it in. Verdict reads the ingredients, finds the actives, and sets a fair-verdict week for each target. The slowest active sets the deadline.
  2. Take two baseline photos, a minute apart. YouCam AI Skin Analysis measures both. Their difference is your personal noise floor: how much scores move when your skin has not changed.
  3. Check in weekly. Your first photo is overlaid on the camera so you line up the same way. Brightness, side light, colour temperature, glare and blur are measured live and compared with the first photo. Photos in very different light are refused.
  4. Get a verdict, with the evidence. Keep, stop, wait until a named date, likely purging, more data, or don't rebuy. A change is only reported when its 95% range clears your measured noise. Redness is measured every time as an irritation monitor, whatever the product claims. It also shows cost per week and per year, exports calendar reminders, and keeps everything on the device with export, import and erase. Live app: https://verdict-skye.onrender.com How we built it Verdict is one Next.js 16 app. The browser holds all personal data in IndexedDB; the server is a stateless proxy that holds the YouCam key and never stores a photo or a score.
  5. AI Skin Analysis v2, end to end on the server: register the file, presigned PUT, create the task with format: "json", poll until done, copy the masks, then delete the task from YouCam once results are safely on the device.
  6. HD and SD, chosen at baseline and locked for the trial, because the two models' scores are not comparable.
  7. raw_score only. YouCam documents ui_score as adjusted upwards to be encouraging. That is right for a one-off result and wrong for measuring change.
  8. Up to 8 concerns per call, including regional scores. Concern sets are padded to the edge of YouCam's billing tier so no paid capacity is wasted.
  9. Framing for the model. Every photo is cropped to 3:4 with a face guide that satisfies the API's 60% rule, so laptops and phones frame identically.
  10. Live error handling. The API returns engine errors as "('message', 'error_code')"; each is parsed into a plain instruction such as "Move closer".
  11. A pure TypeScript engine for noise, least-squares trend, pooled 95% intervals and verdict rules, with 175 unit tests, 42 browser tests, axe accessibility checks and a copy guard that fails CI on medical claims.
  12. An MCP endpoint that exposes the same engine as read-only tools, so an assistant can plan and judge a trial without spending units or seeing a photo. Stack: Next.js 16, React 19, strict TypeScript, IndexedDB, Zod, Vitest, Playwright. Deployed on Render behind Cloudflare. Challenges we ran into
  13. Making "don't rebuy" reachable honestly. An early version could never say a product failed: with few photos the interval was always too wide to prove no change. Pooling replicate noise with the scatter around the trend, and asking the one-sided question that matters for a purchase, fixed it without loosening the bar for "it's working".
  14. Light. Scores move with light. Measuring brightness, side light and colour temperature on every frame, then comparing them with the first photo, became a core feature rather than a tip.
  15. Purge versus reaction. Telling them apart needed domain rules: which actives speed up cell turnover, how long purging lasts, and why rising redness overrides everything.
  16. Fairness across skin tones. The first light checks blocked the two darkest Monk Skin Tones in perfect light. We changed the checks to judge the room, not the skin, and now all ten tones get the same answer, tested in unit and browser tests.
  17. Privacy without a database. Keeping the server stateless meant every save, retry and delete step had to be designed around the device, including deleting from YouCam only after a successful local save. Accomplishments that we're proud of
  18. A decision people can act on, with the reason and the numbers behind it, instead of a score they have to interpret.
  19. No accounts and no server-side storage of faces. Photos are deleted from YouCam as soon as results are saved locally.
  20. The full method is published in the app, including its limits, so anyone can challenge the thresholds.
  21. A finished trial can be judged from the command line or by an AI assistant through MCP, using the same rules as the UI.
  22. Accessibility and tone fairness are enforced by tests, not intentions. What we learned The API is most valuable as a measuring instrument used over time. One score is a curiosity. A series, with known noise, is evidence. We also learned that conservative statistics can still give a useful answer if you ask the right question, and that privacy is easier to keep when it is an architectural constraint from the first commit. What's next for VERDICT
  23. Split-face trials, putting the product on one side only, using the detection masks.
  24. YouCam Skin Tone Analysis as an independent light-matching check.
  25. Conversational check-ins through the MCP tools.
  26. Opt-in, anonymised "how often does this product earn a Keep" for retailers' product pages.
  27. Support for comparing two products in one trial, so a person can choose between them rather than only judge one.

Built With

  • css-modules
  • indexeddb
  • model-context-protocol
  • next.js
  • node.js
  • open-beauty-facts
  • playwright
  • react
  • typescript
  • vitest
  • youcam-api-(perfect-corp)
  • zod
Share this project:

Updates

Submission history