
Independent shops know their regulars personally, but the till only knows what sold last week. Bestseller lists ignore taste, and recommendation engines are black boxes that can invent numbers. Vitrine is a floor tool for a small retailer. The clerk loads the regular who just walked in, and the shelf instantly re-ranks to that person's cultural signals (music, food, crafts). Every item carries a "because-path" explaining why it fits. The clerk can ask in plain language ("a gift under $80 that feels like her records"), set items aside into a bag, and create a sandbox order — a real commercial action, never a captured payment. The commercial decision is not the language model. A published score ranks the shelf: inStock × (0.62 tasteFit + 0.23 marginRate + 0.15 novelty). The margin gap of the taste top-3 versus the store's bestsellers is plain arithmetic shown on the Desk page. The language model only writes the note the clerk reads, and only about products the score already chose — so it cannot invent prices, margins or stock. AMD: the narration is built to run on an open-weight model (Qwen2.5 Instruct) served by vLLM on an AMD Instinct MI300X with ROCm, through an OpenAI-compatible endpoint. Honest status: the public demo and the recorded video run without a GPU endpoint attached, so their replies are badged "local planner"; pointing LLM_BASE_URL at the MI300X vLLM server switches the narration to the GPU with no code change. Each reply that the GPU actually produced is badged "Served on AMD MI300X via vLLM/ROCm"; a failed or local call never wears that badge, and the app falls back to a local planner so the floor keeps working. Business value: personalised selling for shops that have no data team, higher-margin baskets than "bestsellers", and a clerk who can explain every recommendation. Stack: Next.js 16, React 19, TypeScript, Tailwind, vLLM, ROCm, AMD Instinct MI300X, Docker.
18 Oct 2026