Images
mozjpeg, oxipng + imagequant, ravif, and an SVGO-equivalent — compiled straight into the binary. Convert formats while you compress.
- PNG
- JPEG
- WebP
- AVIF
- SVG
- GIF
- HEIC
- TIFF
squish photos/ -r --format webp
Open source · Built in Rust · macOS & Linux
Compresses images, video, and audio. Minifies JS, TS, CSS, HTML, and JSON. One command, entirely on your machine — no uploads, no servers, no node_modules.
brew install mikedre/tap/squish
other ways to install ↓
$ squish ./assets/ -r
photo.jpg 4.4 MB → 1.4 MB −69.4%
hero.png 2.1 MB → 483 KB −77.0%
banner.webp 812 KB → 455 KB −44.0%
logo.svg 24 KB → 11 KB −54.2%
scan.tiff → .jpg 9.8 MB → 294 KB −97.0%
clip.mp4 3.1 MB → 1.0 MB −67.7%
track.mp3 8.2 MB → 1.3 MB −84.1%
✔ Squished 7 files · 28.4 MB → 4.9 MB (−82.6%) · 1.4s
Non-destructive by default — squish writes *_squished.* siblings and
never touches your originals unless you ask.
Point it at a file — or a whole folder — and squish works out what each thing is and picks the right tool for it.
mozjpeg, oxipng + imagequant, ravif, and an SVGO-equivalent — compiled straight into the binary. Convert formats while you compress.
squish photos/ -r --format webp
H.265 by default, H.264 for compatibility, AV1 for the smallest files — via your system ffmpeg. Audio streams copied untouched.
squish clip.mp4 --target-size 8M
Re-encode at the same codec, or convert lossless to Opus for roughly half the size. ID3 tags and album art preserved by default.
squish song.flac --codec opus
oxc and lightningcss minify JS, TS, CSS, HTML, and JSON in pure Rust. TypeScript in, minified JS out — no Node runtime anywhere.
squish dist/ -r --source-map
Measured on representative samples with default settings. The faint track is the original size; the gold bar is what's left after squishing.
Your mileage varies with content — run --dry-run
to preview savings on your own files before writing a byte.
--target-size 8M
Fit any file under an upload limit. Images binary-search the quality dial; video and audio compute a bitrate from the file's duration.
--quality auto
The hardest squish with no visible loss — perceptual quality search picks the lowest setting that still looks identical.
--watch
Keep it running on a folder and every file that lands gets squished as it arrives. It never re-squishes its own output.
--preset web
Resize to 1920px, convert to WebP, visually-lossless quality — the whole web-asset routine in one flag.
--dry-run
See exactly what would happen — files, formats, savings — before anything is written.
squish doctor
Checks which formats work on this machine and tells you precisely what to install for the rest.
squish config
A wizard that writes your defaults to squish.toml — per-project or
global, no TOML editing required.
--stats
A local-only ledger of every byte you've saved, this month and all-time. Nothing is phoned home.
squish meets you where the files are — even if that's a Finder window.
Squish assets in CI before every deploy, or pair it with a commit-back step. Runs on ubuntu and macos runners.
- uses: MikeDre/squish@v0.7.0
with:
paths: public/images
args: "--recursive --overwrite"
For the folks who never open a terminal: select files, right-click, squish. A notification reports the savings.
squish finder-action install
brew install mikedre/tap/squish
Prebuilt binary plus every system dependency — ffmpeg, gifsicle, libheif, dav1d. Nothing else to do.
cargo install squish-media-cli
Compiles from crates.io on stable Rust (1.95+). Install the system dependencies separately for full format coverage.
Every release ships binaries for macOS (arm64/x64) and Linux
(x64/arm64). Unpack, put squish on your PATH, done.
Then check your setup: squish doctor