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 ↓
~/project

$ 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.

It eats everything.

Point it at a file — or a whole folder — and squish works out what each thing is and picks the right tool for it.

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

Video

H.265 by default, H.264 for compatibility, AV1 for the smallest files — via your system ffmpeg. Audio streams copied untouched.

  • MP4
  • WebM
  • MOV
  • MKV
  • AVI
  • DV
squish clip.mp4 --target-size 8M

Audio

Re-encode at the same codec, or convert lossless to Opus for roughly half the size. ID3 tags and album art preserved by default.

  • MP3
  • AAC
  • Opus
  • FLAC
  • WAV
  • OGG
squish song.flac --codec opus

Code

oxc and lightningcss minify JS, TS, CSS, HTML, and JSON in pure Rust. TypeScript in, minified JS out — no Node runtime anywhere.

  • JS
  • TS
  • JSX
  • CSS
  • HTML
  • JSON
squish dist/ -r --source-map

Real files, honest numbers.

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.

Careful by default.
Powerful when asked.

--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.

Terminal, CI, or right-click.

squish meets you where the files are — even if that's a Finder window.

GitHub Action

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"

Finder Quick Action

For the folks who never open a terminal: select files, right-click, squish. A notification reports the savings.

squish finder-action install

Get squish.

brew install mikedre/tap/squish

Prebuilt binary plus every system dependency — ffmpeg, gifsicle, libheif, dav1d. Nothing else to do.

Then check your setup: squish doctor