A private, single-user digital wardrobe application to organize your closet, upload photos of your clothing items, and build outfits.
- 📸 Real Image Uploads: Upload photos directly from your device (JPG, PNG, WebP, max 8MB)
- 🖼️ Background Removal: Automatically removes image backgrounds on upload for cleaner cards
- 👕 Wardrobe Management: Add, edit, categorize, and delete clothing items
- 🏷️ Smart Tagging: Create custom tags and filter items (Casual, Work, Summer, etc.)
- 👗 Outfit Builder: Visually compose outfits by adding items and reordering them
- 🔍 Advanced Filtering: Search by name, filter by type, category, or tag
- 💾 Persistent Storage: SQLite database stores all your data permanently
Click the Run button in Replit, or manually:
npm run devThe app will start at http://0.0.0.0:5000
- Click "Add Item" button on the Wardrobe page
- Fill in the form:
- Name: e.g., "Vintage Denim Jacket"
- Type: Select from dropdown (TOP, BOTTOM, etc.)
- Category: e.g., "Jacket"
- Color: e.g., "Blue"
- Upload Image: Click "Choose File" and select a photo from your device
- Or paste an image URL in the "Image URL" field
- Or click one of the stock image thumbnails
- (Optional) Assign tags by clicking the "Select tags" dropdown
- Click "Save Item"
- ✅ Expected: You're redirected to the Wardrobe page and your item appears
- After adding an item, observe the Wardrobe grid
- Refresh the page (to test database persistence)
- ✅ Expected: Your item is still there with the image you uploaded
- Search: Type "jacket" in the search box
- ✅ Expected: Only items matching "jacket" appear
- Filter by Type: Select "TOP" from the Type dropdown
- ✅ Expected: Only tops are shown
- Filter by Tag:
- First, go to the "Tags" page and create a new tag (e.g., "Favorite")
- Go back to Wardrobe, edit an item, and assign the tag
- Use the Tag filter to show only items with that tag
- ✅ Expected: Only tagged items appear
- Clear filters to see all items again
- Click "Outfits" in the sidebar
- Enter an outfit name in the top input (e.g., "Weekend Casual")
- Browse your wardrobe on the right sidebar
- Click items to add them to your outfit canvas (center area)
- Use the ↑↓ arrows to reorder items in your outfit
- Click "Save Look"
- ✅ Expected: Toast notification confirms save
- Refresh the page
- ✅ Expected: Your outfit is still saved (check by clicking "Outfits")
- React 19 + TypeScript
- Vite for fast dev server and HMR
- Tailwind CSS v4 for styling
- Shadcn UI components
- Wouter for routing
- TanStack Query for data fetching
- Framer Motion for animations
- Node.js + Express
- TypeScript throughout
- Multer for multipart file uploads
- Prisma ORM for type-safe database queries
- SQLite for persistence
.
├── client/ # React frontend
│ ├── src/
│ │ ├── pages/ # Wardrobe, ItemDetail, OutfitBuilder, Tags
│ │ ├── components/ # Layout, UI components
│ │ └── lib/ # API client, types, utils
│ └── index.html
├── server/ # Express backend
│ ├── routes.ts # API endpoints
│ └── index.ts # Server entry point
├── prisma/ # Database schema and migrations
│ └── schema.prisma
├── uploads/ # User-uploaded images (served statically)
└── shared/ # Shared schemas/types (Zod)
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/health |
Health check |
GET |
/api/items |
List all items (supports ?search=, ?type=, ?tag=) |
GET |
/api/items/:id |
Get single item |
POST |
/api/items |
Create item (multipart/form-data for image upload) |
PUT |
/api/items/:id |
Update item |
DELETE |
/api/items/:id |
Delete item |
GET |
/api/tags |
List all tags |
POST |
/api/tags |
Create tag |
GET |
/api/outfits |
List all outfits |
POST |
/api/outfits |
Create outfit |
DELETE |
/api/outfits/:id |
Delete outfit |
POST |
/api/ai |
Generate AI response from prompt |
The UI follows a Modern Minimalist Boutique aesthetic:
- Fonts: Playfair Display (serif, headers) + DM Sans (sans-serif, body)
- Colors: Warm neutrals with terracotta accents
- Layout: Clean cards, generous whitespace, subtle shadows
model Item {
id String (uuid)
name String
type String // TOP, BOTTOM, OUTERWEAR, etc.
category String
color String
imageUrl String
notes String?
brand String?
// ... + tags relation
}
model Tag {
id String (uuid)
name String (unique)
}
model Outfit {
id String (uuid)
name String
notes String?
items OutfitItem[]
}
model OutfitItem {
outfitId String
itemId String
position Int // For ordering
}-
📊 Wear Tracking (OOTD)
- Log when you wear an item or outfit
- Calculate "Cost Per Wear" analytics
- Track most/least worn items
-
🤖 AI Features
- Auto-tagging: Detect colors and categories from uploaded images
- Duplicate Detection: Warn if you already own something similar
- Style Recommendations: Suggest outfit combinations
-
📅 Calendar Integration
- Plan outfits for specific dates/events
- Weather API integration for smart suggestions
-
☁️ Cloud Storage
- Migrate from local
/uploadsto AWS S3 - Enable multi-device access
- Migrate from local
-
📦 Data Portability
- Export wardrobe to CSV/JSON
- Import from spreadsheets
- Backup & restore
Images not uploading?
- Check file size (max 8MB)
- Ensure file type is JPG, PNG, or WebP
Database reset:
rm -rf prisma/migrations prisma/dev.db
npx prisma migrate dev --name init
npx tsx prisma/seed.tsMIT