All Stories
2026-09-09•3 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

View as Markdown

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 update → pxt schema update → pxt 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.

Is this an AI automation workflow? Yes. Insert a JPEG; Gemini tags and CLIP run as columns. The category is AI automation workflow.

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.

The same CLIP-on-image index with campaign spend on the row is AdRadar.

Declarative. Multimodal. Incremental.

One Python file for tables, indexes, and HTTP. Start locally, or sign up for Cloud.

Get started

Docs quickstart · 10-minute tutorial · GitHub · Discord