Back to Projects

Spritz — Cologne Dupe Finder

Hackathon Project

AI-assisted fragrance discovery for finding affordable alternatives to luxury scents.

ReactReact RouterTailwind CSSNode.jsExpressPuppeteerGemini APIPostgreSQLDocker

Interactive project walkthrough

Interactive Preview

Fragrance Match Preview

This preview uses sample portfolio data. It does not perform live scraping, does not call Gemini, and does not provide live retailer prices.

Project Overview

Spritz takes a link to a luxury fragrance, extracts its scent profile, and surfaces budget-friendly alternatives with a similar character using a scraping and AI-classification pipeline backed by PostgreSQL.

My Role

Contributed to the hackathon application, its dataset/database structure, backend integration, and product workflow.

The Problem

Consumers may like a premium fragrance but lack an easy way to identify lower-cost products with a similar scent profile.

The Solution

A workflow combining web scraping, AI-assisted classification, and a PostgreSQL fragrance dataset to return relevant, affordable alternatives.

Key Features

Luxury Fragrance Lookup

Accepts a fragrance product URL as the starting point for a search.

Automated Scraping

Puppeteer extracts fragrance details directly from the source page.

AI Classification

Gemini analyzes scent notes to classify the fragrance's profile.

Alternative Matching

A PostgreSQL-backed dataset returns budget-friendly fragrances with a similar profile.

Technical Architecture

Fragrance URL
Puppeteer
Gemini Classification
PostgreSQL
Recommendations

Engineering Highlights

  • Integrated with external APIs to fetch fragrance data.
  • Designed a clean, minimalist UI for easy key-value searching.
  • Built a robust backend with PostgreSQL to store user preferences and search history.

Challenges and Lessons

Challenges

  • Normalizing inconsistent scent-note data scraped from different retailer pages.
  • Tuning the classification step so recommended alternatives actually matched the source fragrance's profile.

Lessons Learned

  • Pairing a scraping pipeline with an LLM classification step requires careful handling of malformed or missing data.
  • A small, well-structured dataset can outperform a larger, noisier one for similarity matching.