Inspiration
I built this because I kept seeing screenshots, moodboards, and candid photos that captured a mood — a silhouette, a color palette, or a particular fabric texture — and I wanted a fast, no‑friction way to say “that exact vibe” out loud. This project isn’t about shopping; it’s about naming and exploring style: why a look reads as vintage, relaxed, minimalist, or edgy.
Outfits are small visual compositions. My goal was to make the relationships between shape, color, texture, and proportion discoverable: drop an image and surface other looks that share the same visual structure and feel.
What it does
- Upload or drop an image to get visually similar looks ranked by embedding similarity.
- Show quick previews, dominant color hints, and rough silhouette cues so you can inspect why a match was suggested.
- Provide a small, extendable frontend that can connect to server-side embeddings or a vector index for larger datasets.
How We built it
- Frontend: created a Vite + React + TypeScript app to handle image uploads, previews, and results. UI components are composed for a tidy, responsive experience. Files live under
srcand the dev server runs withnpm run dev. - Embeddings / Matching: images are sent to an embedding pipeline (local or external model). Each image becomes a vector in $\mathbb{R}^d$; similarity is computed with cosine or Euclidean distance to find top matches.
- Tooling & tests: used
vitestfor a tiny test suite and automated linting with ESLint; dependencies installed vianpm ci. - UX touches: added instant preview, progress states while embeddings compute, and a compact result grid that links to source data or shop items.
Challenges faced
- Capturing subjective style: the same outfit can read very differently by crop, lighting, or context, so curating examples and tuning similarity thresholds required several passes.
- Speed vs. quality: browser-friendly approaches keep latency low but can limit embedding richness; server-side models improve quality at the cost of latency and infra.
- Explainability: making matches feel interpretable required adding simple visual cues (dominant color, silhouette tag) rather than relying on opaque rankings.
Accomplishments that we're proud of
- A responsive, minimal UI that runs locally with HMR (npm run dev) so iteration is effortless.
- A small test suite (npm run test) and linting to keep the codebase tidy.
- A modular component structure ready for plugging in different embedding models, adding color/silhouette filters, or scaling with a vector DB.
What We learned
- How to build a modern frontend scaffolded with Vite and TypeScript, and integrate small ML/embedding workflows into a web app.
- Practical details of developer ergonomics: configuring
vite, Tailwind integration, and fast feedback loops with HMR. - Basics of image similarity: converting images to vector embeddings, and using distance metrics for ranking. For two vectors $u,v\in\mathbb{R}^d$ I used cosine similarity:
$$ s(u,v)=\frac{u\cdot v}{|u||v|} $$
which emphasises directional similarity (the “mood”) more than absolute scale.
- UX lessons: immediate visual feedback (previews, subtle loading states, clear result layout) makes the tool feel useful even as a prototype.
What's next for Style AI
- Add optional server-side embeddings and batch indexing for higher-fidelity matches.
- Introduce explainability badges (color, silhouette, texture) so users understand matches at a glance.
- Add user collections and simple comparison tools so people can save and compare styles over time.
- Experiment with a small vector DB (Faiss or similar) for fast nearest-neighbour search across larger catalogs.
Final note
This project is a small, focused playground for exploring visual style. It emphasises discovery and clarity over commerce
Built With
- but
- by
- cloud
- configured
- css-frontend-framework:-react-build-/-dev-tooling:-vite
- database
- default
- dev
- dev);
- embedding
- eslint-(linting)-files-/-config-present:-package.json
- external
- faiss
- hosted
- html
- included
- is
- javascript
- languages:-typescript
- locally
- ml
- no
- node.js
- not-built-in):-project-is-structured-to-accept-image-embedding-pipelines-or-vector-dbs-(e.g.
- npm
- npm-styling:-tailwind-css
- or
- platform
- postcss-ui-components:-shadcn-style-component-setup-(project-scaffold-uses-shadcn-patterns)-type-checking-&-config:-typescript-(tsconfig.json)-testing-&-linting:-vitest-(tests)
- run
- runs
- runtime:
- server
- service
- services)
- tailwind.config.ts
- tsconfig.json
- vite.config.ts
- vitest.config.ts-vector-/-ml-integration-(supported
Log in or sign up for Devpost to join the conversation.