Skip to main content
Back to all posts
Oct. 20268 min read

Swatchless: answering "which shade matches me?" with the customer wearing it, checked against Luxy Hair's own stylists

Hair can't be returned once it's worn, so online buyers order a $127.50 swatch ring and wait a week. Swatchless gives the stylist a shortlist in two minutes: YouCam measures density and length and renders each pick on the customer, Claude chooses from 973 real pieces, and code refuses anything out of stock. Luxy's stylists' shade made the shortlist for 13 of 16 people.

YouCam APIPerfect CorpVirtual Try-OnClaudeMCPeCommerceNext.jsHackathon
I wrote this post for the YouCam API Skin AI & eCommerce VTO Hackathon (Perfect Corp, Devpost, October 2026), and built Swatchless for the same submission. The source, the benchmark data and every run are on GitHub at github.com/JonathanSolvesProblems/swatchless. The live desk spends paid API credit and comes down after judging, so there is no live button here; the demo video shows a full consult.
The claim in one sentence: on 16 real people Luxy Hair's stylists photographed and then styled, graded by the shade those stylists published, the desk had their shade on its shortlist for 13 of 16 and as its first pick for 8 of 16, and YouCam rendered 15 of the 16 wearing the shades it chose. Sixteen people is a small sample, the stylists' choice is one right answer rather than the only one, and with YouCam switched off the first pick still matched 8 of 16: naming the shade is the model's job, and what YouCam adds is the customer wearing it before they buy.
The Swatchless desk: a row of 30 Luxy Hair shade swatches across the top with a tag reading Off Black, matched for the customer below, the headline Answer "which shade?" with the customer wearing it, and a Start a consult form for a selfie and a head-down photo.
The desk. Above, the 30 Luxy shades it can render; the tag names the latest consult's first pick.

The desk at 9:40 on a Monday

Dana (a composite, not a real stylist) answers the "Text a Stylist" line at an online hair retailer. Most mornings the same message comes in: a selfie, a photo of the top of the head, and "my part keeps getting wider, which fill-ins match my colour?" The honest answer today is a swatch ring in the post (Luxy Hair's costs $127.50), a week of shipping, and a purchase that cannot be returned, because hair extensions are non-returnable once opened.

Swatchless gives Dana a different answer in about two minutes. She drops both photos in. YouCam measures the customer's hair density from the head-down photo and their length from the selfie. Claude reads the measurements, looks at the selfie and the store's swatches, chooses the pieces worth trying, and has YouCam render each one on the customer from the store's own product photo. It looks at every render, drops the ones that changed the face or missed the shade, and hands Dana a shortlist with the customer wearing each pick, a cart link into the real store, and a reply in her voice.

The consult page: under What YouCam measured, the customer's selfie and head-down photo beside two cards, Hair density 2.3 of 4, medium, and Hair length above chest or longer, a note that both photos are AI-generated, then a Shortlisted row with the customer as sent, rendered in Off Black, an Espresso Mix topper shown as a swatch, and rendered in Dark Brown.
YouCam reads density and length. Claude chooses fill-ins because of the density read; YouCam renders the shades on the customer. The customer is an AI-generated composite.

What the desk did for the demo customer

The demo customer is a composite: both photos are AI-generated, and every page that shows them says so. In the live run from 27 October, YouCam measured medium density, with the scalp showing at the part, and length as above chest or longer. Claude chose fill-ins and a topper for the part because of the density read, shortlisted Luxy Hair's Off Black and Dark Brown and had YouCam render both on the customer, and added Ellen Wille's Espresso Mix topper without a render. The page says why: the only photos the store lists for that topper show a different, lighter shade, so a render would have shown the wrong colour. Then it drafted the reply.

The shortlist close up: the customer as sent, then rendered in Luxy Off Black and Luxy Dark Brown, each labelled Rendered from Luxy Hair's photo with an Add to Luxy Hair cart button, and between them the Ellen Wille Espresso Mix topper shown only as a swatch with a note that no preview is shown because the store's photos show a different, lighter shade.
What it cannot show, it says: this topper's store photos show a different shade, so the desk shows no render and says why under the swatch.
Below the shortlist, a Reply to send card with the drafted message explaining each pick, with Send from my email and Copy the reply buttons, and a collapsed panel reading How the desk got there: 14 steps.
The reply goes out from the stylist's own mail, with a cart link under each rendered pick.

What the model decides, and what the code refuses

Claude drives Perfect Corp's hosted YouCam MCP server directly, through the Anthropic MCP connector. It decides which category fits the density read, which shades to try, and which of the store's photos to use as the reference; whether a render is good enough, needs redoing, or gets dropped, after looking at every one before it may cite it; and when to stop and ask for a better photo. The code decides the rest, and the model cannot talk past it: a cited render must be one YouCam returned in this consult, made from a store photo of the same shade, so a render of one product is never shown under another; a pick with no render must say why; no product twice, at most three items; and the variant must be in stock on the store's site right now.

The expanded How the desk got there panel beside the reply: Density measured from the head-down photo at level 2 of 4, Length chest length or longer, Hair type not measured because it needs three photos, a Colour read, and a Dropped, and why list explaining the topper with no render and the Dark Brown preview made from a shorter product photo.
Every decision is on the record: what YouCam measured, what it could not measure and why, and each step to the shortlist.

Against Luxy's own stylists

Luxy Hair photographs real people before they wear its hair and publishes the shade its stylists put on them. That shade is the answer. The desk gets only Luxy's "before" photo, never sees that person as a reference, and picks from the 30 Luxy shades that have a trusted on-model photo. All 18 people ran. For 2 of them every trusted photo of their shade was a photo of them, so once those were excluded the desk could not be offered it at all; those rows are reported as not offerable and counted on neither side. Of the other 16, the stylists' shade was on the shortlist for 13 and was the first pick for 8. Picking at random would land the first pick about one time in thirty. In 5 of the 8 first-pick misses, Luxy's shade was the desk's second pick: Off Black before Jet Black, Light Gray before Dark Gray, Dark Brown before Chocolate Brown.

The benchmark page headlined The shade Luxy's own stylists chose was on the desk's shortlist for 13 of 16 people they styled, with three cards: 13 of 16 on the shortlist, 8 of 16 as the exact first pick, and 15 of 16 rendered by YouCam.
Checked against Luxy's own stylists: their shade made the shortlist for 13 of 16 people, and YouCam rendered 15 of them.

The same 18 people ran again with YouCam off: the same model, photo and swatches, no YouCam tools. With YouCam off, Luxy's shade was on the shortlist for 12 of 16 and the desk could show 0 of 16 wearing anything. The first pick matched 8 of 16 either way. YouCam rendered 15 of the 16 with it on; the one photo it could not render was taken from behind, with no face in it.

The person-by-person table: Luxy's before photo for each person, the shade Luxy chose, the desk's first pick with YouCam and with YouCam off, filled when it matches and outlined when it differs, with Person 4 marked not offerable.
Person by person, on Luxy Hair's own before photos, beside the same desk with YouCam off. An unofferable shade counts on neither side.

After the reply, it keeps watching

An out-of-stock pick is refused and goes on the watch list. A daily job re-reads the store's live stock and, when the piece is back, renders it on the customer again and drafts the follow-up for the stylist to send. The catalogue behind all of it is 973 fill-ins, toppers, hairpieces and headcovers in 230 shades, read from Luxy Hair, Halo Couture and Ellen Wille's public product feeds, with every product photo classified once so the agent is only offered front-facing photos the try-on can use. Swatchless is not affiliated with any of the stores.

The Watch list page, The shades a customer is waiting on, explaining that out-of-stock picks are refused and re-checked daily, with a row of the shades recommended so far: Off Black, Espresso Mix, Dark Brown and Jet Black, all in stock when last checked.
After the reply the desk keeps working: an out-of-stock pick is refused, its stock re-read daily, and re-rendered when the store has it.

What is not claimed

The 13 of 16 is graded by Luxy's stylists, not by me, but sixteen people is a small benchmark, and the stylists' shade is one team's choice rather than the only right answer. A one-person difference between running with YouCam and with it off (13 against 12 on the shortlist) is within what a sample this size can move by chance, and the first pick matched 8 of 16 with or without it, so I do not claim YouCam picks better shades; it measures the density that decides fill-ins versus length, puts the shade on the customer before they buy hair they cannot return, and gives the desk a render to reject when it changes the face. A render shows the finished look, not how a piece clips in or how much of the part it hides, and the site says so under every shortlist. Density needs a head-down photo and hair type needs three photos; without them the desk says what it could not measure rather than guessing. The demo customer is an AI-generated composite, and the stylist in the story is a composite too.

Related project

Swatchless: a hair retailer's stylist answers "which shade matches me?" with the customer wearing it, measured and rendered by YouCam, picked by Claude from 973 real pieces

View the project