Oncea file clinic

Compress video

A small mp4, shrunk in this tab with ffmpeg.wasm. No account. The download is just a file.

for WhatsApp

Before you start. About 80 MB is the ceiling. Desktop Chrome or Firefox is the setup that works. iPhone and large files may fail — the work stays in this tab, and the browser can run out of memory.

Drop a small mp4 on the zone, or click it.

How to compress a video on this page

  1. Read the limit note above the square first. About 80 MB. Desktop Chrome or Firefox. iPhone and large files may fail.
  2. Drop an mp4 (or mov / webm) on the square, or click it and pick the file.
  3. Click Compress video. The first run downloads the encoder core from this site — about 25 MB — and keeps it for the session.
  4. Wait. In-browser encode is much slower than desktop ffmpeg. A short 1080p clip can take minutes. Progress is shown in the tab.
  5. Download the new .mp4. There is no watermark and no signup.

What this page actually does

The browser loads ffmpeg compiled to WebAssembly. Your file is written into that virtual filesystem, encoded, and read back as a Blob. The video is not uploaded to Once. There is no render farm and no queue. If the tab dies, the job dies with it.

The default pass scales the long edge down to 1280 if it is larger, encodes H.264 with a fast preset and CRF 28, and copies audio to AAC at 96 kbps. If that encoder is missing from the wasm build, we retry with a simpler MPEG-4 video encode. The point is a smaller file you can send, not a mastering suite.

Why the limits are loud

ffmpeg.wasm is a real encoder running inside a browser memory cap. A 4K phone dump will not finish. A two-hour lecture will not finish. About 80 MB is the ceiling we advertise because past that the tab tends to crash before it helps you. Forty megabytes can already be painful. We warn, we do not pretend.

iPhone Safari is a bad host for this. Shared memory, wasm threads, and large ArrayBuffers are where mobile browsers cut you off. Use a laptop. If you are on a phone, this is the wrong tool — HandBrake, CapCut, or the Photos compress step on a computer you own will treat you better.

SharedArrayBuffer needs two headers: Cross-Origin-Opener-Policy same-origin and Cross-Origin-Embedder-Policy require-corp. Next.js sets both in next.config.mjs. That is why the multi-thread core can work on a proper host. This first version still loads the single-thread core so a missing header does not hard-fail the page. If isolation is off, the tool says so. Encode is just slower.

What you should expect

Smaller, not pretty. CRF 28 and a 1280 cap throw away detail on purpose. A screen recording with huge blocks of UI will shrink a lot. A dark, noisy 4K clip may barely move and still take forever. Audio is re-encoded; do not use this as an archive path for a master. If the output is larger than the input, that happens — a tiny, already-compressed clip has little left to give, and a fast preset is not aiming for the smallest possible file.

The first click in a session pays for the wasm core. After that, another short clip is just encode time. Leave the tab in the foreground. Background tabs get throttled and look frozen.

What this is not

This is not a YouTube downloader, not a subtitle burner, and not a cloud transcoder. We will not add ads, or a login to “unlock 1080p”. Transcription is a separate verb and it uploads. A looping gif is Video → GIF. If you need a folder of files, install ffmpeg or HandBrake. Once is for the one clip that is too big for email and too small to justify a whole app.

FAQ

Is the video uploaded?

No. Local verb. The privacy page is the same sentence in writing. The encoder files are served from this origin after install, not used as a place to park your clip.

Which formats can I drop?

mp4, mov, m4v, webm are the ones we try. The decoder inside ffmpeg.wasm is not a full desktop build. An odd codec in a .mkv can fail. If it fails, the error stays on this page.

Why is it so slow?

Because it is ffmpeg in a sandbox, often on one thread, without hardware encode. ultrafast and two threads are already the compromise. Native ffmpeg on the same machine will always win.

Can I pick a bitrate?

Not in this version. One verb, one set of settings. CRF 28, 1280 long edge, AAC 96k. If you need control, use real ffmpeg.

Do you keep a copy or watermark it?

No copy, no watermark, no paywall on the result. A finished job only increments a localStorage counter on this device.

The tab crashed. Did you get the file?

No. A crash is a crash. Try a shorter cut, a lower resolution source, or a desktop with more RAM. The 80 MB cap exists so we say no before the browser does.