Oncea file clinic

Video → GIF

A small clip, turned into a looping GIF in this tab. Optional start and end. No account. The download is just a file.

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 an mp4, webm, mov, or a WhatsApp clip. Optional start and end, then make a GIF.

How to make a GIF from 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 one small mp4 (or mov / webm / a WhatsApp clip) on the square, or click it and pick the file. The clip plays in this tab so you can find the seconds you want.
  3. Optional: set start and end. Seconds work (12.5). So does mm:ss. Leave both empty for the whole file.
  4. Pick a max width (320 / 480 / 640), frames per second (8 / 12 / 15), and Better or Smaller. Better uses a two-pass palette. Smaller uses fewer colors and cheaper dither.
  5. Click Make GIF. The first run in a session loads the same ffmpeg core as Compress video — about 25 MB from this origin — and keeps it for the tab.
  6. The GIF plays in this tab. Download it. There is no watermark and no signup.

A GIF of a two-minute camera dump is a bad idea. Keep it short — five to ten seconds is the range that stays useful. If the source is huge, cut it first on Trim video, or set start and end here. If you needed a smaller mp4 instead, that is Compress video.

What this page actually does

The browser loads ffmpeg compiled to WebAssembly, the same stack as Compress video, Trim video, and Extract audio. Your file is written into that virtual filesystem. We scale the long edge down to the width you picked (never up), drop the audio, and encode a looping GIF. The clip is not uploaded to Once. There is no queue and no render farm. If the tab dies, the job dies with it.

The first pass is palettegen: ffmpeg samples the frames and writes a 256-color (or 128-color) palette. The second pass is paletteuse with sierra2_4a dither on Better, or bayer dither on Smaller. That is the usual two-pass GIF recipe. If the wasm build cannot run those filters, we fall back to a single-pass GIF so you still get a file.

Why the limits are loud

ffmpeg.wasm is a real encoder inside a browser memory cap. A GIF also expands: every frame is a bitmap, then a 256-color index. A 4K phone dump will not finish. A two-minute lecture will not finish, and if it did the GIF would be enormous. About 80 MB is the input ceiling we advertise because past that the tab tends to crash before it helps you. Forty megabytes can already be painful. The encoder core itself is about 25 MB, loaded once per session from this origin. We warn, we do not pretend.

iPhone Safari is a bad host for this. Shared memory, wasm, and large ArrayBuffers are where mobile browsers cut you off. Use a laptop. If you are on a phone, AirDrop the clip to a computer and run this page there.

SharedArrayBuffer needs Cross-Origin-Opener-Policy same-origin and Cross-Origin-Embedder-Policy require-corp. Next.js sets both in next.config.mjs. This 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

A looping GIF, not a video. Audio is gone. Motion is 8, 12, or 15 frames a second. Fine gradients band. A screen recording with big blocks of UI shrinks well. A dark, noisy night shot looks worse than the source and can still be large. Better spends colors on the clip; Smaller throws more of them away on purpose.

640 and 15 fps look smoother and cost RAM and time. 320 and 8 fps is the setting that survives a chat app. Leave the tab in the foreground. Background tabs get throttled and look frozen. The first click in a session pays for the wasm core. After that, another short clip is just encode time.

What this is not

This is not a meme factory, not a sticker packer, and not a YouTube downloader. We will not add ads, or a login to unlock longer clips. If you need a folder of files or a 60 fps master, install ffmpeg on a machine you control: ffmpeg -ss 3 -to 8 -i in.mp4 -vf fps=12,scale=480:-1,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse out.gif. Once is for the one clip that should loop in a chat and is 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 — including a WhatsApp video you saved off the phone. 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.

Can I enter times as mm:ss?

Yes. 0:12, 1:05, 00:01:05, or a number of seconds. Empty start is the beginning. Empty end is the rest of the file.

Why is the GIF huge?

GIF is a 1980s still format doing a video's job. Longer clips, wider frames, and 15 fps all multiply. Cut the range. Drop to 320 and 8 fps. Tick Smaller. If you needed a smaller video, use Compress video — that stays H.264.

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, key once:jobs.

The tab crashed. Did you get the file?

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