Compress, convert and resize images without uploading them. A Chrome extension that runs entirely on your device: no account, no server, no tracking.
Drop images into the toolbar popup, pick a format and a quality, and download the smaller files. Every conversion happens in your own browser, using Canvas plus small bundled WASM codecs, so your pictures never leave your computer. It also converts every image on a page, and takes full page screenshots.
Chrome Web Store: Cleanor: Image Compressor, Converter & Screenshots
Load unpacked (development or code review):
- Clone this repo.
- Open
chrome://extensionsand turn on Developer mode (top right). - Click Load unpacked and select the repo folder.
- Pin the Cleanor icon and click it. The optimizer opens as a popup, and Open larger ↗ moves it into a full tab. Alt+Shift+C opens that tab from anywhere.
Works in Chrome and in other Chromium browsers that support Manifest V3 (Edge, Brave, Opera, Vivaldi).
Drop, pick or paste images, then move the Quality slider (40 to 100). Each row shows the original size, the new size and the percentage saved, with a total for the whole batch. Change the format or the quality and the batch re-encodes on the spot.
- Lossy output: WebP, AVIF, JPEG.
- Lossless output: PNG (the quality slider hides itself, because PNG ignores it).
- Save one result, copy it to the clipboard as a PNG, or download the batch as a single
.zip.
Formats the extension reads: HEIC / HEIF (iPhone photos, via a bundled libheif build), AVIF, WebP, JPEG, PNG, GIF and BMP.
Formats it writes: WebP, AVIF, JPEG, PNG and PDF.
AVIF output comes from a bundled single thread WASM encoder (@jsquash/avif), because Chrome's Canvas cannot write AVIF. Everything else uses the browser's own encoder. HEIC is read only: you can open an iPhone photo, you cannot save one, which is the direction people actually need.
Type a number of KB into Target size and the extension searches for the quality instead of making you guess: 7 encodes, binary searched between quality 0.4 and 0.98, keeping the largest file that still fits under your limit. It applies to the lossy formats (WebP, AVIF, JPEG). PNG has no target field, because lossless encoding has no quality dial to turn.
Open Resize & crop:
- Resize: max width (with 4K, 1920, 1280 and 800 presets), fit within W×H, exact W×H, or scale by percent.
- Crop to aspect: 1:1, 4:3, 3:2, 16:9 or 9:16, taken from the centre.
Both are applied before encoding, so they stack with quality and with target size.
Right click a picture on any page and choose Convert image with Cleanor ▸ Save as WebP / AVIF / JPEG / PNG / PDF. When the extension already has access to that site, the service worker fetches, converts and downloads the file directly, without opening a window. Otherwise it opens the optimizer tab and asks for access to that one site first. Open in optimizer… always opens the tab.
Right click a page and open Cleanor Image Tools:
- Download all images on this page collects up to 100 images (from
<img>and<picture><source srcset>, across frames), fetches them and packs them into one.zip, naming each file by its real type even when the URL carries no extension. If nothing is fetchable, or the archive would pass 45 MB, it falls back to downloading the images one by one. - Convert all images on this page does the same, but re-encodes every image with your current settings first, into a single
.zip.
Also under Cleanor Image Tools, and in the popup's This page section:
- Visible area.
- Full page, captured by scrolling and stitching (up to 14 viewport slices), hiding fixed and sticky bars so headers do not repeat on every slice, and following inner scroll containers on app style layouts.
- Select region, drawn with the mouse.
Captures over 2.5 megapixels are saved as JPEG, smaller ones as PNG, named <site>-<kind>-<timestamp>. There is no debugger permission and no screen recording: this is activeTab plus scripting plus captureVisibleTab.
No image is ever uploaded. There is no analytics, no account, and no network call anywhere in the conversion path. Re-encoding also strips EXIF, GPS and camera metadata from every file, with orientation baked into the pixels first, so a stripped photo never comes out rotated.
| Permission | Why it is there |
|---|---|
contextMenus |
The right click entries on images and on pages. |
downloads |
Saving results (into Downloads/Cleanor by default). |
storage |
Remembering your format, quality, resize and crop settings. |
scripting, activeTab |
Collecting image URLs, and scrolling for a full page screenshot, on the tab you act on. |
clipboardWrite |
The "copy image" button. |
optional_host_permissions: <all_urls> |
Not granted at install. Requested only when you use a right click or a page action, and revocable. Drag and drop needs no site access at all. |
wasm-unsafe-eval (CSP) |
Running the AVIF encoder and the HEIC decoder locally. Neither one touches the network. |
Full policy: https://cleanor.app/privacy
| Guide | What it answers |
|---|---|
| Convert HEIC to JPG in Chrome | Opening an iPhone photo and saving it in a format everything reads. |
| Compress images without uploading them | What local compression means, and how this extension does it. |
| WebP vs AVIF: which should you use | Choosing the output format, and measuring it on your own file. |
| Resize an image to a target file size | Hitting "under 200 KB" without hunting along the quality slider. |
No. Every image is decoded, resized and re-encoded inside the extension page on your own machine, using the browser's Canvas encoder plus two bundled WASM codecs (AVIF encoding, HEIC decoding). Nothing in that path makes a network request, so it works with the network off. There is no account and no analytics.
Yes. HEIC and HEIF files are decoded by a bundled libheif build and then re-encoded as JPEG, PNG, WebP, AVIF or PDF. HEIC is input only: the extension will not write a HEIC file, because the reason to touch one is almost always that something else refuses to open it.
In: HEIC, HEIF, AVIF, WebP, JPEG, PNG, GIF and BMP. Out: WebP, AVIF, JPEG, PNG and PDF. Convert several images to PDF at once and you get one multi page PDF; convert several to any other format and you get one .zip.
Close to it. Enter a limit in KB in Target size and the extension runs a 7 step binary search on encoder quality, keeping the best quality that still lands under the limit. It works for the lossy formats (WebP, AVIF, JPEG). If even the lowest quality cannot reach your target, you get that lowest quality result, and the real fix is then to resize the image smaller.
Yes, as a consequence of how it works. The image is decoded to pixels and re-encoded from scratch, so EXIF, GPS coordinates and camera metadata are never carried across. Orientation is applied to the pixels before the metadata disappears, so photos do not end up sideways.
Not at install. <all_urls> is an optional host permission, so a fresh install has access to nothing. Chrome asks only when you use a right click or a page action, and only for the site you used it on, unless you tick the "all sites" toggle in the popup yourself. Drag and drop, the file picker and paste never need any site access.
Yes, MIT licensed, with the whole source in this repo. The same conversions also run in the browser at cleanor.app/tools, with nothing to install.
| Project | What it is |
|---|---|
| browser-image-tools | The client side image library on npm: compress and convert inside any web app. |
| cleanor-mcp | MCP server that hands AI agents image optimization and dev utilities. |
| cleanor-storage-lab | Open compression benchmarks and datasets. |
| gif-compressor-chrome-extension | GIF toolkit for Chrome. |
| qr-code-generator-chrome-extension | QR code generator for Chrome. |
| figma-image-compressor | The same compression, inside Figma. |
| wordpress-image-optimizer | The WordPress plugin: optimize an entire media library. |
zip -r -X cleanor-image-extension.zip . \
-x '*.git*' -x 'store-listing/*' -x 'docs/*' -x 'README.md' -x 'LICENSE'See SIGNING.md for the signed .crx flow.
MIT © Cleanor Labs. More free tools at cleanor.app/tools, the extension's landing page at cleanor.app/chrome, and open datasets at cleanor.app/research.