work/shoppin-discovery-feed.md
year: 2025 – 2026 role: Senior Product Engineer · Shoppin status: live stack: Pythonstack: Zilliz / Milvusstack: Redisstack: Gemini

Discovery & recommendation feed

A 6-source blended feed for 250K+ items that learns each user's taste in real time.
Discovery & recommendation feed cover

The core product surface at Shoppin. A personalized video + image feed computed in real time from 6 blended content sources, backed by Zilliz vector search and an event pipeline processing 28+ interaction types, deciding what's relevant, what's trending, and what a user is most likely to buy.

Six content sources blended per request: embedding-similarity (Zilliz, 1536-dim, tied to the user's query history), viral/trending, editorial curations, Pinterest recommendations, GRWM (get-ready-with-me), and creator-tiered videos. The mix adapts per user: brand-new users get 100% viral; established users get a 60/40 embedding-to-viral split that snaps to 20% increments based on a composite activity signal.

Under the hood, a 10-stage content pipeline processes ~29K candidate queries into ~100K final videos. Eight scoring components (engagement, platform, wardrobe bonus, clicks, query frequency, recency, trending, consistency, max 141 points) feed a double-log compression step so a single viral hit doesn't dominate, and 160+ pre-computed diversity multipliers across 240 classification labels keep the feed representative rather than skewed.

The event pipeline tracks 28+ interaction types (swipes, clicks, shares, try-ons, community reactions) into Redis profiles that trigger real-time refreshes. A two-stage Gemini query predictor runs in the background: stage one reads the user's photos, VTON results, and recent activity; stage two produces 10 predicted queries (7 extending current taste, 3 adjacent aesthetics), so the feed starts serving what someone wants before they type it. Ranking blends intent, prior preference, what's trending, what could go viral, and what's aesthetic enough that people buy.

metrics

last updated Jul 15, 2026 · view rendered →