Inspiration

People get generic outfit advice before moments that actually matter — an investor pitch, an interview, a first date. Existing beauty apps ask “what looks nice?” We wanted a product that asks “how should you arrive?” and can show its work. PerfectCorp’s YouCam APIs already see skin and can render clothes on a real body. What was missing was a decision layer: goals as trait targets, skin as a real input, and an explanation a skeptical user (or a judge) can audit.

What it does

MirrorMind turns an occasion into an appearance plan:

  1. Pick a goal (investor meeting, interview, first date, wedding, conference, vacation).
  2. Capture two photos — face for skin analysis, upper body for clothes try-on.
  3. YouCam Skin + Skin Tone become a SkinProfile. The local engine adjusts the goal (fatigue raises energy, undertone biases color, redness/oiliness become grooming actions).
  4. It ranks a wardrobe catalog on five traits (authority, warmth, energy, approachability, formality) and explains why this won / why others lost.
  5. YouCam cloth-v3 renders the top looks on the body photo. Failures are labeled as look references, not fake success.
  6. Feedback (too formal, different colors, …) re-ranks without re-running skin.
  7. Finish the look (on tap): goal-mapped hair-color presets, look-vto makeup templates, and a custom garment the user uploads.

Skin must change the answer. Same goal + different skin → different top look.

How we built it

@mirrormind/engine — pure TypeScript, zero I/O, no LLM on the ranking path. Golden tests, including “investor meeting + cool vs fatigued-warm skin.”

  • apps/api — Express adapters for PerfectCorp S2S: auth, skin-analysis, skin-tone, cloth-v3, hair-color, look-vto. Ports + mocks so tests never hit live APIs.
  • apps/web — Next.js 15 guided flow: goal → dual capture → skin report → Decision Card.
  • Contracts — Zod at the API boundary so web and engine cannot silently drift.

YouCam is the sensor and renderer. MirrorMind owns goals, scoring, honesty, and UX.

Challenges we ran into

Skin and try-on need different photos. A tight selfie is great for skin and bad for clothes; a torso shot is the reverse. One upload silently broke one of the two APIs.

We also hit PerfectCorp realities: SD vs HD size rules (480 vs 1080), error_apply_region_mismatch when garment category did not match the reference photo, RSA client auth, 30–180s task polling, and try-on that returned a catalog still while looking like success.

Workaround: dual capture, client + server preflight, map provider errors to retake CTAs, rendered: false with a banner, photographic catalog refs, and on-demand hair/makeup so the first decision stays under the latency budget.

Accomplishments that we're proud of

Skin provably changes the recommendation (engine test + live flow).

  • Glass-box Decision Card: scores, confidence, skin influence, alternatives.
  • Honest degradation instead of fake try-on.
  • A product, not a playground dump — we wired hair + look-vto + custom cloth where they fit the occasion, and skipped surgery/body simulators, nails, jewelry, and video gen.
  • Real YouCam in the product path, mocks only in automated tests.

What we learned

Beauty APIs are only as good as the photo contract. Docs that say “upload an image” hide face vs body vs garment-still. Latency and credits punish calling every endpoint. The interesting product is not “more VTO” — it is routing the right API to the right photo, then explaining the choice. Deterministic scoring is easier to trust than an LLM that picks an outfit.

What's next for MirrorMind

Per-look upper_body vs full_body categories, a complete photographic catalog, optional planner that outputs a structured plan (never scores), then accessories (bags, shoes, jewelry) once clothes + hair + makeup are reliable. Longer term: live wardrobe from the user’s own garment photos as the catalog, not a seed set.

Built With

Share this project:

Updates