Turn a video into a GIF that fits
Pick a range, choose the look, and let the fit mode land the file under 8 MB for Discord or Slack. Nothing is uploaded.
Processed on your device. Your video is never uploaded. How we know
Drop a video to turn into a GIF
Drop a video here, paste it with Ctrl+V, or choose one from your device.
ClipHeron runs in your browser. We don’t receive your videos, their names or anything in them. Ads on this page load separately and are not given your files. What happens to your video
How to make a GIF from a video that stays under 8 MB
GIFs are big because the format is from 1989: no inter-frame compression to speak of, 256 colors at most, and every frame stored almost whole. Ten seconds of 480-pixel video at 12 frames per second is 120 frames, each a few tens of kilobytes. The size is decided by four knobs, and the GIF under 8 MB guide explains what each one costs. ClipHeron turns them for you when you ask it to fit a limit.
- 1
Add a video and pick the range
Drop any video. Drag the handles or type timecodes to choose the part you want; the first five seconds are selected to start with. Up to 30 seconds is comfortable, up to 60 is allowed with a warning.
- 2
Choose the look, or a size limit
Set frame rate, width, colors, dithering, loop and crop. Leave “Fit under” on with 8 MB (or 10, 15, or your own figure) and the tool steps settings down only as far as needed.
- 3
Convert, check, download
Watch the preview play, read the exact size in bytes and megabytes, and download. If the result is over 8 MB with a long range, the page suggests an MP4 instead.
What this tool does
- Any decodable video in, not just MP4: MOV, WebM and MKV too
- Range selection on a timeline with a filmstrip and editable timecodes; the first 5 seconds by default
- Frame rate 5 to 24 fps, width 320 to 800 px, 32 to 256 colors, dithering on or off, loop forever or once
- Centre crop to 1:1, 4:5, 9:16 or 16:9
- “Fit under N MB” mode searches colors, frame rate, width and dithering in a fixed order until it fits
- A live size estimate that updates within a second of any change
- One global palette by default, properly quantised, with Floyd–Steinberg dithering
- Playing preview of the finished GIF, exact byte count, frame count and fps
The same 10-second clip at three settings
A 10-second range from a 1080p talking-head clip. The estimator reasons in frames × pixels × bytes per pixel after LZW compression, which depends on the palette and dithering:
| Settings | Frames | Pixels per frame | Estimated size |
|---|---|---|---|
| 480 px wide (480×270), 12 fps, 128 colors, dither on (defaults) | 120 | 129,600 | about 4.1 MB |
| 640 px wide (640×360), 15 fps, 256 colors, dither on | 150 | 230,400 | about 10.5 MB |
| 320 px wide (320×180), 10 fps, 64 colors, dither off | 100 | 57,600 | about 1.0 MB |
Width is the biggest lever because it works in two dimensions: 640 px has 1.8 times the pixels of 480 px. Colors and dithering come next, because dithered noise compresses badly. Frame rate is linear. In fit mode the tool reduces colors first (256 → 128 → 64), then frame rate (24 → 15 → 12 → 10), then width (640 → 480 → 320), then switches dithering off, measuring a 3-second sample with the real encoder at each step so the estimate becomes a measurement.
Why GIFs are so much bigger than the video they came from
A modern video codec stores one full picture every second or two and then only the differences between frames. A GIF stores every frame as an indexed image: each pixel is a number pointing at one of up to 256 colors, compressed with LZW, a dictionary scheme from the 1980s that doesn’t know what a frame before it looked like. ClipHeron uses frame differencing where it helps (unchanged pixels become transparent and the previous frame shows through), but a talking head or a moving camera changes most pixels every frame, so the gains are modest.
That is also why the palette matters so much. 256 colors need 8 bits per pixel before compression, 64 colors need 6, 32 need 5. Dithering (scattering two nearby colors to fake a third) hides banding in skies and skin but adds noise that LZW can’t compress, so switching it off on screen recordings and flat graphics can halve the file.
How the fit mode decides what to sacrifice
The limit you give (8 MB by default, because that is Discord’s free attachment cap and roughly what chat previews tolerate) is a hard target. The search order is fixed and visible: colors first, because dropping from 256 to 128 is almost invisible; then frame rate, because 12 fps still looks like motion; then width; then dithering. At each step the real encoder runs on a 3-second sample to measure bytes per second, and the full encode happens only when the measured rate fits. If the full output still overshoots by more than 3%, one more step is taken and the encode runs again. The final size is always reported honestly, and if even 320 px at 5 fps with 32 colors can’t fit, the page says so and suggests a shorter range.
When you should send an MP4 instead
GIFs suit short, soundless loops: a reaction, a UI walkthrough of a few seconds, a logo animation. For anything longer than about 15 seconds, or anything with sound, an MP4 is five to ten times smaller at better quality, and every chat app autoplays and loops it just like a GIF. If your range is long, the page offers to hand the file to the trimmer or the compressor instead, and the FAQ explains why there is a 60-second cap.
Good to know
- Portrait video is rotated upright before the GIF is written, so phone clips don’t come out sideways.
- Variable frame rate sources are sampled by timestamp, so a frozen second stays frozen for a second rather than being skipped or duplicated.
- Transparent WebM sources lose their alpha channel onto black, with a notice. Transparent GIF output is on the list for later.
- No text captions yet; crop, loop and speed cover most needs for now.
- 4K sources are scaled down in the decoder before quantisation so phones don’t run out of memory.
Related tools and guides
Questions people ask
Why is my GIF blurry or grainy?
Two different things. Blurry means the width is low: a 320-pixel GIF shown at 640 pixels is upscaled by the viewer. Grainy means dithering noise, which is how a 128-color palette fakes smooth gradients. Try 480 or 640 px with dithering on for footage, or dithering off for screen recordings.
Why 8 MB?
It is Discord’s attachment limit without Nitro, and about what Slack and most chat previews handle smoothly. You can type any figure, and the 10 and 15 MB chips cover the common alternatives.
Can the GIF be transparent?
Not yet. Sources with transparency are composited onto black with a notice. Transparent output is planned once the fit mode has settled.
Can I add text?
Not in this release. Adding a caption needs text rendering inside the engine, which is on the roadmap. Crop, loop and speed are available now.
Does it upload my video?
No. Decoding and GIF encoding run in your browser. We never receive the video or its name. The how it works page shows how to check.
Why is there a 60-second limit?
A minute of GIF at even modest settings is tens of megabytes and the format can’t do better. Trim the range, lower the frame rate, or make an MP4 instead, which will be a fraction of the size.
What happens to your video
Processed on your device. Your video is never uploaded. ClipHeron runs in your browser. We don’t receive your videos, their names or anything in them. Ads on this page load separately and are not given your files.
Frames are decoded, scaled, quantised and written to the GIF entirely in a background worker on your device. The GIF carries no comment or application blocks, so no file name or metadata from the source ends up inside it. Your settings are remembered in local storage; the video, its name and the range are not.
The page does load advertising and analytics scripts, separate from the tool and described in our privacy policy. They are never given your files.