Multi-tenant semantic search SaaS for product catalogs.
Sift turns a product catalog (CSV or JSON) into a hosted semantic search and conversational RAG endpoint, scoped per tenant. Built for e-commerce stores that want intelligent product search and discovery without standing up their own vector infrastructure.
Finalist (top 5 of 30 teams, 100+ participants) at the IE Tech Venture Bootcamp 2026.
- Catalog ingestion: Tenants upload CSV or JSON product catalogs. Sift parses, normalizes, deduplicates, and generates per-product embedding text.
- Semantic search: OpenAI embeddings for vectorization, Qdrant for nearest-neighbor retrieval, per-tenant collection isolation.
- Vision-assisted enrichment: GPT-4o describes product images to enrich text representations for catalogs with thin written copy.
- Conversational RAG:
/chatmaintains conversation context, expands queries, and returns cited product matches. - Analytics: Tracks query volume, top searches, click-throughs, and tenant-level retrieval performance.
apps/
├── api/ FastAPI backend (Python 3.12, uv-managed)
│ ├── routes/ tenants, jobs, ingest, search, products, chat, analytics, track
│ └── services/ ingestion, openai_service, qdrant_repo, supabase_repo,
│ vision_service, conversational_rag, query_expansion, parsers
└── web/ Next.js frontend (TypeScript)
- API: FastAPI, Python 3.12,
uvfor dependency management - Frontend: Next.js, React, TypeScript
- Embeddings: OpenAI
text-embedding-3-small - Vector DB: Qdrant (per-tenant collections)
- Tenant data: Supabase (Postgres)
- Vision: OpenAI GPT-4o
- File storage: Supabase Storage for uploaded catalogs
POST /tenants— Create a tenantPOST /ingest— Upload a CSV or JSON catalog (kicks off async job)GET /jobs/{id}— Poll ingestion statusGET /search?q=...— Semantic product searchPOST /chat— Conversational RAG over the tenant's catalogGET /products— Tenant product listGET /analytics— Search and conversion metricsPOST /track— Client-side event tracking
Every request is authenticated via an API key that resolves to a tenant_id. All Qdrant operations scope to per-tenant collections. All Supabase rows enforce tenant_id constraints. See apps/api/test_tenant_isolation.py for the isolation contract.
Sift evolved from SiftOps, a WordPress-native RAG application that won the PwC x Lovable Buildathon. The v1 indexed open-web WordPress content via the WP REST API with local Ollama inference for privacy-first deployment.
The pivot shifted the use case (WordPress open-web content → tenant-scoped e-commerce catalogs) but kept the architectural principles: per-source isolation, grounded retrieval with citations, and an API designed for someone else to integrate.
- Finalist (top 5 of 30 teams) at the IE Tech Venture Bootcamp 2026, 100+ participants
- PwC x Lovable Buildathon Winner (predecessor, SiftOps v1, selected from 100+ startup teams)
See apps/api/README.md and apps/web/README.md for service-level setup.
# API
cd apps/api
uv sync
uv run uvicorn app.main:app --reload
# Web (separate terminal)
cd apps/web
npm install
npm run dev