Beauty Match
An AI skincare-matching platform with an explainable engine — every recommendation shows its reasoning, never a bare percentage.

The problem
Beauty recommendation quizzes are black boxes — you answer five questions and get a product with no idea why. I wanted one where the match is transparent enough to argue with.
What I built
A discovery platform with two quiz modes — a conversational AI quiz (Claude, via the Vercel AI SDK) that adapts to your answers, and a fast static one that needs no AI credits. Both feed a scoring engine that grades skin fit, concern coverage, ingredient compatibility and budget, and shows the reasons and caveats behind every score. Plus a filterable catalogue across mass, clinical, K-beauty and Indian brands, an ingredient explorer, and an AM/PM routine builder that flags conflicting actives.
What I learned
That the interesting design problem in an “AI product” is often the non-AI part — here, a scoring model you can inspect line by line, with the LLM only doing the conversational front end.
Overview
A beauty-tech discovery platform: “skincare matched to your skin, not the other way around”. A conversational AI quiz and a static quiz both feed one transparent matching engine over a structured product catalogue.
Features
Two quiz modes
An adaptive conversational quiz (Claude) and a fast static flow with no AI cost.
Explainable matching
Scores across skin fit, concern coverage, ingredient compatibility and budget — each shown with its reasons and caveats, never a bare percentage.
Catalogue
Eight categories with ingredient- and concern-based filtering, spanning mass, clinical, K-beauty and Indian brands.
Routine builder
Slot matches into AM/PM and get warned about incompatible active ingredients before you buy.
Ingredient explorer & shelf
Side-by-side compare, plus a localStorage “Beauty Shelf” for saved products and routines.
How it's put together
- 01Drizzle ORM over libSQL (SQLite) locally — no native compilation, works on any OS — designed to swap to Postgres / Turso for production.
- 02The matching model lives in lib/match/engine.ts as a pure scoring function; the LLM only powers the conversational quiz.
- 03Next.js 16 with the proxy.ts convention; a centralised Framer Motion variant system.
- 04Seed data is explicitly labelled dataSource: "seed" — 28 brands, 54 products, not real verified listings.
Challenges
Keeping the AI honest
The scoring is deterministic and inspectable; the model never invents a match, it only conducts the interview.
Ingredient conflict logic
Encoding which actives shouldn’t share a routine, and surfacing it at the right moment.
Where it landed
A deployed platform where every recommendation is traceable to a reason — the transparency is the product.
Screens

Want something like this?
Get in touch →