Inspiration

Most people's closets are a black box. You own more clothes than you can hold in your head, you keep buying near-duplicates of things you forgot you owned, and the pieces that don't fit your life anymore just sit there — not quite worth selling, not quite worth the guilt of throwing away. We wanted to build the thing that should have existed already: an app that actually knows your wardrobe, the way a good personal stylist would, and helps you use it, wear it down, and eventually let it go — instead of just photographing it once and forgetting about it.

We also wanted to push back on a specific bad pattern in "AI shopping" apps: recommending you buy more stuff you don't need. A stylist who's actually good at their job tells you what you're missing, not what's trending — and only suggests something new after actually looking at what's already in your closet.

What it does

Threadnest is one app for your whole closet's life cycle: catalog what you own, see AI-generated outfit picks for today or the week ahead, try garments on yourself virtually before you commit to them, chat with an AI styling assistant that reasons over your real wardrobe and a real marketplace (not generic web results), and when you're done with something, donate it to a real nearby center or sell it to another user — all from the same item record.

How we built it

The app is a React Native / Expo client (Expo SDK 57, React Native 0.86, Zustand for state) backed entirely by Supabase — Postgres, auth, storage, and edge functions — with Google Gemini doing the parts that need actual judgment rather than lookup tables.

The recommendation engine is the piece we're proudest of, and it's deliberately a hybrid, not a single model:

  • "Try this look" (today's outfit) is fully deterministic and runs on-device: build every valid top+bottom (or dress) combination from the closet, score each one, and return the best. Scoring blends occasion fit, a color-harmony heuristic drawn from seasonal color theory, and small completeness bonuses so a bare torso-only combo doesn't tie with a fully accessorized one:

score(outfit) = w₁·fit + w₂·harmony + w₃·jacket + w₄·shoes

This costs nothing and returns instantly, because a closet's per-category item pool is small enough that brute-forcing every combination is cheap.

  • "For you" picks are Gemini-driven, but the prompt going in is built by a deterministic closet-gap analyzer first — we compute what categories are empty or over-represented and hand Gemini a plain-language brief ("no items in Outerwear; wardrobe is almost entirely neutral") rather than just asking it to free-associate. It reuses the exact same fashion-assistant pipeline as the chat assistant instead of a parallel endpoint, so there's one closet-first → marketplace-first → web-search-last policy to maintain, not two.

  • Virtual try-on chains single-garment Gemini image edits — each result becomes the "person" photo for the next garment — so a full outfit try-on keeps the person's face and identity stable across multiple pieces instead of degrading with each edit.

  • Garment intake runs every photo through a cleanup pass (isolate the item, place it on a consistent canvas) and a parallel classification pass (color, warmth, water-resistance, subcategory, occasion-fit) so every item starts with real metadata instead of blank fields nobody fills in by hand.

Commerce runs through RevenueCat/StoreKit for subscriptions and try-on credit packs; donation matching hits the Google Places API for real nearby drop-off locations; sign-in supports Apple, Google, and passwordless email OTP.

Challenges we ran into

A lot of the real difficulty wasn't the AI — it was the unglamorous plumbing around it:

  • Cross-platform photo handling broke repeatedly. expo-image-manipulator and expo-file-system both crashed on web in different ways, and HEIC photos (the default iPhone format) can't be decoded in any browser at all — we ended up round-tripping HEIC files through Gemini once just to get a browser-decodable JPEG back, and switched web resizing to a direct canvas call instead of the native module.
  • Recommendation quality was genuinely hard to get right without over-engineering it. Our first outfit picker was closetItems.slice(0, 3) — no category awareness, so it would happily suggest two pairs of pants and no shirt. Getting from that to something that reliably composes a coherent outfit meant building real scoring, not just picking "smarter" defaults.
  • RevenueCat's product model has a sharp edge: a product can be fully attached to an Entitlement while never being attached to an Offering's Package — and the app only reads Offerings at runtime, so purchases silently failed with a misleading "no products registered" error until we found that specific missing link.
  • Deploys are not automatically in sync. Several migrations and edge functions landed in the repo via git pull but were never actually pushed to Supabase — both the dev and prod projects had schema that existed but wasn't recorded as applied, which needed a manual migration repair before deploys would even accept new changes.
  • App Store review is its own project. We were rejected twice on our first submission — once for insufficient review history as a new developer account (resolved by documenting the app thoroughly in App Review notes), once for a EULA link Apple wants in the public App Description, not just inside the app itself. Both are the kind of thing no amount of local testing catches.

What we learned

The biggest lesson was about where to spend AI, not whether to use it. Cheap, deterministic rules (occasion scoring, color harmony, weekly planning) handle the parts of styling that are genuinely just arithmetic, and we reserve real model calls for the parts that actually need judgment — recognizing a specific garment, reasoning about a specific person's proportions, noticing what a closet is missing. That split kept the app fast and cheap to run instead of routing every interaction through an LLM by default.

We also learned that shipping to the App Store is a second, separate engineering project from building the app — compliance details (EULA placement, sign-in parity between providers, UGC moderation reachable from a chat thread and not just a listing) aren't things you discover by using your own app; they're things a reviewer's checklist surfaces, one rejection at a time.

Built With

Share this project:

Updates

Submission history