scentvec Try it live
Python · PyTorch · Weblive

Search perfumes by what is in 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.

Python · PyTorch · Web
scentvec · live demolive demo
scentvec screenshot
3platforms: Python, PyTorch, Web
44,658perfumes
128-dvectors
91tests
Why it exists

A perfume is a list of notes.

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.

What's inside

Ask it like a perfumer would

What is similar to X?

Nearest neighbours over 44,658 perfumes, with other editions of the same line hidden unless you ask for them.

Search in plain words

"Smoky vanilla tobacco, not too sweet, no patchouli" becomes a query, with must-have and avoid notes.

Something between two

Blend two perfumes and get what sits between them.

Embed your own formula

Type a note list that is not in the catalog and get its vector, predicted accords and olfactive family.

Filters

Gender, year range, brand, family, minimum ratings and a per-brand cap on every query.

Runs in your browser

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.

Run it yourself

Run it locally

From the README’s “Quick start” section. Full options, requirements and troubleshooting are there too.

Open the README
sh
$ 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/
Your data

Private by design.

  • 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).
Good to know

Honest limits.

Straight from the README, so you know what you're getting before you try it.

  • I
  • t
  • m
  • o
Under the hood

How it's built.

Built with

Language
PythonHTML/CSSJavaScript
Data
NumPypandas
Testing
Automated tests

67 files in the repo · last updated 13 Nov 2026.

Browse the code
Questions

Good questions.

What does it run on?

Python, PyTorch, Web. You can try it in the browser with nothing to install.

How do I get it running?

The commands in the “Quick start” box above come straight from the README. Paste them into a terminal; the README covers options and troubleshooting.

Where does my data go?

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).

What doesn't it do yet?

I t

Is it finished?

Not yet: it's marked “live” and still changing. The README always has the current state.

Is it free?

The source is public on GitHub under the MIT licence.

Who made it?

Juwen Lie, an R&D mechanical engineer in Batam, Indonesia, as an independent personal project.

Keep exploring

More from the same workbench.

Note pyramids in, neighbours out.

Search perfumes by what is in them.