-
-
Closetize catalogs what you own, then builds outfits from it — sized to today's weather and your own taste.
-
Outfits — built from the clothes you actually own, filtered by the live forecast and the occasion you pick.
-
Receipt import — forward a retailer confirmation email and the whole order files itself: brand, size, price, image.
-
Wardrobe — one photo per item; background removed, named, categorized and color-tagged automatically.
-
Style DNA — the app reads your wardrobe and says your taste back to you in plain language you can correct.
-
Journal — a month grid of what you actually wore, so you find out which half of the closet never leaves the hanger.
-
Closetize Pro — $9.99/month or $34.99/year with a 7-day free trial. Apple in-app purchase, powered by RevenueCat.
-
Home — pick an occasion, describe your plans, tap Get Outfits. Every outfit is a collage of your own garments.
-
Outfit detail — swap any piece; 'Why this works' explains the choice against today's forecast in plain language.
-
Swap sheet — ranked replacements for one item from your own wardrobe; the swap applies once the sheet closes.
-
Home rail — Wear, Plan and Save in one bar; pill states change in place. No stock photos, just your clothes.
-
Closetize app icon (1024×1024).
Inspiration
I own plenty of clothes and wear about eight of them. Every morning I'd stand in front of a full closet, run out of patience in four seconds, and reach for the same jeans and the same grey tee. A closet is a database nobody indexed.
The second reason matters more to me. I'm a mechanical engineer. I've spent ten-plus years in hardware manufacturing and new product development — tooling, vendors, failure analysis, quality systems — and almost none writing software. So Closetize is also an experiment with a hypothesis I can state plainly:
With coding agents in the toolbox, can a hardware NPD engineer ship a real, product-grade piece of software?
Toy projects can't answer that, because they let you skip auth, migrations, cost, App Store review, and users filing real bugs. So I picked a problem I actually had and made shipping it to the App Store the constraint that kept me honest.
What it does
Photograph a garment and Closetize removes the background, identifies it, and files it — category, color, formality, seasonality. Or forward a retailer confirmation email and the whole order catalogs itself, brand and size and price included.
Once your closet is in there, it generates outfits from clothes you actually own, filtered by the live forecast where you are and the occasion you pick. It writes your Style DNA back to you in plain language so you can correct it, and it logs what you wear, so you finally find out which half of your wardrobe never leaves the hanger.
The combinatorics are deceptively friendly — 40 tops, 25 bottoms, 15 pairs of shoes gives
$$|T| \times |B| \times |S| = 40 \times 25 \times 15 = 15{,}000$$
candidate outfits. Enumeration is trivial. The whole product is the ranking function, and taste is far harder to specify than a JOIN.
How I built it
Expo (React Native) + TypeScript on the front, Supabase (Postgres, Auth, Edge Functions) on the back. Gemini 3.1 Flash Lite does the vision work (identify the garment, its category, color, formality, seasonality) and the text work (compose and justify the outfit). fal.ai handles background removal and upscaling, Cloudinary stores and transforms, Apple WeatherKit supplies the forecast that makes a recommendation wearable at 7am.
Today that's ~73,000 lines of product TypeScript across 271 files (156,000 counting tests and tooling), 13 Edge Functions, 87 migrations, 31 screens, 48 end-to-end flows, and 2,560 commits since January. Solo.
That volume isn't hand-written, and it was never going to be. I run a modified version of Geoffrey Huntley's Ralph Wiggum loop — an autonomous agent that reads a PRD, picks the highest-priority unfinished story, explores the surrounding code, implements it, runs typecheck, Jest, and 48 Maestro end-to-end flows, then commits. I adapted it to Claude and added what it was missing for my purposes: a hard audit gate where the loop stops and waits for a human, and specialized agents that plan, implement, review, and audit as separate roles rather than one agent grading its own homework.
How it makes money
Closetize is free with a daily limit on outfit ideas. Closetize Pro removes the limit and adds wardrobe insights and Style DNA refreshes, as an auto-renewing subscription: $9.99 a month, or $34.99 a year with a 7-day free trial. The subscriptions are Apple in-app purchases, wired through RevenueCat: the app asks RevenueCat what the customer is entitled to, a RevenueCat webhook mirrors every purchase, renewal and cancellation into Postgres, and the Edge Functions enforce the free-tier limit server-side so the paywall can't be talked around. Deleting your account deletes the RevenueCat customer too.
It's not theoretical. Before submitting I bought Pro myself through Apple's sandbox on a real device — StoreKit sheet, trial started, entitlement unlocked, webhook row landed in the database. The plan is deliberately boring: one product, one price per period, no consumables, no ads. The free tier is generous enough to be useful every morning; Pro is for the person who wants the whole closet indexed and doesn't want to wait until tomorrow for more ideas.
What hardware taught me that carried over
I didn't come in with expectations either way — I approach every project as an engineer, so that lens was going to follow me regardless. What I found is that it needed almost no translating. Product development is product development; only the material changes.
Spec before build. The PRD is a drawing package. An ambiguous drawing gets you the wrong part from the vendor, and an ambiguous story gets you the wrong code from the agent — same root cause, same cost, six weeks earlier in one case and six hours in the other.
Design reviews are stage gates. The audit gate is a design review, and you don't release to tooling without one. Every PRD and pull request also gets an adversarial review from an OpenAI model alongside my Claude reviewers, explicitly prompted to find reasons not to ship. Different model, different failure modes — it has caught things my own reviewers waved through.
Run the DOE. A design of experiments — the tool I'd use to qualify a process on the manufacturing floor — is now mandatory here. Any change to an AI prompt, model, or output vocabulary has to clear one first: golden fixture, 3–5 arms including a control, three runs each at temperature 0, and a pass criterion written down before anyone sees results. A four-arm sweep is ~420 API calls, about $0.25. DOEs were always a pain to run, and the information always paid for itself:
$$C_{\text{experiment}} \ll C_{\text{regression}}$$
Root cause, not reported cause. This is the one that changed how I work. A bug report described a color-drift problem and confidently named its own mechanism. I designed the obvious fix, then measured first, grudgingly, out of process. The named mechanism occurred exactly once in 144 calls. My sensible-sounding fix would have shipped, passed review, looked correct, and moved nothing. That's a classic 8D finding — the complaint is a symptom, and the reported cause is usually a guess.
Challenges
The outfit engine, and what actually moved it. Cataloging clothes is a solved problem. Choosing between them is not, and the entire product lives there. Roughly 1,200 measured generation calls later, the lesson is narrower and more useful than "AI is hard": almost nothing I did to make the model smarter worked, and almost everything I did to change what it sees and how that information is packaged did.
Every failure was an attempt to buy intelligence. A bigger Gemini averaged 29.7 seconds and timed out on 26% of scenarios; turned down enough to be fast, its outfits got less varied — 84% down to 65%. Adding descriptive tags to every garment produced a median quality grade identical to the control, 93.75 either way. Then the idea my own research had ranked first: stop describing the clothes and show the model photographs of them. 198 generation calls and 504 judge calls later it came in at −0.28 against a required +0.5, with p95 latency 4.6× over the allowance I'd committed to beforehand. I graded 36 outfits blind, images against text, and wrote in the closeout: honestly I can't tell the difference between them.
Every win was packaging. Restructuring the prompt into tagged sections — a computed summary of the wardrobe, five weather tiers, an effective temperature adjusted for how warm the user runs — and demoting weather from advice to a hard constraint took a version that put more heavy garments in a 25°C outfit than a 5°C one to passing all eleven screens, on the same model. Enforcing the response shape with a schema instead of asking politely produced structural compliance at the token level and collapsed a fifty-line validator into an ID check. Giving every garment a layer role — base, mid, outer — let the rules reason about layering rather than infer it.
The biggest win wasn't clever at all. A filter meant to keep payloads small was quietly capping large wardrobes at fifty items, so on a real 160-item closet the model only ever saw 47 of them and put the same sneaker in 73 of 76 outfits. It looked like a taste problem for months. It was a visibility problem. Closets up to 350 items now go through whole.
Two more of the same shape: outfits were being built for the temperature at the instant you tapped the button rather than the warmest part of the day still ahead — anchoring on that took shorts-at-75°F from 33% to 100%. And the model's self-reported confidence came back as exactly 1.0 on 116 of 252 outfits, so ranking moved out of the model and into a deterministic grader.
The pipeline today is a single AI call. Code decides what it is allowed to see, whether each outfit it proposes is legal, and what order they are served in. The model is a stylist, not an architect — and getting that division right was the work.
What I learned, and where the hypothesis stands
That an agent will happily produce a plausible answer to a question you never verified was the right one. Every safeguard here is really a check on me: write the criterion before the results, make a second model argue against you, let the measurement decide.
The other lesson is architectural, and it's the one I'd hand to anyone starting out: don't let one model do everything. Claude writes the code; Codex audits it. A model reviewing its own output brings its own blind spots to the review and will defend the same assumption twice. Separating the roles across model families is the software version of not letting the machinist inspect his own parts.
The experiment cleared its last gate: Closetize is live on the App Store in the US, Canada, the UK, Australia and New Zealand, with a paid tier real people can buy. The hypothesis stands — a hardware NPD engineer with coding agents in the toolbox can ship product-grade software. What comes next is the part no lab can simulate: the telemetry is wired, the bugs are being filed by strangers, and the ranking function still has taste to learn.
Also: I'll never again say there's nothing to wear.
Built With
- claude
- cloudinary
- codex
- expo.io
- fal.ai
- gemini
- postgresql
- react-native
- revenuecat
- supabase
- typescript
- weatherkit
Log in or sign up for Devpost to join the conversation.