Your wardrobe. Your data.
The easiest to deploy and host free, open-source, self-hosted wardrobe organizer! Catalog your clothes, upload photos, build outfits, and access everything from your phone as an offline-ready PWA - all on your own server.
Crafted and engineered with care and intention by Lazztech LLC 🖤
v0.6.0 Weather Forcasting - October 5, 2026
You can see an overview of the weather forecast for your area when you're scheduling out your outfits. Want to know more about a specific important date? Tap on the weather preview label on the calendar day card and you'll see more detail about the weather forecast for that day!
v0.4.0 Wardrobe Sharing - June 13, 2026
You can now share your Libre Closet wardrobe with your friends, or for the stylists out there, you may now use this tool to manage your client's wardrobes!
To share your wardrobe, navigate to your profile (either through the hamburger menu on mobile, or the navbar on desktop), click on "Wardrobe Sharing", then click "Create Invite Link", copy the link and send it to your friend. Have them do the same if you would like to share both ways.
Or from the same wardrobe sharing page, if you would like grant someone else permissions to manage your wardrobe then select the permission drop down and choose "Can edit", copy the invite link, and send it to your stylist friends.
v0.6.0 - October 5, 2026: Weather forecast info for outfit scheduling, Danish language support, and bug fixesv0.5.1 - September 10, 2026: Save confirmations, Camera option for garment photo upload, and outfit builder fixv0.5.0 - June 26, 2026: Added garment color combination support, washing details, acquisition date, archival, and cloningv0.4.1 - June 15, 2026: Fixed disable register functionalityv0.4.0 - June 13, 2026: Added wardrobe sharing from one user to another with either view only or edit permissionsFor full details refer to the CHANGELOG.
docker run -d \
-p 3000:3000 \
-v librecloset_data:/app/data \
ghcr.io/lazztech/libre-closet
Open http://localhost:3000. No account required by default.
Want to try it without self-hosting? A public instance is running at https://librecloset.lazz.tech - register a free account to get started. No guest login exists, but registration is instant and requires no email verification.
Note, these screenshots are taken of the web application viewed as an installed standalone PWA. This tool may also be used like a traditional web app in the browser.
| Wardrobe (Mobile) | Outfits (Mobile) | Outfit Schedule (Mobile) | Outfit Builder (Mobile) |
|---|---|---|---|
![]() | ![]() | ![]() | ![]() |
| Wardrobe (Desktop) | Outfits (Desktop) | Outfit Schedule (Desktop) | Outfit Builder (Desktop) |
|---|---|---|---|
![]() | ![]() | ![]() | ![]() |
Libre Closet is now more performant, making more efficient use of your existing hardware!
We've refactored the server resulting in nearly a 2x throughput increase, almost half the latency, and the lighthouse speed score has gone from 68/100 to 99/100.
| Metric | Before | After | Change |
|---|---|---|---|
| Requests/sec | 1,188.10 | 2,091.64 | +76.05% |
| Latency avg | 7.90 ms | 4.24 ms | –46.33% |
| Latency p50 | 7.00 ms | 4.00 ms | –42.86% |
| Latency p99 | 18.00 ms | 11.00 ms | –38.89% |
| Throughput | 26.39 MB/sec | 44.30 MB/sec | +67.87% |
Libre Closet requires just one, easy to deploy and host docker container! It defaults to sqlite, and local filestorage so you don't need to worry about the headache of hosting and maintaining a postgres db and redis instance.
# SQLite + local storage (simplest)
docker run -d \
-p 3000:3000 \
-v librecloset_data:/app/data \
ghcr.io/lazztech/libre-closet
services:
libre-closet:
image: ghcr.io/lazztech/libre-closet
ports:
- '3000:3000'
volumes:
- librecloset_data:/app/data
environment:
AUTH_ENABLED: 'false'
PWA_ENABLED: 'true'
DATA_PATH: /app/data
restart: unless-stopped
volumes:
librecloset_data:
git clone https://github.com/lazztech/libre-closet
cd libre-closet
cp .env .env.local # override defaults locally (gitignored)
npm install
npm run start:prod
.env contains committed defaults. Override any value via a .env.local file (gitignored) or by passing real environment variables to Docker.
| Variable | Description | Default | Example |
|---|---|---|---|
APP_NAME | Display name shown in the UI and navbar | Libre Closet | My awesome Closet manager |
DATA_PATH | Directory for SQLite DB and uploaded files | ./data | ./libre-closet-data |
AUTH_ENABLED | Enable JWT user accounts and login | false | true |
DISABLE_REGISTRATION | Disallows user sign ups when true | false | true |
PWA_ENABLED | Enable service worker and PWA install prompt | false | true |
SUPPORTER_PROMPT_ENABLED | Show the "support the project" nudge modal | true | false |
WEATHER_CACHE_TTL_MS | How long Open-Meteo forecasts are cached (ms) | 1800000 | 3600000 |
ACCESS_TOKEN_SECRET | JWT signing secret - change for production | ChangeMe! | u9n8c2y847rfctb23468tcb689f243 |
DATABASE_TYPE | sqlite or postgres | sqlite | postgres |
DATABASE_HOST | Postgres host | - | 192.168.10.5 |
DATABASE_PORT | Postgres port | 5432 | 9867 |
DATABASE_USER | Postgres user | - | postgres |
DATABASE_PASS | Postgres password | - | 7yfhcn2349cr32f |
DATABASE_SCHEMA | Postgres schema | postgres | libre-closet-schema |
DATABASE_SSL | Use SSL for Postgres | false | true |
FILE_STORAGE_TYPE | local or object (S3) | local | object |
OBJECT_STORAGE_ACCESS_KEY_ID | S3 access key | - | AKIAIOSFODNN7EXAMPLE |
OBJECT_STORAGE_SECRET_ACCESS_KEY | S3 secret key | - | wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY |
OBJECT_STORAGE_ENDPOINT | S3-compatible endpoint URL | - | https://s3.example.com:8443 |
OBJECT_STORAGE_REGION | S3 region | us-east-1 | us-west-1 |
OBJECT_STORAGE_BUCKET_NAME | S3 bucket name | libre-closet | my-awesome-closet-manager-bucket |
EMAIL_FROM_ADDRESS | From address for password reset emails | - | [email protected] |
EMAIL_TRANSPORT | gmail or mailgun | gmail | mailgun |
EMAIL_API_KEY | Mailgun API key | - | fyhn2437cryb248cbrdc32 |
PUBLIC_VAPID_KEY | Web push - generate for production | - | BEl62iUYgUivxIkv69yViEuiBIa-Ib9-SkvMeAtA3LFgDzkrxZJjSgSnfckjBJuBkr3qBUYIHBQFLXYp5Nksh8U |
PRIVATE_VAPID_KEY | Web push - generate for production | - | UUxI4O8-FbRouAevSmBQ6o18hgE4nSG3qwvJTfKc-ls |
Generate JWT secret:
openssl rand -base64 60
Generate VAPID keys:
npx web-push generate-vapid-keys
.nvmrc) - install via nvmnvm install && nvm use
npm install
cp .env .env.local # override defaults locally (gitignored)
npm run start:dev
npm run start:dev # watch mode
npm run start:prod # production
npm run test # unit tests
npm run test:e2e # Playwright end-to-end
npm run test:cov # coverage
npm run precommit # lint + test + lighthouse (run before committing)
# SQLite (build first due to config differences)
npm run build
npx mikro-orm migration:create --config mikro-orm.sqlite.cli-config.ts
# PostgreSQL
npx mikro-orm migration:create --config mikro-orm.postgres.cli-config.ts
# Build image
docker build --no-cache -f docker/Dockerfile . -t libre-closet:latest
# Cross-compile for linux/amd64 (e.g. building on Apple Silicon for a VPS)
docker buildx build --platform linux/amd64 --no-cache -f docker/Dockerfile . -t libre-closet:latest
For most self-hosters: deploy to a VPS via Coolify or Portainer using the docker-compose above with SQLite + local storage. SQLite handles thousands of users without issue - see DjangoCon 2023: Use SQLite in Production.
If you need horizontal scaling later, switch to S3-compatible storage and add Litestream for streaming SQLite backups before considering a PostgreSQL migration.
PRs and issues are welcome. This project is licensed under AGPL-3.0 - contributions must be compatible with that license.
Content type
Image
Digest
sha256:65d1e30ca…
Size
1000.8 MB
Last updated
about 17 hours ago
docker pull lazztech/libre-closet