Inspiration

Gautham's phone wouldn't stop buzzing during a CS assignment. His sister Maya was going off in the group chat - sending fits, asking if things worked, trying to figure out what to wear before the weekend. The indecision itself wasn't what got us. It was the structure of the problem. Maya and her friends spend hours getting inspired on social media, but the moment that actually matters — "does this go with what I own, is this actually worth buying" — they're completely on their own. Nobody's there. The most important moment in the whole fashion journey is somehow the loneliest one. Fashion is social, like deeply social. What people wear is shaped by what their friends wear, what gets reactions, who they look up to. But the apps that handle inspiration (Instagram, TikTok) are completely disconnected from the apps that handle buying stuff (Amazon, ASOS), and both are disconnected from what you actually own. Nobody's closed that loop.

That's the product. Fits brings the social validation layer into the moment that matters: you're staring at your closet, building a fit, and you genuinely don't know if it works.

The market is real too. Digital fashion is a $950B category growing at 10% annually. The infrastructure for social commerce already exists. What's been missing is the right behavior primitive, something that connects what you already own, what your community wears, and the moment you need to make a decision. That's what we set out to build.


What It Does

Fits is an iOS app that turns your physical wardrobe into a living social closet. The core observation: social apps show outfits, shopping apps sell clothes. Fits connects the two through what you already own. The closet. You photograph a clothing item. On-device VisionKit (VNGenerateForegroundInstanceMaskRequest) removes the background in ~200ms. No third-party API, no data leaving the device. A clean cutout PNG lands in your digital closet, automatically organized by category. We also run a CoreImage HSV-based skin tone pass after the first VisionKit mask to strip out any hands or arms that got included in the cutout, then run the VisionKit pass a second time on the filtered result to catch residual artifacts. The whole pipeline is on-device and fast enough to feel instant. The outfit builder. A slot-based interface with one carousel per category: tops, bottoms, outerwear, shoes, accessories. You assemble a look, set an occasion, and publish to your social feed. The publishing step is intentional. It creates a moment of commitment and invites real feedback from people who actually know your style. The Hot Score. When you switch into Try-On mode, you dress a mannequin avatar with items from your closet. Fits sends the assembled outfit to K2 Think V2 for multi-step style reasoning. K2 evaluates the look across four dimensions: category completeness (does this actually constitute a full look?), color cohesion (are the pieces in compatible color families?), style signal consistency (are the silhouettes and formality levels aligned?), and occasion fit (does a crewneck and cargo pant actually work for a gala?). This is genuinely non-trivial reasoning. A black tee and white sneakers can score a 90 or a 30 depending on what sits between them, what occasion is set, what the rest of the palette looks like. K2 holds the full outfit context and reasons across all of it simultaneously, not a lookup table, not a rules engine. The result displays live on the avatar: a flame icon and percentage if the outfit lands, a trash icon if it doesn't. The social feed. Outfits appear as full-screen cards showing the actual cutout items. Three interactions: dislike, like, or Steal This Fit. That last one is the mechanic that makes the product social — one tap copies every item in the outfit directly to your wishlist. Discovery and purchase intent in the same gesture. You can also load any outfit from the feed onto your own avatar and have K2 re-score it against your style and your occasion.


How We Built It

We picked one loop and made it work completely: photograph item, build outfit, publish, get feedback, steal fits you like. Everything outside that loop got cut. Frontend. SwiftUI throughout (iOS 17+ minimum), using the @Observable macro for reactive state across all view models. The feed is a LazyVStack with .viewAligned snap scrolling and a GeometryReader-driven card height so nothing gets clipped on smaller devices. The outfit builder uses a slot-based carousel model layered over a custom mannequin shape for the try-on view. On-device AI pipeline. VNGenerateForegroundInstanceMaskRequest handles foreground extraction. The output runs through a CoreImage pixel buffer pass that identifies and zeroes out skin-tone pixels using an HSV hue-saturation-value band check, with a dilation step to catch the anti-aliased fringe at skin-clothing boundaries. Then the VisionKit pass runs a second time on the already-processed image to clean up any white or gray artifacts that survived the skin filter. The whole thing is on-device: no API cost, no latency, no image data leaving the user's phone. Outfit reasoning with K2. The assembled outfit (item categories, color information, and the occasion tag) is sent to K2 Think V2 via the IFM API. We chose K2 specifically because outfit evaluation requires holding context across multiple items and their interactions at once. A smaller model or rules-based classifier would handle each item in isolation. K2 reasons about the relationships between them, which is what actually determines whether a look works. Backend. Supabase for authentication, Postgres for the social graph (follows, reactions, feed), and Supabase Storage for outfit assets. The data model and RLS policies are built and tested. The demo runs on MockStore and flipping to live Supabase is a single-file swap.


Challenges

The cold start problem. A social app with no users is useless, and you can't fake your way past it with dummy data. Judges and users both see through it immediately. Our answer was to make the single-player experience genuinely valuable before the network exists. The closet builder, the avatar try-on, and K2 scoring all work without a single follower. Social adds on top of something already useful rather than being the whole point. This shaped basically every product decision we made: if a feature only made sense with an active network, it got cut. Skin versus clothing in the cutout pipeline. VisionKit's foreground mask is built to isolate people, so it keeps hands, arms, and legs attached to the garment. A shirt photographed on someone comes out with the person's arms intact. We built a CoreImage HSV skin-tone filter on top of the VisionKit output, using a dilated pixel removal pass to handle the soft boundary between skin and fabric. Then we run the full VisionKit pass again on the filtered result to clean up any fringe the skin filter left behind. Getting this reliable on real clothing photos in real lighting took most of the first night. Making the feedback signal mean something. Swipe rates are noise. A bunch of people tapping "hot" on a fit doesn't tell you whether it actually works, it just tells you it got attention. We tied the Hot Score to K2 reasoning over the actual outfit composition rather than aggregating raw interactions. The feedback a user sees reflects judgment about their specific combination of items and occasion, not just popularity. That's what makes it useful rather than just addictive.


Accomplishments

Getting a full social feedback loop working in 36 hours is harder than it sounds. Post, distribute, react, loop back — every piece has to be there before any piece is useful. We shipped the whole thing. The on-device background removal pipeline works on real clothing photos, including ones taken in messy lighting on patterned backgrounds. No API dependency, no per-use cost, no privacy surface. The cutout step completes on-device before any data touches a server. And honestly the thing we're most proud of is that the app is just immediately intuitive. We didn't have to explain it to anyone who tried it. Photograph a shirt, it appears in your closet, build an outfit, publish it, swipe through friends' fits, steal what you like. The mental model people already have for their wardrobe maps directly to how the app works. That's genuinely hard to design for and we kind of nailed it.


What We Learned

Maya didn't need more outfit inspiration. She had TikTok and Instagram for that and she was on them constantly. What she needed was validation at the moment of decision — someone to say "yeah that works" or "not with those shoes." Reframing the product from inspiration tool to decision tool changed how we thought about every single feature and what we ended up cutting. Core loop depth beats feature breadth every time too. Every hour we spent tightening the photograph-to-closet pipeline or getting the K2 scoring to feel instant was worth more than any extra tab we could've added. A tight loop that works completely is way more compelling than a broad one that mostly works. The last thing is harder to put into words. Social products are behavior design, not engineering. "Steal This Fit" could have been a save, a like, a share. The specific framing — steal, copy the whole outfit — is what makes it feel social rather than transactional. The engineering behind it is genuinely trivial. The behavior it creates is the whole point. We probably spent two hours debating that label and it was two hours well spent.


What's Next

36 more hours and we'd ship three things. K2-powered outfit generation. Right now K2 scores what you build. Next is K2 generating outfits from your actual closet. You describe a vibe or occasion in plain language, something like "rooftop dinner, not trying too hard," and K2 reasons through your items, pulls a complete look, and explains why each piece was chosen. This is where the 70B reasoning model actually earns its keep. It's not retrieval from your wardrobe, it's judgment about what from your specific closet works for your specific occasion. No smaller model handles that well. Live Supabase integration. The social graph, reactions, follows, and feed are all built and modeled but running against MockStore. Turning on the live Supabase layer (with RLS policies already designed) unlocks the real network effect. "Steal This Fit" becomes a behavioral signal that feeds recommendation logic: items stolen frequently by people with high Hot Scores rise to the top of discovery. K2 trend analysis across the network. At scale, Fits observes what item combinations get stolen most and by whom. K2 reasoning over that graph produces a trend signal no brand has access to today. Not what people browse, not what people click — what people who actually dress well are wearing together. That data has real value to retailers and brands and it's a natural second revenue layer.

Built With

Share this project:

Updates