
The goal of this project is to turn a free-text shopping list into concrete supermarket catalog products. You paste one product per line (or upload a .txt), choose a store and postal code, and the system returns the best SKU match per line — preferring price per kilogram when it exists, computing how many packs you need, and exposing exportable product links.
Matching follows a multi-stage hybrid pipeline rather than a single score: heuristics catch exact or token-subset name matches, blocking narrows candidates, multilingual MiniLM embeddings recover semantic neighbors, and Jaro–Winkler distance acts as a final referee before price/kg ranking. Quantity fulfillment runs after the winner is chosen, so pack size does not bias which product is selected.
The architecture splits a Streamlit master (UI, submit, poll, export) from a FastAPI worker (catalog fetch, embeddings, linkage jobs). The UI never loads the embedding model or calls the store API directly. v1 supports Mercadona live; DIA and Carrefour are reserved in the UI for later.
Try the live demo: Lista → catálogo.