100% on-device
Compress a GIF in your browser
Fit an animation under a size limit without killing the motion — or save it as an MP4, which is usually far smaller. Nothing is uploaded.
How it works
- Drop your GIF. It is decoded in this tab and its frame count, size and frame rate are read.
- Name a size. The tool measures one real encode of your GIF, then prices every option — frame rate, dimensions, colours — against your budget before spending time on it. It drops frame rate first (30 fps to 12 is nearly invisible) and pixels only when it must.
- Download. The GIF is rebuilt with a fresh palette. Tick "also save as MP4" to get the small version too.
In our own test, a 6.4 MB GIF came out at 1.6 MB — 76% smaller — and the bonus MP4 of the same animation was 807 KB, 88% smaller.
A GIF’s size is frames multiplied by palette, and both are 1987 constraints
Each frame is indexed colour - at most 256 entries - run through LZW, and the only saving between frames is that an unchanged rectangle need not be stored again. There is no motion compensation and no prediction of pixel values. A cursor moving across a still interface is therefore cheap, while a panning camera shot costs close to a full frame every time.
That sets the order of the dials. Frames go first, since 30 fps down to 12 removes three-fifths of them and the motion still reads. Colour is the subtler trade: dithering fakes missing shades by scattering pixels, which destroys exactly the frame-to-frame sameness LZW depends on, so a heavily dithered GIF can come out larger than an undithered one.
Timing and transparency are where re-encoders quietly break a GIF
Frame delays are stored in hundredths of a second, so common frame rates are not exactly representable and renderers round them; historically, very short delays were clamped to a tenth of a second, which is why some old GIFs play slower than they were authored to. The final frame’s delay is what makes the loop seam smooth, and it is routinely lost.
Transparency is one bit per pixel: an index is fully transparent or fully opaque, never in between, which is why GIF logos show a fringe from whatever they were matted against. Each frame also carries a disposal method telling the decoder whether to keep the previous frame or clear it, and getting that wrong on a re-encode is what produces smearing trails.
Questions
Is my GIF really not uploaded?
Yes — and not as a policy, as a fact of how it is built. There is no upload endpoint: the file is read straight into this browser tab and compressed by code running on your own machine. You can watch the Network tab while it works, or pull your Wi-Fi out mid-compression and it will still finish. Nothing is stored, nothing is queued, and there is no account.
Should I just convert it to MP4 instead?
If whatever you are posting to accepts video: yes, and it is not close. GIF is a 1987 image format pressed into service as video — it cannot use modern compression and is capped at 256 colours per frame. The same animation as an MP4 is routinely ten times smaller and looks better. Tick "also save as MP4" and you get both, so you can choose after seeing the sizes.
Will my animation still loop?
Yes. Loop count and the final frame's delay are both preserved — most re-encoders silently drop them, which is why a "compressed" GIF so often plays once and freezes, or hitches at the seam.
Why does it get grainy or banded?
A GIF can only hold 256 colours per frame, so shrinking one means choosing which colours to keep. The tool builds a fresh palette from your actual footage instead of reusing a generic one, and gives up colours only after frame rate and dimensions — but at a very tight limit, banding is the price the format charges. That is the point at which MP4 is the real answer.
The first run takes a while to start.
The engine (FFmpeg, ~30 MB of WebAssembly) downloads once, then is cached and shared with the video and audio tabs. Encoding itself is real work done on your machine — a long or large GIF takes a few seconds, and the progress bar is honest about it.
Other formats
The same workbench handles all of them — pick a tab above, or start from its own page: