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
Share this project:

Updates

Submission history