Products

Compresso

Make images lighter, without uploading them anywhere.

Role
Designer and engineer, end to end
Years
2025 to now
Team
Solo, open source
Status
Live, MIT licensed
N° 04 · The file

In one paragraph

Forms ask people to upload a photo “under 2 MB” and leave them to work out how. That processing is the system’s job, pushed onto the person. Compresso does it in the browser, offline, and never uploads the file.

Before. Red is people’s model; the grid is the system.

The distance

“Upload a photo under 2 MB.” The form knows what it needs. The person holding a 3 MB phone photo has no idea what a megabyte is, where to shrink it, or whether an app will keep a copy. My paper on document submission systems calls this externalised processing: work the system should do, handed to the user. Compresso is that paper turned into a tool.

The working

Three rules shaped every decision.

  1. Nothing leaves the device. Compression runs in the browser, across CPU cores with Web Workers, and keeps working offline once installed.
  2. Never return a bigger file. If compressing would grow an image, you get the original back. A regression test pins it.Receiptnever biggerOutput guaranteeMethodIf compression would grow a file, the original is returned. Pinned by a regression test.Sourcecompresso test suiteChecked
  3. The photograph is the only colour. The interface stays black and quiet so your image is the loudest thing on screen.

What shipped

An offline web app in 7 languagesReceipt7 languagesCompresso interface languagesMethodLocales shipped in the app.Sourcecompresso.izaias.xyzChecked that takes HEIC, JPEG, PNG, WebP and AVIF and batches up to 100 images,Receiptup to 100 imagesBatch sizeMethodMaximum batch in the app, processed across CPU cores.Sourcecompresso.izaias.xyzChecked and the library underneath it: compresso.js, zero required dependencies, 3.6 KB gzipped.Receipt3.6 KBcompresso.js, gzipped coreMethodGzipped size of the published library build.Sourcecompresso READMEChecked

Drag to compress

3.3 MBside 100% of the original · drawn to scale by area

One measured run: 3.3 MB to 93.5 KB. Not an average.

Receipts

  • 3.6 KB gzipped core.Receipt3.6 KBcompresso.js, gzipped coreMethodGzipped size of the published library build.Sourcecompresso READMEChecked
  • One measured run: 3.3 MB to 93.5 KB. One run, not an average.Receipt3.3 MB to 93.5 KBOne measured runMethodA single photo compressed once in the live app. One run, not an average.Sourcecompresso.izaias.xyz; résumé fact baseChecked
  • Never returns a bigger file, pinned by a regression test.Receiptnever biggerOutput guaranteeMethodIf compression would grow a file, the original is returned. Pinned by a regression test.Sourcecompresso test suiteChecked
  • MIT licensed. 7 languages.Receipt7 languagesCompresso interface languagesMethodLocales shipped in the app.Sourcecompresso.izaias.xyzChecked

Lessons paid for twice

  1. Publish the one run you measured, not the average you hope for.
  2. A guarantee is only real when a test fails without it.
  3. The best upload is the one that never happens.

Keyboard shortcuts

Single keys never fire while you type in a field.

?
Open or close this sheet
W
Show the working on case files
R
Switch plain and institutional wording
N
Night edition on or off
0
Wire mode: zero all colour
[
Previous case file or entry
]
Next case file or entry
Esc
Close any sheet or popover
Motion