← All sites

Design Lab / project

Allemanac

I own more graphic tees than I can remember owning. Half of them live in a drawer I never open. The idea was dumb and simple: photograph everything once, put it in a database, and let software do the "what goes with what" part. Then it got out of hand, in a good way.

allemanac.allemanit.com ↗ Private. Mine only.
Allemanac Today page: the daily edit with a generated try-on
The Today page. One outfit suggested from what is actually in the closet, and the latest try-on render next to it. That is me, and that is a real shirt I own, and I never put it on for the photo.

The idea

A closet is just an inventory with feelings.

Catalogue it

Every piece gets a photo, a type, a colour and a tag. Fifty-two items so far. Shoes count. Belts count.

Build an outfit

Pick pieces onto a rail, name the look, save it. A stylist note tells you what is missing. "Dress for: everyday" is a real dropdown.

Try it on

Stage the outfit against one of five fitted body references and let an image model put the clothes on me. Face, tattoos, pose all preserved.

The backend

Two processes, one private volume.

Python, standard library only, SQLite in WAL mode. The web process serves the UI and the API. A worker process watches for staged try-on jobs, claims one atomically, writes a provider-neutral work package to disk, calls the renderer, and marks the job ready or failed. Any job can be replayed by hand from that package.

The renderer is a swappable adapter. It shipped with an honest placeholder that just laid the body reference next to the garment photos. Now it calls an image model with the reference plus the garments and a prompt that is mostly rules: keep the face, keep the tattoos where the garment does not cover them, never crop a sleeve. If the model fails, the placeholder still renders and the job records why.

Auth is doubled on purpose. Authentik in front, and the app checks the identity header itself, so a request straight to the container port gets a 401 instead of my body references.

allemanac.allemanit.com     devzone, Caddy
  forward_auth -> Authentik
  -> allemanac-web  :8792   UI + API, identity re-checked
  -> allemanac-worker       try-on jobs

/data  (private volume, never in git)
  closet.db                 items, outfits, jobs
  catalog-media/            my photos of the clothes
  stock-media/              product refs, keyed by item id
  models/                   five fitted body references
  worker-queue/job-N.json   replayable work package
  tryon-results/job-N.png   the render

provider = gemini  (was: composite)
  body ref + garments + rules --> one image
  nightly: media mirrored to the NAS, models/ stays home

The fun part

Software for a drawer of t-shirts.

It has a magazine voice

"Dress with intent." "Own it. Style it. Wear it." The Today page reads like an editorial because a closet app that reads like a spreadsheet gets opened once. The tabs are sticky notes. There is a little cartoon of me.

The try-on started as a joke

Five body references, shot against a wall in my underwear, labelled front relaxed, front open, left profile. The first "renders" were a contact sheet. The first real one, with the model actually dressing me, was the moment it stopped being a joke.

Rotation is at zero percent

The dashboard tracks what I have actually worn. It says 0%. That number is the real reason the app exists, and it is going to be embarrassing for a while.

Got a collection, a shop, a thing that needs a real record?

Same shape as the diecast vault. This is the kind of build Quick IT does. Free 30-minute consult.

Start a project