Thrift

AI-Powered Second-Hand Product Discovery


Inspiration

Finding second-hand and vintage stuff usually means opening five tabs, repeating the same search on eBay, Etsy, Depop, Poshmark, and Craigslist—and getting no memory of what you already skipped. We wanted it to feel like asking a friend who actually knows where to look: you describe what you want (or upload a photo), and get real listings in one place, with an AI that refines your search and remembers what you’re not into.


The Solution

Thrift is an agentic product discovery app. You type or upload an image; the AI (Gemini) asks follow-ups when it needs to narrow things down. We generate a few reference images (Stable Diffusion on Modal) so you can confirm we’re on the right track. Then an OpenClaw agent in Docker hits the Decodo API and returns live listings from all those marketplaces. You can subscribe to email alerts every 15 minutes for new matches, and Supermemory stores your preferences across sessions so we don’t keep suggesting stuff you’ve already passed on.

What it does:

  • Natural language search — e.g. “vintage Levi 501s under $50” or “mid-century desk lamp.” The AI refines with follow-up questions.
  • Image search — Upload a photo; the app figures out what to search for.
  • Reference images — Three Stable Diffusion–generated images so you can confirm before digging into results.
  • Real multi-marketplace results — OpenClaw + Decodo scrape eBay, Etsy, Depop, Poshmark, Craigslist, and Facebook Marketplace.
  • Email alerts — Optional 15-minute digests when new matching listings show up.
  • Preference memory — Supermemory remembers what to avoid so repeat users get smarter suggestions.

How we built it

  • Frontend & API: Next.js 16 (React, TypeScript), session-based conversation state, image upload in the first message.
  • Conversational AI: Modal serverless app with Google Gemini 2.5 Flash for multi-turn chat and image understanding, plus Supermemory for cross-session preference recall.
  • Reference images: Stable Diffusion 3.5 Large Turbo on Modal A100 GPUs — three distinct reference images per search.
  • Product search: Containerized OpenClaw with a custom product-search skill calling the Decodo scraping API across all supported marketplaces.
  • Data: PostgreSQL and Prisma for subscriptions and seen items; MailJet for transactional emails; 15-minute cron (Modal or Next.js API) for alert digests.

The technical challenge: Keeping three runtimes in sync—Next.js, Modal (chat + image gen), and the OpenClaw Docker agent—with a clean deploy path to a single Linux server (DigitalOcean Droplet) and correct Prisma engine loading for standalone builds.


Challenges we ran into

  • Cross-platform Prisma engine: We build on Mac but deploy on Linux. Prisma’s query engine is platform-specific, so we had to add debian-openssl-3.0.x to the schema’s binary targets and copy the Linux engine into the Next.js standalone output so the deployed app could load it.
  • Next.js 16 standalone: Getting public and .next/static into the standalone build and running reliably under PM2 with limited memory took some iteration.
  • Coordinating three runtimes: Keeping env vars and deploy steps clear for Next.js, Modal, and the OpenClaw container required a minimal checklist and docs so nothing was missing in production.

Accomplishments that we're proud of

  • Full end-to-end flow: natural language or image → AI refinement → real multi-marketplace results → optional email alerts.
  • Integrating Gemini (multimodal), Supermemory, OpenClaw, and Decodo into one coherent product experience.
  • A working standalone deploy on a small DigitalOcean Droplet with the scraper in Docker alongside the app.
  • Preference memory that actually carries across sessions so repeat users get better suggestions.

What we learned

  • How Prisma’s binary targets and standalone output interact when building on one OS and deploying on another.
  • Using agentic workflows (OpenClaw skills + Decodo) for real-world scraping and exposing them cleanly through a Next.js API.
  • When to use Modal serverless (bursty LLM and image workloads) vs. a long-lived Docker agent for scraping.

What's next for Thrift

  • More marketplaces and filters (condition, location, seller rating).
  • Richer alert preferences (frequency, price range, keywords).
  • Vector search or embeddings for “find similar” and better recommendations.

Built With

Share this project:

Updates