What is similar to X?
Nearest neighbours over 44,658 perfumes, with other editions of the same line hidden unless you ask for them.
An embedding model that turns a perfume's note pyramid into one 128-dimensional vector, then finds similar perfumes, searches in plain words or blends two, across 44,658 perfumes from 1,888 brands.
scentvec turns a perfume's note pyramid (top, heart and base notes) into one 128-dimensional unit vector.
On top of the model there is a catalog of 44,658 perfumes from 1,888 brands, with a command line, a local web app, a JSON API and a Python API.
Nearest neighbours over 44,658 perfumes, with other editions of the same line hidden unless you ask for them.
"Smoky vanilla tobacco, not too sweet, no patchouli" becomes a query, with must-have and avoid notes.
Blend two perfumes and get what sits between them.
Type a note list that is not in the catalog and get its vector, predicted accords and olfactive family.
Gender, year range, brand, family, minimum ratings and a per-brand cap on every query.
The demo page runs the trained network itself with no server; the JavaScript port agrees with the PyTorch model to a cosine of 0.9999998.
From the README’s “Quick start” section. Full options, requirements and troubleshooting are there too.
Open the README$ git clone https://github.com/juw12/scentvec.git
$ cd scentvec
$ python3 -m venv .venv
$ ./.venv/bin/pip install --upgrade pip # editable installs need pip 21.3+
$ ./.venv/bin/pip install -e .
$ ./.venv/bin/python scripts/fetch_raw_data.py # 36 MB from pinned sources, checksummed
$ sh scripts/rebuild_data.sh # clean, link, build chemistry table
$ ./.venv/bin/scentvec build-index # embed 44,658 perfumes -> artifacts/index
$ ./.venv/bin/scentvec serve # then open http://127.0.0.1:8765/
Straight from the README, so you know what you're getting before you try it.
67 files in the repo · last updated 13 Nov 2026.
Browse the codePython, PyTorch, Web. You can try it in the browser with nothing to install.
The commands in the “Quick start” box above come straight from the README. Paste them into a terminal; the README covers options and troubleshooting.
scripts/fetch_raw_data.py downloads the raw tables into data/raw from pinned revisions and checks their SHA-256 (see MODEL_CARD.md for sources and licences).
I t
Not yet: it's marked “live” and still changing. The README always has the current state.
The source is public on GitHub under the MIT licence.
Juwen Lie, an R&D mechanical engineer in Batam, Indonesia, as an independent personal project.
Search perfumes by what is in them.