Skip to content
Labs · 03On-device AI

The tag that never phones home.

Drop a photo of a garment and it labels itself — and the photo never leaves your machine, because the model runs inside your browser. Privacy not as a promise in a policy, but as architecture: there is no server to send anything to. The page proves it while you use it, with a live network counter that stays at zero. Measured honestly on 59 real wardrobe photos: 85% top-1, 100% top-3, misses included below.

fashionSigLIP · int8 · 94 MB100% on-device · do not upload · cold wash

The model downloads once into your browser’s cache (94 MB — the price of privacy, paid on the first visit only). After that, classification happens on your machine and the network counter below stays at zero.

network requests since the model loaded— not armed yet

measured live with PerformanceObserver — every fetch, image or script this page makes after the weights arrive would count here. your photo stays on this line.

85%

top-1 accuracy on 59 raw wardrobe photos — real beds, real wrinkles, real light. The 95% interval is 73–92%, and every miss is published below

100%

top-3 accuracy: across the whole set, the right label never left the model's first three guesses. That's why the demo shows you three answers, not one

736 ms

median time to classify one photo in the browser, on plain CPU/WASM (p95: 907 ms). We measured WebGPU too: twice as slow for this int8 model — so the "fallback" won, and everyone gets the fast path

Where it failsall 9 misses of 59 · nothing hidden

The misses tell one coherent story: long sleeves drift towards “sweatshirt”, knits blur into fleece, and trousers photographed folded read as shorts — the framing, not the garment. Every wrong answer below was still in the model’s top 3.

photo labelled button-up shirt, misread as jacket
button-up shirt
→ “jacket 37%
photo labelled t-shirt, misread as sweatshirt
t-shirt
→ “sweatshirt 63%
photo labelled t-shirt, misread as sweatshirt
t-shirt
→ “sweatshirt 50%
photo labelled knitted sweater, misread as skirt
knitted sweater
→ “skirt 40%
photo labelled knitted sweater, misread as sweatshirt
knitted sweater
→ “sweatshirt 65%
photo labelled knitted sweater, misread as sweatshirt
knitted sweater
→ “sweatshirt 81%
photo labelled trousers, misread as shorts
trousers
→ “shorts 91%
photo labelled trousers, misread as shorts
trousers
→ “shorts 57%
photo labelled trousers, misread as shorts
trousers
→ “shorts 76%
What this is — and isn’t
  • Zero-shot, not trained on my wardrobe. fashionSigLIP compares your photo against 19 frozen text prompts (published in the repo). Change a prompt and the numbers change — which is why they’re version-locked before measuring.
  • A small, declared test set. 59photos, 16 of 19 classes covered; coats, dresses and vests had no photos — those cells of the table are honestly empty. Ten photos came from other people’s wardrobes and count in the metric, but only my own photos are shown on this page.
  • Quantized maths differ per backend. The same int8 model disagrees with itself on 5 of 59 photos between Node and the browser — so the published number is measured in the browser, the same runtime you just used.
  • The web sibling of WRDB. This is the browser counterpart of the on-device recognition I build into WRDB with Core ML — same conviction, different runtime: clothes are personal; their photos should stay yours.