02 · K-beauty retail · vision LLM · Mexico
A skincare store where the AI only recommends what is on the shelf.
- 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
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.
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.
- 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
- 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
- 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
- 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.
- 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
- 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.
- 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.







- 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
- 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.
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)
- contact@codewithmuh.com