Gem â Search All Online Vintage
After leaving Facebook in 2018, Iâve worked with Liisa on Gem, a search engine for vintage and pre-owned clothing. We launched the website and apps in late May 2019, and it has found a small dedicated group of users. We built Gem to make it easier to find a specific vintage item, and encourage reuse over buying new.
Gem has been a good challenge to build a small service myself. Hereâs a summary of how it works:
Indexing
Gem adds products to its search index in two ways: by using APIs, and crawling websites. Gem crawls included websites once a day and updates the index with new, changed and removed products. Getting the product details and images correctly requires a bit of custom rules for most sites, but itâs manageable. Sites that render pages with JavaScript are fetched with headless Chrome and Puppeteer.
Backend
The core search relies on Elasticsearch. Itâs quite a complex piece of software built on top of another piece of software, Lucene. Itâs easy to get started, but mastering it is a bit of a dark art, especially when it comes to scaling and performance tuning. The backend is a GraphQL service, written in Node.js, and running on Elastic Container Services on AWS.
Website
The website is React, with a server-side rendering setup. Server rendering is there for fast initial loading and share previews for messaging and social media. Routing is a custom set up built on top of History module to support both clean urls and a session-persisted stack of views. For Gem Stories, we use Slate.js to have a rich text editor that supports a limited pre-defined set of styles.
Apps
Gem app is available for iOS and Android and itâs built with React Native. React Native has been a mixed experience: If you know React, itâs really fun to build apps with the same declarative model, and run it immediately on both iOS and Android. But, itâs a bit like writing for two different browsers that support different things and have their own quirks. Rich interactions and animations with good performance can require lots of trial, error and optimization.
Thatâs it in a nutshell. Try out Gem, send feedback, and find something unique to wear!












