Vibe search — mood-language search over a real catalog, no inference server
Give a storefront a search box that understands 'melting sunset' or 'something for a nervous first date': a curated mood lexicon + synonym scorer handles the head terms, and real CLIP embeddings (clip-ViT-B-32), computed once at build time over every catalog image, handle the tail via cosine ranking. Zero runtime ML infrastructure, zero per-query cost, results that match what the products look like rather than what their titles say. Proven on the Sydney Nova art storefront, then extracted into the @zsty/vibe-search package that now powers navigation search on zsty.us itself.
“Nobody searches a catalog in SKU. They search in feelings — and the embeddings already know what the products look like.”
When to use it
Trigger phrases.
Any of these in the user's prompt should invoke this skill in Claude Code.
- Add vibe search to this store
- Search by mood / aesthetic
- AI search for the catalog
- Make search understand 'cozy' / 'trippy' / 'minimal'
- Wire up @zsty/vibe-search
What it needs
Required inputs.
- 01The catalog: product records + at least one image per product
- 02A brand mood lexicon seed (10–30 head terms the owner actually hears customers say)
- 03A build pipeline that can run the one-time embedding pass (Python, sentence-transformers)
The mechanism
Pipeline.
01 · Embed at build
One offline pass turns every product image into a vector.
A build-time script runs clip-ViT-B-32 over each catalog image and writes the vectors to a static JSON artifact shipped with the app. No inference server, no vector DB, no per-query cost — the index is a file, rebuilt only when the catalog changes.
02 · Curate the lexicon
Head terms get hand-tuned answers; the tail rides the vectors.
The mood lexicon maps the 10–30 phrases customers actually use to weighted product sets, with a synonym scorer for near-misses. Anything the lexicon doesn't recognize falls through to CLIP: embed the query text, cosine-rank against the image vectors, return the closest work.
03 · Blend + rank
Lexicon hits boost, embeddings ground, one ranked list comes back.
The scorer merges lexicon weight and cosine similarity into a single ranking so a curated term never loses to a noisy vector match, and a novel query never returns empty. Results render instantly — the whole search path is synchronous client/edge code over static data.
04 · Package it
Extract as @zsty/vibe-search and reuse per brand.
The mechanism ships as a workspace package: bring your catalog, your lexicon, and your embedding artifact. Proven order: Sydney Nova storefront first, then the zsty.us nav search (PR #21, live) — next rollout target is the BMH catalog.
What lets it fan out
Connector stack.
With all of these MCP connectors wired, the mechanism runs end-to-end without human handoff. Without them, the handoff is a numbered Chrome checklist.
sentence-transformers (build-time, local)
AvailableStage 1 — the offline CLIP embedding pass; no runtime dependency.
@zsty/vibe-search package
AvailableStage 4 — drop-in integration for any storefront in the monorepo pattern.
Catalog source connector (Shopify / WooCommerce / Medusa rip)
PartialStage 1 input — automated catalog + image extraction per source platform.
Guardrails
Stop conditions.
The skill is predictable because it refuses to expand its own scope.
- stopNo runtime inference services — if it needs a GPU at query time, it's out of scope.
- stopDon't ship a lexicon the brand owner hasn't reviewed — mood words are brand voice.
- stopEmbedding artifacts rebuild only on catalog change — never per deploy.
- stopIf results for a head term look wrong, fix the lexicon, don't fine-tune the model.
Use this skill
Install + invoke.
The skill file is at og-gitclaw/claw-skills/blob/main/skills/vibe-search/SKILL.md. Copy it to ~/.claude/skills/vibe-search/SKILL.md to make it user-global, or to <project-root>/.claude/skills/vibe-search/SKILL.md to make it project-local. Then trigger it with any of the phrases above in a Claude Code session.