tandpfun/wardrobe: an AI closet builder that runs on your own machine
Your clothes, extracted and organized with gpt-image.
At a glance
- What is it?
- Wardrobe is a local-first React app that uses OpenAI models to cut garments out of photos and generate modeled previews. It is aimed at people who want a searchable image library of their clothes and are willing to supply an API key and a reference photo of themselves.
- Who is it for?
- Adopt Wardrobe if you already have an OpenAI API key, run Node 22 or newer, and want your garment photos to stay in a local data/ directory rather than a hosted service. Skip it if you need multi-user accounts, a hosted backend, or a workflow that does not depend on OpenAI models, since the importer stays disabled without OPENAI_API_KEY and the reference photo.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 64 days ago.
- What is it written in?
- Mainly JavaScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 17, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
What Wardrobe solves, and who it is actually for
Most people photograph their clothes and end up with a camera roll full of hangers, changing-room mirrors and bedroom floors. Wardrobe takes those photos and turns them into two kinds of image: a clean product cutout of each individual garment, and an optional modeled preview that places the item on a reference photo of you. The result is a browsable gallery rather than a folder of originals.
The intended user is someone technical enough to clone a repository, run npm install and manage an OpenAI API key. The README describes the project as local-first, and the package.json description calls it "a local-first AI wardrobe gallery powered by OpenAI." That framing matters more than the feature list: originals, jobs, generated images and the JSON database all live under data/ on your machine, and the only external service is OpenAI. If you want a phone app that syncs across devices, this is not that.
How the extraction and modeling pipeline is put together
The application is a Vite front end with React 19, plus sharp and ipx in the dependency list, which is consistent with server-side image handling rather than pure browser processing. Garment detection is described in the README as using the OpenAI Responses API, and cutout generation as using the OpenAI Images API. Those are two separate calls with different jobs: one decides what is in the photo, the other produces the extracted product image.
The data flow is file-based. Imported assets land in data/imported/, the library index is written to data/library.json, and the model reference photo is read from data/model-reference.png by default. Environment variables control the rest: OPENAI_VISION_MODEL defaults to gpt-5.4-mini, OPENAI_IMAGE_MODEL defaults to gpt-image-2, OPENAI_IMAGE_QUALITY defaults to high, and WARDROBE_DATA_DIR defaults to data.
The README also ships two Codex skills under .agents/skills/. The import skill reviews every cutout and modeled photo before writing to disk, and the outfit skill asks how many looks to create, then curates and generates them. That review step is the interesting design choice: generation is not trusted blindly, and a human or agent is expected to approve before the library is updated.
Installing Wardrobe and running your first import
The README gives a four-command quick start. Node 22 or newer is required according to the badge in the README and the package.json engines expectation, so check your version first.
git clone https://github.com/tandpfun/wardrobe.git
cd wardrobe
npm install
cp .env.example .env
npm run devAfter npm run dev, Vite serves the app on port 5173, and the README points you at http://localhost:5173. You will see the gallery view, but the importer will not work yet.
The README is explicit about this: the importer stays disabled until you add OPENAI_API_KEY to .env and place a PNG reference photo of yourself at data/model-reference.png. The .env.example file lists the variables you can set.
OPENAI_API_KEY=
OPENAI_VISION_MODEL=gpt-5.4-mini
OPENAI_IMAGE_MODEL=gpt-image-2
OPENAI_IMAGE_QUALITY=high
WARDROBE_MODEL_REFERENCE=data/model-reference.pngIf you prefer to drive the import from Codex rather than the web UI, open the cloned repository in Codex and run the bundled prompt. The README shows the exact wording.
$import-clothes Import the clothes from ~/Pictures/outfits, create modeled photos, and add them to this wardrobe.
$generate-outfits Create modeled outfit ideas from my wardrobe.According to the README, the import skill asks for a local model-reference PNG when it needs one, reviews every cutout and modeled photo, then writes to data/library.json and data/imported/. The outfit skill asks how many looks to create, then saves the collection under data/.
Where Wardrobe breaks down: API dependency and missing documentation
The first hard constraint is that nothing works without OpenAI. Detection, cutout generation and modeled previews all route through OpenAI APIs, so an expired key, a rate limit or a model that is unavailable on your account stops the import entirely. The README does not describe a fallback path or a local model option.
The second constraint is the reference photo. Modeled previews need a PNG of you at data/model-reference.png, or another local file pointed to by WARDROBE_MODEL_REFERENCE. Anyone who does not want their own photo fed through an image model has no modeled output, only cutouts.
The third is documentation depth. The README covers setup and the two Codex skills, but it does not document rollback, what happens to data/library.json if an import is interrupted, or how to recover a partially written batch. The repository does include CONTRIBUTING.md and a .github directory, so contribution paths exist, but operational recovery is not described in the README. Treat data/library.json as the thing to back up before a large import.
Finally, the repository is private in package.json ("private": true) and has no published npm package. You run it from a clone. That is a reasonable choice for a local tool, but it means there is no versioned release artifact to pin.
How Wardrobe differs from Immich and other photo managers
The closest comparison is a self-hosted photo manager such as Immich. Immich is built around storing and browsing a large photo library, with face recognition and albums, and it expects a server deployment with a database. Wardrobe does something narrower: it treats each photo as a source of garments, extracts them individually, and maintains a JSON file as the index.
The practical difference shows up in what you get back. Immich would keep your outfit photo as one asset and perhaps tag it. Wardrobe splits it into separate garment entries with their own cutouts, which is what makes an outfit generator possible at all. The trade-off is that Wardrobe has no multi-user model, no mobile client, and no database, so it does not scale to a household library the way Immich does. If your goal is organizing thousands of family photos, Immich is the right shape. If your goal is a structured closet you can generate looks from, Wardrobe is.
Maintenance, licence and what an upgrade actually costs
The repository is not archived, and the last push was on 2026-07-16. The licence is MIT, declared in both the README badge and the LICENSE file, which permits use, modification and redistribution provided the copyright notice and permission notice are retained. That is a permissive licence, but it says nothing about the OpenAI terms that govern the API calls the app makes; those are separate and worth reading on your own.
Upgrade cost is low in one sense and open-ended in another. There is no release channel, so updating means pulling from main and rerunning npm install. The dependencies are pinned to specific versions in package.json, including react 19.2.0, vite 6.4.3 and @vitejs/plugin-react 5.0.4, so a pull can move several of them at once. The open-ended part is that model names are configuration, not code: OPENAI_VISION_MODEL and OPENAI_IMAGE_MODEL default to gpt-5.4-mini and gpt-image-2, and if those models are retired you will be editing .env rather than waiting for a patch. No migration tooling for data/library.json is documented.
Editorial conclusion
Adopt Wardrobe if you already have an OpenAI API key, run Node 22 or newer, and want your garment photos to stay in a local data/ directory rather than a hosted service. Skip it if you need multi-user accounts, a hosted backend, or a workflow that does not depend on OpenAI models, since the importer stays disabled without OPENAI_API_KEY and the reference photo. Before committing, verify that your OpenAI account has access to the models named in .env.example, because the README does not document fallbacks when a model is unavailable.
Frequently asked questions
How do I install Wardrobe?
Clone the repository, run npm install, copy .env.example to .env, and start it with npm run dev. The README requires Node 22 or newer and serves the app on localhost:5173.
How do I use Wardrobe?
Add OPENAI_API_KEY to .env and place a PNG reference photo at data/model-reference.png, then import through the web UI or by running the $import-clothes prompt in Codex. The importer stays disabled until both the key and the reference photo are in place.
Does Wardrobe need an OpenAI API key to work?
Yes. The README states the importer stays disabled until OPENAI_API_KEY is added to .env, and garment detection, cutouts and modeled previews all go through OpenAI APIs.
Where does Wardrobe store my clothes and images?
Locally. Originals, jobs, generated images and the JSON database live under data/, with imported assets in data/imported/ and the library index in data/library.json. The directory is configurable through WARDROBE_DATA_DIR.
Can Wardrobe generate outfit ideas from my wardrobe?
Yes. The repository includes a second Codex skill that the README invokes with the $generate-outfits prompt. It asks how many looks to create, then curates, generates, verifies and saves the collection under data/.
Community notes