Skip to content

Releases: joachimba/offline-media-compressor

v1.0.1 — Transparent video: MOV with alpha that Safari plays

Choose a tag to compare

@joachimba joachimba released this 10 Aug 12:33

Transparent video actually works now — including transparent MOV that Safari plays, which nothing else does locally and for free.

Transparent video

┌──────────────────────────────────┬───────────────────────────┬─────────────────────────────┐
│ Format │ Plays in │ 84 MB ProRes source becomes │
├──────────────────────────────────┼───────────────────────────┼─────────────────────────────┤
│ MOV (transparent) · HEVC + alpha │ Safari, QuickTime, Finder │ 680 KB in 6 seconds │
├──────────────────────────────────┼───────────────────────────┼─────────────────────────────┤
│ MOV (transparent) · ProRes 4444 │ every video editor │ 27 MB (editing master) │
├──────────────────────────────────┼───────────────────────────┼─────────────────────────────┤
│ WebM (transparent) · VP8 + alpha │ Chrome, Firefox, Edge │ ~420 KB │
└──────────────────────────────────┴───────────────────────────┴─────────────────────────────┘

Safari refuses VP8/VP9 transparency and wants HEVC with an alpha layer, which FFmpeg cannot produce at all — VideoToolbox has no WebAssembly equivalent and x265 has no alpha-layer support. So that format is handled by a small bundled Swift helper driving Apple's own encoder. It's hardware accelerated, hence six seconds for a 3-second 4K clip.

Leave Format on Keep original and a transparent file picks the right one automatically.

Fixed

  • Transparency is no longer silently destroyed. A transparent MOV used to come back with a black background, and a transparent WebM came back opaque. Two silent causes: FFmpeg's native VP8 decoder discards the alpha plane, and libvpx rejects auto-alt-ref when encoding alpha while the old fallback flattened it.
  • Alpha is detected by FFmpeg, not the browser. Chrome cannot demux ProRes or HEVC-alpha at all — exactly what transparent MOVs contain — so the old check was blind to them.
  • Plain-language errors instead of raw FFmpeg output.
  • Windows and Linux builds.
  • Clearing rows no longer leaves a stale savings total.

Notes

macOS: not notarized, so the first launch is blocked. Right-click → Open → Open. Once only.

HEVC-alpha is macOS only (VideoToolbox). Windows and Linux get transparent WebM and ProRes 4444.

Windows and Linux are untested by me — they build and the UI adapts, but every run verified was on an Apple silicon Mac.


v1.0.0 — first release

Choose a tag to compare

@joachimba joachimba released this 07 Aug 12:28

Compress videos and images on your own machine. The output keeps the format you gave it — a WebM stays a WebM, a PNG stays a PNG with its transparency intact. Nothing is uploaded, so there are no quotas, no accounts and no file limits.

Downloads: arm64.dmg for Apple silicon · x64.dmg for Intel Macs · x64.exe for Windows 64-bit · amd64.deb for Debian/Ubuntu · x86_64.AppImage for any other Linux distro.

macOS: signed with a local development certificate, not a paid Developer ID, so the first launch warns. Right-click → Open → Open. It only asks once.

Windows and Linux are untested — they build and the window chrome adapts, but every run I verified was on an Apple silicon Mac.

What it does: H.264/AAC in MP4, MOV and MKV (+faststart on MP4/MOV), VP8/Opus in WebM, Theora/Vorbis in OGV, GIF → MP4. Images use mozjpeg, libwebp, and a real 8-bit indexed PNG encoder with palette quantisation and Floyd–Steinberg dither. Three presets, with format/max-width/drop-audio and the live ffmpeg command under Advanced. Images run in parallel, video one at a time. If a re-encode isn't smaller and the format is unchanged, you get your original file back.

Measured at the Web preset: 219 kb transparent PNG → 56 kb (−75%) · 11.3 mb PNG → 3.35 mb (−70%) · 4.80 mb 40 MP JPEG → 2.36 mb (−51%) · 10 s 720p WebM → 336 kb (−67%) · 12 mixed files, 56 mb, in 7.2 s.

Known limits: WebM uses VP8 because libvpx-vp9 in @ffmpeg/core@0.12.10 aborts with memory access out of bounds after the first frame. FFmpeg is single-threaded — the MT core loads but never emits a frame — so video takes roughly 3× the clip length at 720p. Memory is the ceiling, not file size. OGV encodes but can't be previewed.

Privacy: no network access at runtime, no CDN fallback, sandboxed renderer under default-src 'none', and reveal-in-file-manager limited to paths the app wrote.