-
-
Add a piece - Snap or pick a photo. FitMatch reads the image and fills in the details.
-
Wardrobe - Auto-tagged in seconds: colour, category, formality, material. Filter by top, bottom, outerwear, shoes.
-
Logo
-
Planner - "Ask FitMatch anything." A conversational planner that pulls outfits from what you already own. Voice or text.
-
Home - Today's outfit and a weather-aware plan, one tap from wardrobe or planner.
-
Compose - Pick pieces to anchor an outfit around. The planner builds a compatible look.
Inspiration
My closet is full but I still say "I have nothing to wear." Every wardrobe app on the market is a shopping funnel — they push you to buy more. I wanted the opposite: a private stylist that plans outfits from the clothes I already own, quietly and without judgment.
What it does
- Snap a photo of any piece — it's tagged (colour, category, formality, material) in seconds using vision AI. No manual data entry.
- Ask the planner in plain language ("Friday drinks, cold, work-adjacent") and get a real outfit back from your wardrobe, not a mood board.
- Voice input is one tap; the reply is spoken back if you want it to be.
- Save the looks that work to your lookbook. Revisit, tweak, wear again.
- Weather-aware plans, occasion presets (casual / work / formal / sport), and a week-long auto-plan for Pro users.
- Private by default — every photo lives in a user-scoped bucket. No feeds. No ads. No cross-user sharing.
How I built it
FitMatch is one Next.js codebase running on Cloudflare Workers, wrapped in a thin Expo WebView shell for the iOS and Android stores. The shell handles the things the web can't do well:
- Auth — Clerk on a custom domain, JWT-based session tokens flowing into the Cloudflare Worker
- Payments — RevenueCat + StoreKit / Play Billing for the $7.99/mo Pro plan, plus consumable credit packs
- Storage — Supabase Storage for the private wardrobe bucket (signed URLs, 10-min TTL)
- DB — Cloudflare D1 for the credit ledger + billing state; Supabase Postgres for wardrobe items and looks; Pinecone for style-tag vector similarity
- Vision — GPT-4o for tagging pieces, Whisper for voice input, ElevenLabs for TTS
- Push — OneSignal
- Analytics — PostHog (product analytics + session replay, off by default)
- Design system — three named Looks (Editorial, Studio, Vitrine) × light / dark, WCAG AA audited on every combination
Challenges I ran into
- The paywall took multiple review rounds with Apple, taught me exactly how strict App Store Review is: 3.1.1 (external subscription links), 3.1.2 (missing disclosures, bill-amount hierarchy), 5.1.1(v) (in-app account deletion), 2.1(b) (IAP not attached to submission), 2.1(a) (planner unresponsive when the wardrobe was empty). Every rejection surfaced a real product gap, not just a compliance one.
- Cross-origin native ↔ web bridge — the WebView shell talks to the Next.js app over postMessage. Getting RevenueCat's customerInfo to reliably reflect the true entitlement state — especially in sandbox, where StoreKit caches "already subscribed" responses — took several passes. The final fix syncs purchases + refreshes on the native side and polls billing with a cache-busted Clerk JWT on the web side.
- Design that doesn't feel generated — I studied Wise, TIDE, Notion and Linear on Mobbin and built three complete visual systems instead of shipping one templated default. All three share the same tokens; the differences are shape, spacing, and interaction.
What I learned
- Reading Apple's guidelines line-by-line beats guessing every time.
- A "quiet, editorial" look is the hardest kind to pull off — flat surfaces without decoration only work when contrast, spacing and type do all the heavy lifting.
- The most on-brand wardrobe photo isn't a fashion portrait. It's someone standing in front of their actual wardrobe.
What's next
- Continuous hands-free voice mode (hold-to-talk is shipped)
- Auto-plan a week's worth of outfits from a calendar feed
- Native Android push via a proper module (currently WebView-bridged)
- Body-shape suggestions and colour-analysis Pro add-on
Built With
- clerk
- cloudflare-d1
- cloudflare-kv
- cloudflare-workers
- elevenlabs
- expo.io
- gpt-4o
- next.js
- notion
- onesignal
- openai
- pinecone
- posthog
- react
- react-native
- revenuecat
- sentry
- storekit
- supabase
- supabase-storage
- tailwindcss
- typescript
- whisper

Log in or sign up for Devpost to join the conversation.