-
-
A flat-lay denim jacket on the shopper with YouCam AI Clothes (cloth-v4, outer), next to the final sale check
-
Style it with what you own: AI Clothes for the jacket, then AI Shoes for the shopper's sneakers
-
Every image shows the YouCam API calls behind it: file registration, upload, task, polling, download
-
A missing measurement becomes a ready-to-send question for the seller
-
Your usual measurements, taken from clothes that fit and stored only in your browser
-
Compare saved looks side by side
-
Mobile-first: the whole flow in one column on a phone
Inspiration
Secondhand and vintage clothes are usually final sale. Every item is one of a kind, there is no size chart, returns are rare, and the photo is a jacket on a hanger or a sweater on a bedroom floor. That is exactly where trying before buying matters most, and exactly where nobody offers it. Shoppers guess, sellers answer the same "what are the measurements?" question over and over, and mistakes end as disputes or clothes that never get worn.
What it does
- Your photo, once. Add a full-body photo and a few measurements from clothes you already own that fit, laid flat. Both stay in your browser.
- Pick or paste a listing. Final Sale sends the garment photo and your photo to the right YouCam API: AI Clothes (
cloth-v4) withouterfor jackets,upper_bodyfor sweaters and tops,full_bodyfor dresses, and AI Shoes (shoes-transfer) for boots and shoes. In about 13 seconds the flat-lay jacket is on you, over your own top. - Will it work? Next to the image sits the final sale check. A language model reads the listing into facts (measurements, fabric, flaws, size label, era, return policy), each with the seller's exact words. Plain code verifies every quote, converts cm and all-round measurements to flat inches, and compares them with your measurements: "Length 21 in, your usual is 23 in", "Seller mentions: small faint mark near the left cuff", "Not listed: length", plus a ready-to-send question for the seller.
- Style it with what you own. Pick a piece from your closet and Final Sale chains two YouCam calls in dressing order, for example AI Clothes for the jacket, then AI Shoes for your white sneakers. Save looks and compare listings side by side.
The aha: a flat-lay thrift photo becomes you wearing it, with a warning that the listing is two inches shorter than what you usually wear. Switch to the second shopper and the same jacket gets a different verdict, because the check runs on each person's own measurements.
How we built it
- YouCam File and Task APIs, server-side. Register both photos (
POST /s2s/v2.0/file), PUT the bytes to the signed URLs, startcloth-v4orshoes-transfer, poll every 2.5 s then 5 s until success, and download the result. YouCam errors such aserror_posebecome plain advice. - Routing and chaining (
src/lib/routing.ts): garment type decides the endpoint andgarment_category. For an outfit, the first result is uploaded again as the source of the next task, in layer order (dress or bottoms, then tops, outerwear, shoes). - Grounded listing reader. Qwen 3.8 on W&B Inference (OpenAI-compatible) with strict JSON-schema output, zod validation and retries. Code drops any fact whose quote is not in the listing or whose number is not in its quote, then does every comparison itself, with per-measurement tolerances and extra room for stretch fabrics.
- Every image shows its API. Each try-on names the YouCam API that made it, and an "API calls" panel shows the file registration, upload, task, polling and download with timing and units.
- Safe live mode. A disk cache keyed by image hashes (the same photos never cost units twice), a per-server unit ledger with a hard cap, and one live job at a time so a double click cannot fire two paid tasks.
- Replay of a recorded run. Every try-on and listing reading in the demo was recorded through the app's own API routes and ships in the repo, so judges can click through without keys. The fit check runs live in the browser, so editing measurements changes the verdict immediately.
- Next.js 16, React 19, TypeScript, Tailwind CSS 4. Built to WCAG 2.2 AA: axe-core reports 0 violations on six views, plus a keyboard-only pass.
Challenges we ran into
- Finding the right garment category. The AI Clothes guide only shows
full_body; the full list, includingouterfor jackets, lives in the OpenAPI bundle.outeris what lets a jacket go on over the shopper's own top. - Flat-lay bottoms. Lower-body try-ons need a worn photo, while resale trousers are almost always photographed flat, so the app routes them honestly and says so.
- Outfits are two calls. There is no multi-garment request, so we chain results in a deterministic dressing order.
- Trusting an LLM with numbers. Every fact must carry its exact quote, and code checks it before any comparison.
- A shared unit budget. 1,000 units across two projects: the whole recorded demo, ten tasks including two chained outfits, cost 20 units.
Accomplishments that we're proud of
The try-on keeps the shopper's own face, jeans, shoes and room, so it feels like your outfit rather than a model's. And the check never guesses: a missing measurement becomes a question to ask the seller, not an invented number.
What we learned
Try-on answers "how will it look"; only measurements answer "will it fit". Putting the two side by side is what makes a final-sale purchase feel safe.
What's next for Final Sale
A browser extension that runs the check on any resale listing, seller-side "worn" photos for one-off items without a model or studio, and lower-body support for worn listing photos.
Honest limits
A try-on shows the look, not the fit; measurements decide fit. The model can adjust a pose slightly. Shoe-size conversions from EU and UK sizes are approximate and labeled. All sellers, shops and listings are fictional; photos come from Wikimedia Commons under the licenses listed in the repo.
Built With
- assemblyai
- axe-core
- ffmpeg
- next.js
- openai-sdk
- playwright
- pnpm
- qwen
- react
- tailwindcss
- typescript
- wandb
- youcam-ai-clothes
- youcam-ai-shoes
- youcam-api
- zod
Log in or sign up for Devpost to join the conversation.