02 · K-beauty retail · vision LLM · Mexico

A skincare store where the AI only recommends what is on the shelf.

Yoon Lab sells Korean skincare online at yoonlab.mx and in physical stores in Mexico. It runs on the Logistika Urbana platform, so the storefront, the point of sale and the back office share one inventory. In 2026 I added a vision-LLM skin analysis: a customer takes a photo and gets a routine built only from products that are in stock.
Role
Technical Lead (contract), via Logistika Urbana
Period
2024 — present · AI skin analysis 2026
Engagement
Remote contract
Team
Skin analysis: built alone (21 of 21 commits)
Location
Mexico · yoonlab.mx
products in the live catalogue
371
Korean brands
30+
of products tagged by skin concern
81%
products per routine, all in stock
≤ 5
scans per store per day: the spend ceiling
60
facial images stored
0

counted, not estimated · no client business metrics

01Context

Skincare is a category where customers often do not know what to buy. Around 370 products from more than 30 Korean brands do not help someone who only knows that their skin feels dry or breaks out. In a store, staff can give advice. A product grid cannot.

The catalogue is indexed the way people shop for skincare: by ingredient and by concern, such as acne, dehydration, dark spots, open pores or a weakened skin barrier. That index is what made the AI feature possible.

02The problem

The brand sells through two channels. Stock sold at a store counter has to disappear from the website at once, and a web order has to reach the people who pack it.

The skin analysis had three hard constraints from the first day. Recommend only products that are in stock. Never keep a customer's face. And never let a public, camera-facing feature create an open-ended bill from a model provider.

03Architecture
fig. 01request path · controls
In-store QRhmac tokenPhotonever storedPROVIDER LAYER · RUNTIME SWITCHClaudeactiveOpenAIstandby1-hour prompt caching · refusal fallbacksJSON schemastructured outputRoutinepersonalisedLive catalogin stock onlyEVALUATION HARNESSmodel × reasoning effortagreement vs inter-rater ceilingcost per scan · unusable ratepass gates written before resultsSPEND & ABUSE CONTROLSdeviceemail/24storeper-store daily cap = hard ceiling on spend
04What I built
  1. 01

    A storefront on the shared commerce backend

    The storefront is React and Vite on AWS Amplify; I wrote 134 of its 395 commits. Everything it calls (catalogue, search, stock, checkout, accounts) is the backend I built for Logistika Urbana.

    • Faceted search by ingredient, brand, category and skin concern, on OpenSearch
    • Live stock on every product card, down to “only 4 left”
    • A shoppable creator-video feed with the product attached
    • An app-like mobile layout in Spanish, with prices in MXN
    • Stripe checkout with Apple Pay and Google Pay; Puppeteer pre-rendering for SEO
  2. 02Aug–Oct 2026

    Structured output, joined against live stock

    A photo goes to a vision LLM, which must answer in a fixed JSON schema: skin type, concerns and severity. The backend, not the model, joins those concerns against the in-stock catalogue and picks a routine of up to five products. The model cannot recommend a product that does not exist or is sold out.

    • JSON-schema structured outputs on both providers
    • The catalogue block is cached for one hour with prompt caching
    • Refusal fallbacks when a model declines a photo
  3. 03

    Two providers, switchable at runtime

    Anthropic Claude and OpenAI sit behind one provider layer. An admin can switch the active provider from the dashboard without a deploy, which matters when a provider has an outage, changes its prices or loses an evaluation.

    • Claude, with the effort parameter
    • OpenAI Responses API, with json_schema and reasoning effort
  4. 04

    An evaluation harness, with the gates written first

    Before choosing a model I built a harness that sweeps model × reasoning effort against independently labelled photos. It reports agreement against the inter-rater ceiling, top-2 overlap, severity within one step, the unusable rate and the measured cost per scan. The pass gates were written down before any results came in.

  5. 05

    Spend and abuse controls

    A camera-facing AI feature is also a cost attack surface. Every scan passes several quotas, and the per-store daily cap is the hard ceiling on what the model can cost.

    • 2 free scans per device per day, plus a bonus for a verified email
    • 12 scans per /24 IP range
    • 60 scans per store per day
    • In-store QR codes carry HMAC-signed tokens; kiosk devices are enrolled
  6. 06

    Privacy by design

    The photo is processed in memory and never stored, in line with Mexico's data-protection law (LFPDPPP). An hourly Celery job links later purchases to scans over a 14-day window, so the business can see whether the feature sells, without keeping anyone's face.

  7. 07

    An in-store booth

    A macOS 14 SwiftUI kiosk with a USB camera that captures at full resolution, code-signed and notarised for release as a DMG. It is built; as of October 2026 it is not yet installed in a store.

05Screens
yoonlab.mx
The Yoon Lab homepage: photos of the physical store, buttons to order online or visit the store, and featured Korean skincare products
fig. 02The storefront: order online, or visit a physical store.
yoonlab.mx
A Yoon Lab brand page filtered by skin concern, showing live stock levels on each product
fig. 03Filtering by skin concern, with live stock on every card.
yoonlab.mx
Yoon Lab search results filtered by ingredient and brand
fig. 04Search across the catalogue, filtered by ingredient and brand.
yoonlab.mx
The Yoon Lab brand directory, listing more than thirty Korean skincare brands
fig. 05More than 30 Korean brands, browsable as a directory.
The Yoon Lab shoppable video feed on a phone: a creator video with the product, its price and a Ver producto button
fig. 06Shoppable video: creator content with the product attached.
The Yoon Lab home screen on a phone, in Spanish, showing the physical store, online ordering and featured products
fig. 07Home on mobile: Spanish throughout, free shipping over $1,000 MXN.
The Yoon Lab catalogue on a phone, in Spanish, with MXN prices, an in-stock label and a low-stock warning
fig. 08The catalogue on mobile: MXN prices and live stock state.
06Stack
Models
Claude APIOpenAI Responses APIJSON SchemaPrompt cachingEval harness
Services
DjangoDjango REST FrameworkPostgreSQLOpenSearchCeleryHMAC tokens
Surfaces
ReactViteTailwindMediaPipeStripeAWS AmplifySwiftUI (macOS)
07My part
  • The skin-analysis feature end to end: backend module, provider layer, quotas, evaluation harness and booth app (21 of 21 commits)
  • The commerce backend the storefront runs on (see Logistika Urbana)
  • 134 of 395 commits on the storefront itself
08Notes for reviewers
  • Scan volume, conversion and which model won the evaluation are client data, so they are not published here.
  • The storefront is public at yoonlab.mx. The code behind it is private and is not linked.
  • I deploy and integrate models; I did not train the vision models used here.
→For hiring teams

Platform, DevOps or AI-platform role? Let's talk.

I build and run production systems on AWS, and I deploy and operate models in them. I'm looking for a senior platform, DevOps or AI-platform role, and I'm relocating to Japan in 2027. A résumé and references are available on request.

Role
Platform & AI Engineer · Technical Lead
Location
Lahore, Pakistan · Relocating to Tokyo · 2027
Languages
English (professional) · Urdu (native) · Japanese (beginner, studying daily)
Email
contact@codewithmuh.com