lazy webp
Batch convert images to WebP with zero config. Skips unchanged files automatically, processes directories in parallel, and works as a CLI or native macOS app.
Usage
Quick Start
# zero-install (npx) npx lazywebp photo.png # or install globally npm install -g lazywebp lazywebp photo.png
Examples
# convert multiple files lazywebp a.png b.jpg c.gif # convert a directory lazywebp ./images # custom quality (default: 90) lazywebp -q 80 ./photos # recursive + output dir lazywebp -r -o ./out ./src # recursive, skipping cache and tmp lazywebp -r -e cache,tmp ./images
Options
| Flag | Description |
|---|---|
| -q, --quality | WebP quality 1-100 (default: 90) |
| -o, --output | Output directory (default: next to source) |
| -r, --recursive | Process subdirectories recursively |
| -e, --exclude | Skip directories by name during scans (comma-separated, repeatable) |
| -h, --help | Show help |
| -v, --version | Show version |
Features
CLI
Files, folders, or both
Pass any mix of files and directories in one command. Reads JPG, JPEG, PNG, GIF, BMP, TIFF and WebP, matched by extension in any case.
Skips what has not changed
A source is converted only when it is newer than its .webp, or when that .webp is empty. A second run over the same folder does almost nothing.
Up to four at a time
Images convert in batches sized to one fewer than your CPU cores, capped at four.
Safe writes
Each image goes to a hidden temp file and is renamed into place once it is complete and not empty. A failed conversion leaves nothing behind, and a symlink at the output path is never overwritten.
sRGB out
Display P3 and other RGB sources are converted to sRGB, so the WebP looks the same wherever it is shown.
EXIF rotation
Orientation tags are applied to the pixels during conversion, so the output is upright everywhere.
Mirrored output
-r walks subdirectories, and with -o the same folder structure is recreated under the output directory.
Skip directories
-e cache,tmp prunes directories by name before a recursive scan descends into them. Separate names with commas or repeat the flag.
macOS App
Drop or pick
Drop files or folders on the window, or click the drop zone to choose them. Folders are scanned all the way down.
Quality slider
WebP quality from 1 to 100, starting at 90.
Per-file savings
Each row shows the size before and after and the percentage saved, with a total for the whole batch.
Progress and cancel
Up to four files convert at once, the count updates as each one lands, and a batch can be cancelled midway.
Always on top
The window floats above other apps, so it stays in reach while you drag out of Finder.
Menu bar
A menu bar icon reopens the window, toggles launch at login, and installs the app to /Applications.
macOS App
Native SwiftUI desktop app with drag-and-drop conversion. Drop image files or folders onto the window and watch them convert in real time. This is a developer tool you build locally, not a downloadable consumer app.
Build from source
git clone https://github.com/keiver/lazywebp.git cd lazywebp/app ./install-app.sh
lazywebp CLI installed globallymacOS 14+Swift 6.2+

Questions
What image formats does lazywebp support?
JPG, JPEG, PNG, GIF, BMP, TIFF and WebP, matched by file extension in any case. Anything else in a directory is ignored, and a non-image file passed by name is skipped with a warning.
How does the skip logic work?
Before converting, lazywebp compares the modification time of the source against its existing .webp. If the source is not newer, the file is skipped, unless that .webp is empty. Repeated runs only convert new or modified images.
How do I skip folders like cache or tmp?
Use -e with a recursive scan: lazywebp -r -e cache,tmp images/. Directories with those names are pruned before the scan descends into them, at any depth. Names can be comma-separated or passed with repeated -e flags.
Can I use the macOS app without the CLI?
No. The app is a SwiftUI wrapper that runs the lazywebp CLI for every file, so install the CLI globally with npm first. The app looks for it in /usr/local/bin, /opt/homebrew/bin, your nvm versions and your login shell's PATH, and puts that directory on PATH so node resolves too.
What quality setting should I use?
The default is 90, which works well for most use cases. For photographs where file size matters more, try 80-85. For graphics, illustrations or UI screenshots where sharpness is critical, use 90-95.
Does it preserve original files?
Yes. Sources are never modified or deleted. The .webp is written next to its source, or under the directory given to -o, through a temp file that is renamed only after the conversion succeeds.
How does concurrent processing work?
The CLI converts in batches of one fewer than your CPU cores, capped at four, and finishes a batch before starting the next. The macOS app runs up to four CLI processes at once.
