APHRODITE
Your personal wardrobe
Username
Password
{{ loginError }}
{{ loginLoading ? 'Signing in…' : 'Sign In' }}
Wardrobe
+ Bulk Upload
+ Add Item
+ Add filter
{{ filterFieldLabel(f) }}
All filters added
Clear
{{ filterFieldLabel(af.field) }}
{{ filterValueLabel(af.field, af.value) }}
{{ filterFieldLabel(af.field) }}
{{ opt.label }}
✓
✕
No items yet — add your first piece!
← Wardrobe
Item #{{ detailItem.item_id }}
Edit
Calendar
Delete
Category
Brand
{{ detailItem.brand?.name || '—' }}
Price
{{ detailItem.price != null ? ('$' + Number(detailItem.price).toFixed(2)) : '—' }}
Tags
—
{{ t.name }}
Colors
—
{{ c.name }}
Note
{{ detailItem.note || '—' }}
Looks
+ New Look
No looks yet — create your first outfit!
Wears
+ Bulk Upload
+ Add Wear
All wear photos, newest first. Linked wears can jump to the original look.
No wear photos yet — add one from a look detail page.
← Looks
{{ lookLabel(detailLook) }}
{{ detailLook.is_staple ? 'Staple' : 'Not staple' }}
Edit
Calendar
Add Wear Photo
Delete
No image
No items in this look yet
Staple
{{ detailLook.is_staple ? 'Yes' : 'No' }}
Items
{{ detailLook.items?.length || 0 }}
Items in this look
{{ item.brand?.name || 'No brand' }}
${{ Number(item.price).toFixed(2) }}
{{ tag.name }}
Wear history
No wear photos yet
No image
{{ wearWhenLabel(wear) }}
{{ wear.note }}
Delete
Calendar
+ Add Entry
‹
Today
›
{{ calendarMonthLabel }}
{{ w }}
{{ day.dayNumber }}
+
{{ scheduleTimeLabel(entry) }}
{{ scheduleEntryLabel(entry) }}
✕
Rules
Reusable outfit shapes. Compose them into generations from the Generator tab.
New rule
No rules yet
A rule describes one outfit shape — a set of slots and cross-slot constraints. Generations pick from your rules and mix them together.
Create your first rule
Generator
Compose outfit recipes and preview fresh combinations from your wardrobe.
New generation
No recipes yet
Create a generation to describe the outfits you want the app to propose.
Create your first generation
{{ g.name }}
{{ (g.rules || []).filter(r => r.kind==='whitelist').length }} whitelist
{{ (g.rules || []).filter(r => r.kind==='blacklist').length }} blacklist
existing ok
← Generator
{{ activeGeneration.name }}
Edit recipe
Delete
{{ (activeGeneration.rules || []).filter(r => r.kind==='whitelist').length }} whitelist rules
{{ (activeGeneration.rules || []).filter(r => r.kind==='blacklist').length }} blacklist rules
{{ activeGeneration.recommend_existing_looks ? 'Existing matches allowed' : 'Existing matches hidden' }}
How many?
−
+
{{ generationRunning ? 'Generating…' : 'Generate outfits' }}
{{ generationError }}
Ready when you are
Click
Generate outfits
to preview candidates from your wardrobe.
Manage
{{ t.charAt(0).toUpperCase()+t.slice(1) }}
Colors
Used for filtering and item metadata.
Add
Save
Cancel
{{ c.name }}
Edit
Delete
No colors
Categories
Use top-level rows as groups; nest entries underneath for filtering.
Add Category
▾
{{ group.parent.name }}
Edit
Delete
Save
Cancel
Save
Cancel
{{ child.name }}
Edit
Delete
No nested categories yet
No categories
Brands
Optional metadata for items.
Add
Save
Cancel
{{ b.name }}
Edit
Delete
No brands
Tags
Multi-select labels for items.
Add
Save
Cancel
{{ t.name }}
Edit
Delete
No tags
Users
Admin-only create/update/delete.
Admin
Create User
{{ u.username }}
Active
Save
Cancel
{{ u.username }}
admin
inactive
Edit
Delete
No users
Preferences
Personal settings for how the app previews your looks.
Look preview mode
Preview mode
Auto
Composition
Auto uses your latest wear photo when available, otherwise it shows outfit composition.
Look picker density
Picker size
Comfortable
Compact
Comfortable uses a 3-column picker. Compact uses a denser 4-column picker.
Wardrobe
Looks
Wears
Calendar
Rules
Generator
Manage
Type
Look
Item
{{ scheduleForm.kind === 'look' ? 'Look' : 'Item' }}
{{ selectedScheduleLook ? lookLabel(selectedScheduleLook) : 'Choose a look' }}
Clear
{{ selectedScheduleItem ? itemLabel(selectedScheduleItem) : 'Choose an item' }}
Clear
Date & Time
Cancel
Save
Linked look
{{ selectedWearLook ? lookLabel(selectedWearLook) : 'No linked look' }}
Clear
Linked Items
{{ (wearForm.itemIds || []).length ? ((wearForm.itemIds || []).length + ' linked item' + ((wearForm.itemIds || []).length === 1 ? '' : 's')) : 'Pick Linked Items' }}
Clear
#{{ item.item_id }}
Note
Cancel
Save