A free, offline alternative to TinyPNG, TinyJPG and Squoosh. No uploads, no accounts, no quotas, no file-size limits. A WebM stays a WebM, a PNG keeps its transparency, and a transparent MOV comes out as a transparent MOV that Safari actually plays.
Download from the latest release:
| Platform | File |
|---|---|
| macOS · Apple silicon | arm64.dmg |
| macOS · Intel | x64.dmg |
| Windows | x64.exe |
| Linux · Debian/Ubuntu | amd64.deb |
| Linux · other | x86_64.AppImage |
Or with Homebrew:
brew tap joachimba/tap https://github.com/joachimba/offline-media-compressor
brew trust joachimba/tap
brew install --cask media-compressormacOS: the first launch is blocked — "Apple could not verify … may contain malware". The app is signed but not notarized, and macOS 15+ no longer lets you bypass that with right-click → Open.
Go to System Settings → Privacy & Security, scroll to the message about Media Compressor, and click Open Anyway. Once only.
Or from a terminal:
xattr -dr com.apple.quarantine "/Applications/Media Compressor.app"
- Formats stay put. WebM → WebM, PNG → PNG, MP4 → MP4. Nothing is silently converted.
- Transparency survives — including transparent MOV for Safari, which almost nothing else does locally. How
- Three presets. Light, Web, Sharp. Web is the right answer nearly always.
- Batch it. Drop a folder. Images run in parallel, one worker per core.
- Nothing leaves your machine. No network access at runtime at all.
| File | Before | After |
|---|---|---|
| Transparent MOV (ProRes 4444) | 84 MB | 680 KB — HEVC + alpha, plays in Safari |
| Screenshot PNG with transparency | 219 KB | 56 KB |
| Photo JPEG, 40 megapixels | 4.8 MB | 2.4 MB |
| WebM, 10 s of 720p | 1 MB | 336 KB |
Pick the format under Advanced, or leave it on Keep original and the right one is chosen for you.
| Format | Plays in | Use it for |
|---|---|---|
| MOV (transparent) · HEVC + alpha | Safari, QuickTime, Finder | the web, and anything Apple. macOS only |
| MOV (transparent) · ProRes 4444 | every video editor | editing masters. Large files |
| WebM (transparent) · VP8 + alpha | Chrome, Firefox, Edge | the web, everywhere else |
Safari refuses VP8/VP9 transparency and wants HEVC with an alpha layer, which FFmpeg cannot produce at all. So that one format is handled by a small bundled Swift helper that drives Apple's own encoder — hardware accelerated, six seconds for a 3-second 4K clip.
| In | Out | Codec |
|---|---|---|
| MP4, MOV, MKV | same | H.264 + AAC, +faststart on MP4/MOV |
| WebM | WebM | VP8 + Opus |
| OGV | OGV | Theora + Vorbis |
| GIF | MP4 | usually 10–20× smaller |
| PNG | PNG | palette-quantised 8-bit indexed, transparency intact |
| JPEG | JPEG | mozjpeg |
| WebP, AVIF, BMP | WebP / PNG | libwebp |
If a re-encode comes out no smaller and the format is unchanged, you get your original file back instead of a bigger one.
Needs Node.js 20+.
git clone https://github.com/joachimba/offline-media-compressor.git
cd offline-media-compressor
npm install # fetches FFmpeg wasm, builds the macOS helper
npm startnpm run dist builds installers for every platform this machine can target
(dist:mac, dist:win, dist:linux for one at a time).
- Video is slow. Single-threaded FFmpeg in WebAssembly: roughly 3× the clip length for 720p H.264. Images are fast. The HEVC-alpha path is fast, because that one is hardware.
- WebM uses VP8, not VP9 — VP9 crashes in this FFmpeg build.
- Memory is the limit, not file size. Very long or very large video can exhaust the wasm heap; the app tells you and suggests a max width.
- Windows and Linux are untested by me. They build and the UI adapts. Reports welcome.
Details, measurements and the reasoning behind these are in docs/technical-notes.md.
Is it really offline?
Yes. There is no network code in the app at all — FFmpeg is bundled on disk, and a strict
default-src 'none' policy blocks remote requests even if something tried.
Why is video slower than an FFmpeg command line? FFmpeg runs as WebAssembly, single-threaded, because the multithreaded build never emits a frame in current Chrome. Images are fast and the transparent-MOV path is hardware accelerated.
How do I get transparent video that works in Safari? Advanced → Format → MOV (transparent) · HEVC + alpha, or just leave Format on Keep original and drop a transparent file in. Nothing else does this locally.
Can I trust the compression not to wreck quality? Web/H.264 is CRF 22 — the same setting most FFmpeg guides recommend. JPEG uses mozjpeg, PNG uses palette quantisation like TinyPNG. And if the result is not smaller, you get the original file back.
Does it convert between formats? Only if you ask it to, under Advanced. The default keeps what you gave it.
FFmpeg is used under the GPL via ffmpeg.wasm; image codecs come from jSquash.

