ParshvPatel's picture
fix: add HuggingFace Spaces metadata to README
5b6fdc0
---
title: Interlace Multimodal Fashion Search
emoji: 👗
colorFrom: purple
colorTo: pink
sdk: docker
app_port: 7860
pinned: false
---
# Interlace — Multimodal Fashion Search Engine
A semantic fashion search engine built on FashionCLIP, FAISS, and BM25, with a Next.js frontend. Supports text search, image upload search, and multimodal queries against an ASOS product catalog.
---
## Prerequisites
| Tool | Version | Install |
|------|---------|---------|
| Python | 3.11 | [python.org](https://python.org) |
| Node.js | 18+ | [nodejs.org](https://nodejs.org) |
| npm | 9+ | bundled with Node.js |
---
## Project Structure
```
Asos_Engine_Project/
backend/ FastAPI backend (ML engine + REST API)
app/
engine/ FashionCLIP encoder, FAISS index, BM25, reranker
routers/ API route handlers
services/ Search orchestration
models/ Pydantic schemas
requirements.txt
Dockerfile
frontend/ Next.js 15 App Router frontend
src/
app/ Pages (/, /search, /products/[sku])
components/ UI components
lib/ API client, types, mock data
asos_clean.csv Product catalog (not in repo — required for backend)
asos_engine/ FAISS indexes + embeddings (auto-generated on first run)
```
---
## Running Locally
There are two modes:
- **Mock mode** — frontend only, uses hardcoded sample products. No backend needed. Good for UI demos.
- **Full stack** — frontend + backend, returns real ASOS search results with images.
---
### Option A: Frontend only (mock mode)
Use this if you just want to demo the UI without running the ML backend.
**Terminal 1:**
```bash
cd frontend
npm install
npm run dev
```
Open [http://localhost:3000](http://localhost:3000)
The app detects that no backend URL is configured and falls back to mock data automatically.
---
### Option B: Full stack (backend + frontend)
Use this for a real demo with live search results.
#### Step 1: Set up the backend
> **Important:** All backend commands must be run from the **project root** (`Asos_Engine_Project/`), not from inside `backend/`. The module imports use the `backend.` prefix and require the project root on the Python path.
**Terminal 1 — install and start the backend:**
```bash
# From Asos_Engine_Project/
python -m pip install -r backend/requirements.txt
python -m uvicorn backend.app.main:app --reload --port 8000
```
> **Windows note:** Use `python -m uvicorn` (not bare `uvicorn`). PowerShell does not automatically add Python's `Scripts/` folder to PATH, so the bare command is not found.
On first run, the engine will build FAISS indexes from `asos_clean.csv`. This takes a few minutes and produces files in `asos_engine/`. Subsequent runs skip this and load directly.
Expected output when ready:
```
Engine ready with 46,000+ products
INFO: Uvicorn running on http://0.0.0.0:8000
```
Verify it is running:
```bash
curl http://localhost:8000/api/v1/health
# Expected: {"status":"ok","engine_ready":true,"product_count":...}
```
Interactive API docs: [http://localhost:8000/docs](http://localhost:8000/docs)
#### Step 2: Set up the frontend
**Terminal 2 — configure and start the frontend:**
```bash
cd frontend
# Create local env file pointing to the running backend
# Use printf, not echo -- PowerShell's echo writes UTF-16 which Next.js cannot read
printf 'NEXT_PUBLIC_API_URL=http://localhost:8000\n' > .env.local
npm install
npm run dev
```
Open [http://localhost:3000](http://localhost:3000)
---
## Data File
`asos_clean.csv` is not stored in this repository (too large for Git). It must be present in the project root for the backend to start. The config auto-detects it:
```
Asos_Engine_Project/
asos_clean.csv <-- place it here
```
If you have the `.parquet` version instead (`asos_clean.parquet`), that also works and is preferred (faster to load).
---
## Environment Variables
### Backend
Set via shell environment or a `.env` file in `backend/`:
| Variable | Default | Description |
|----------|---------|-------------|
| `ASOS_DATA_PATH` | auto-detected | Path to `asos_clean.csv` / `.parquet` |
| `ASOS_PERSISTENT_DIR` | `./asos_engine` | Where FAISS indexes are saved |
| `ASOS_LOG_LEVEL` | `INFO` | Logging verbosity |
| `HF_TOKEN` | (none) | HuggingFace token — needed to download FashionCLIP on first run if rate-limited |
### Frontend
Set in `frontend/.env.local` (this file is gitignored):
| Variable | Example | Description |
|----------|---------|-------------|
| `NEXT_PUBLIC_API_URL` | `http://localhost:8000` | Backend base URL. If unset, app uses mock data. |
---
## API Endpoints
All routes are prefixed with `/api/v1`.
| Method | Endpoint | Description |
|--------|----------|-------------|
| GET | `/health` | Engine status and product count |
| POST | `/search` | Text, image (base64), or multimodal search |
| POST | `/search/image` | Image file upload search |
| GET | `/search/similar/{sku}` | Visually similar products |
| GET | `/products/{sku}` | Product detail by SKU |
| GET | `/products/{sku}/outfit` | Outfit recommendations for a product |
---
## Tech Stack
**Backend:** Python 3.11 · FastAPI · FashionCLIP · FAISS · BM25 · PyTorch · Pydantic v2 · Pandas · Uvicorn
**Frontend:** Next.js 15 (App Router) · TypeScript · Tailwind CSS v4 · Framer Motion · GSAP