All work
THATSIT! marketplace

Matching Two Million Listings to the Right Card with Vision AI

Turning a vision model into a deployed service that recognises which card a listing shows, for a collector marketplace with over 400,000 cards.

  • Vision AI
  • PyTorch
  • FastAPI
  • Transformers
  • Vector Search
  • Containers

Overview

THATSIT! is a marketplace for collectors that I co-founded, with over 400,000 cards and 2 million listings, launching in December 2026.

For a marketplace like this to work, every listing has to be linked to the right card. Asking sellers to search a catalogue of hundreds of thousands of near-identical cards by hand is slow and error-prone.

My job was to take a vision model and turn it into a dependable tool: a service that looks at a listing’s image and finds the card it shows.

How it works

AppReact Native app where collectors create and browse listings
BackendSwift backend handling the marketplace logic
Matching servicePython service with FastAPI, PyTorch and Transformers
EmbeddingsDINOv2 turns each card image into a vector that captures how it looks
Vector searchQdrant finds the catalogue cards closest to a listing’s image
DeploymentContainerised services running next to the app and backend

Simplified architecture.

My role

As co-founder and Technical Product Lead I own the matching service and the product around it.

  • Python matching service
  • Image embeddings with DINOv2
  • Vector search with Qdrant
  • FastAPI interface for the rest of the platform
  • Containerised deployment
  • Product vision, roadmap and launch planning
  • Sprint planning and retrospectives
  • Budget, including AI and cloud running costs

How I approached it

Search instead of classify

With hundreds of thousands of cards, the problem is closer to search than to classification. Embeddings let the service compare a listing against the whole catalogue and return the closest matches.

Treat the model as one part of a service

A good model isn’t a product yet. It needs a clean API, predictable behaviour and a deployment that the rest of the platform can rely on.

Keep running costs in view

AI and cloud costs grow with every listing. I track them as part of the product, not as an afterthought.

Key decisions

  • A pre-trained vision modelDINOv2 provides strong general-purpose image embeddings, which avoids training a custom model from scratch.
  • A dedicated vector databaseQdrant handles fast similarity search across the full catalogue.
  • A separate Python serviceMatching runs in its own container behind FastAPI, so the app and Swift backend use it like any other API.

Outcome

The marketplace has an AI matching service deployed that links listings to the right card, running in containers alongside the React Native app and the Swift backend.

Engineering principlePackaging a model, giving it a clean API and keeping it reliable in operation is where most of the work in applied AI is.

What I learned

The interesting problems in applied AI are often not about the model. They are about data, interfaces, cost and how the rest of the system behaves when the model isn’t sure.

Relevant skills

  • Python
  • PyTorch
  • Transformers
  • DINOv2
  • Image Embeddings
  • Qdrant
  • Vector Search
  • FastAPI
  • Docker
  • React Native
  • Swift
  • AI Cost Control
  • Product Ownership