Sign inSign up

lazztech/libre-closet

By lazztech

•Updated about 17 hours ago

Image
0

4.3K

lazztech/libre-closet repository overview

⁠Libre Closet

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.

License: AGPL-3.0 Version GHCR Pulls Docker Pulls Join the Discussion

Crafted and engineered with care and intention by Lazztech LLC⁠ 🖤


⁠Significant News

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.

⁠Release
  • v0.6.0 - October 5, 2026: Weather forecast info for outfit scheduling, Danish language support, and bug fixes
  • v0.5.1 - September 10, 2026: Save confirmations, Camera option for garment photo upload, and outfit builder fix
  • v0.5.0 - June 26, 2026: Added garment color combination support, washing details, acquisition date, archival, and cloning
  • v0.4.1 - June 15, 2026: Fixed disable register functionality
  • v0.4.0 - June 13, 2026: Added wardrobe sharing from one user to another with either view only or edit permissions

For full details refer to the CHANGELOG⁠.


⁠Quick start

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.


⁠Screenshots

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 gridOutfitsOutfit ScheduleOutfit
Wardrobe (Desktop)Outfits (Desktop)Outfit Schedule (Desktop)Outfit Builder (Desktop)
Wardrobe gridOutfitsOutfit ScheduleOutfit detail

⁠Features

  • Garment catalog - name, category, brand, size, colors, notes, photo
  • Customizable categories - custom category support with filtering and input suggestion as you type
  • Outfit builder - combine garments into saved looks with the Clueless inspired outfit builder
  • Outfit Scheduling - schedule out multiple outfits for given days through the week and get a view of what you've worn
  • Weather Forecasting - see weather forecasts while scheduling outfits for your important upcoming days
  • Image Background Removal - Images automatically have their backgrounds removed and optimized WebP upon upload
  • Offline-ready PWA - install to home screen, works without internet
  • Optional auth - run open for personal use or enable JWT accounts for multi-user
  • S3 or local storage - local disk by default, swap to any S3-compatible provider
  • SQLite or PostgreSQL - SQLite by default, PostgreSQL for scale
  • Multi-language - UI available in English, Italian, French, Russian, German, Spanish, and Danish
⁠Performance

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⁠.

MetricBeforeAfterChange
Requests/sec1,188.102,091.64+76.05%
Latency avg7.90 ms4.24 ms–46.33%
Latency p507.00 ms4.00 ms–42.86%
Latency p9918.00 ms11.00 ms–38.89%
Throughput26.39 MB/sec44.30 MB/sec+67.87%

⁠Self-hosting

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
⁠docker-compose
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:
⁠Build from source
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

⁠Configuration

.env contains committed defaults. Override any value via a .env.local file (gitignored) or by passing real environment variables to Docker.

VariableDescriptionDefaultExample
APP_NAMEDisplay name shown in the UI and navbarLibre ClosetMy awesome Closet manager
DATA_PATHDirectory for SQLite DB and uploaded files./data./libre-closet-data
AUTH_ENABLEDEnable JWT user accounts and loginfalsetrue
DISABLE_REGISTRATIONDisallows user sign ups when truefalsetrue
PWA_ENABLEDEnable service worker and PWA install promptfalsetrue
SUPPORTER_PROMPT_ENABLEDShow the "support the project" nudge modaltruefalse
WEATHER_CACHE_TTL_MSHow long Open-Meteo forecasts are cached (ms)18000003600000
ACCESS_TOKEN_SECRETJWT signing secret - change for productionChangeMe!u9n8c2y847rfctb23468tcb689f243
DATABASE_TYPEsqlite or postgressqlitepostgres
DATABASE_HOSTPostgres host-192.168.10.5
DATABASE_PORTPostgres port54329867
DATABASE_USERPostgres user-postgres
DATABASE_PASSPostgres password-7yfhcn2349cr32f
DATABASE_SCHEMAPostgres schemapostgreslibre-closet-schema
DATABASE_SSLUse SSL for Postgresfalsetrue
FILE_STORAGE_TYPElocal or object (S3)localobject
OBJECT_STORAGE_ACCESS_KEY_IDS3 access key-AKIAIOSFODNN7EXAMPLE
OBJECT_STORAGE_SECRET_ACCESS_KEYS3 secret key-wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
OBJECT_STORAGE_ENDPOINTS3-compatible endpoint URL-https://s3.example.com:8443
OBJECT_STORAGE_REGIONS3 regionus-east-1us-west-1
OBJECT_STORAGE_BUCKET_NAMES3 bucket namelibre-closetmy-awesome-closet-manager-bucket
EMAIL_FROM_ADDRESSFrom address for password reset emails-[email protected]
EMAIL_TRANSPORTgmail or mailgungmailmailgun
EMAIL_API_KEYMailgun API key-fyhn2437cryb248cbrdc32
PUBLIC_VAPID_KEYWeb push - generate for production-BEl62iUYgUivxIkv69yViEuiBIa-Ib9-SkvMeAtA3LFgDzkrxZJjSgSnfckjBJuBkr3qBUYIHBQFLXYp5Nksh8U
PRIVATE_VAPID_KEYWeb push - generate for production-UUxI4O8-FbRouAevSmBQ6o18hgE4nSG3qwvJTfKc-ls

Generate JWT secret:

openssl rand -base64 60

Generate VAPID keys:

npx web-push generate-vapid-keys

⁠Development

⁠Prerequisites
  • Node (see .nvmrc) - install via nvm⁠
  • Docker (optional, for Postgres testing)
nvm install && nvm use
npm install
cp .env .env.local     # override defaults locally (gitignored)
npm run start:dev
⁠Scripts
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)
⁠Migrations
# 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
⁠Docker build
# 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

⁠Deployment recommendations

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.


⁠Contributing

PRs and issues are welcome. This project is licensed under AGPL-3.0 - contributions must be compatible with that license.


⁠License

GNU AGPL-3.0⁠


⁠Star History

Star History Chart

Tag summary

Content type

Image

Digest

sha256:65d1e30ca…

Size

1000.8 MB

Last updated

about 17 hours ago

docker pull lazztech/libre-closet