Skip to content

Repository files navigation

Media Compressor icon

Media Compressor

Compress video and images on your own machine. Keep the format. Keep the transparency.

Latest release Downloads Platforms Offline

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.

Three images compressed in a few seconds, 388.8 kb saved, 59% smaller

Install

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

macOS: 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"

The app compressing images, with per-file savings

What you get

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

Typical results

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

Transparent video

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.

Formats

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.

Build from source

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 start

npm run dist builds installers for every platform this machine can target (dist:mac, dist:win, dist:linux for one at a time).

Good to know

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

FAQ

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.

Licence

FFmpeg is used under the GPL via ffmpeg.wasm; image codecs come from jSquash.

About

Compress video & images offline on macOS, Windows & Linux. Keeps your format — even transparent MOV for Safari. TinyPNG/Squoosh alternative.

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages