All Stories
2026-09-093 min read

Visual Search · CLIP · E-commerce · TableModel · Multimodal AI · Pixeltable Cloud · Product Catalog

SnapCatalog: Shop-the-Look Search Without a Tagging Farm

Ingest SKU photos, auto-tag with a VLM, search by shopper snapshot or by text. One CLIP index on the image. Pixeltable is the catalog row — not a tagger plus Pinecone.

Pierre Brunelle

Pierre Brunelle

Pixeltable Team

Summary: SnapCatalog is the merchant loop: a SKU photo becomes category, colors, and a title, then a shopper can drop a reference shot or type “navy linen shirt” and land on the same index. You do not run a tagging queue and a vector database as two products. You declare pxt.Image. Gemini writes the attributes. CLIP sits on the image. pip install pixeltable.

The Product#

  • Ingest a product image with sku
  • Auto-fill category, colors, title from the pixels
  • Shop-the-look: upload a photo, return nearest SKUs
  • The same index answers a text query

Image→video is find a video from an image. Library search as a hosted UI is PixelSearch. This post is a catalog row: one image, tags, reverse image.

The Stitch You Delete#

A folder of JPEGs. A batch job that calls a VLM. A CSV of tags you paste into Shopify. CLIP embeddings in Pinecone keyed by SKU. A second path for text. Pixeltable is the row those joints were syncing by hand. Same CLIP-on-image idea as the Photos clone — here the entity is a SKU, not a family photo.

The Receipt#

python

One huggingface.clip embedder on the image serves the shopper photo (similarity(ref_image)) and a text query (similarity(string='navy linen shirt')). Do not stack a second CLIP index with different kwargs on the same column. Insert a SKU; tags and the index follow. Same file on Cloud: pxt db updatepxt schema updatepxt service update.

What This Is Not#

Not a marketplace. Not Shopify. Auth and checkout stay where they are. Not PixelSearch as a hosted consumer app — that UI already exists. This is the table behind shop-the-look.

People Also Ask#

Why embedding= not image_embed=? Same CLIP, one kwarg, so text and image queries share the index — the Photos-post form. Frame search on video uses image_embed= on the iterator column; do not mix both styles on one snippet.

Do I need a tag taxonomy table? Gemini fills JSON. If you already have a taxonomy, constrain the prompt. Do not stand up a second store for it.

How do I go to Cloud? Same app.py. PIXELTABLE_API_KEY, pxt://org:db, then db → schema → service.

Tag the Pixels, Search the Same Vector#

Declare the product. Apply the file. Insert the JPEG. Call shop_the_look. Keep the catalog. Delete the tagging farm.

Declarative. Multimodal. Incremental.

Focus on innovation, not infrastructure.

10-minute tutorial · Join community