GIF Maker

Turn multiple images into an animated GIF. Fully in your browser — no uploads.

Drop or tap to make GIF

Upload multiple frames — JPG, PNG, WEBP

They will animate in the order you add them

Runs entirely in your browser. No uploads. Your files stay private.

Encode An Animated GIF From Image Frames In Your Browser

GIF Maker turns a sequence of still images into a standards-compliant animated GIF using gifenc, a small WebAssembly-friendly JavaScript encoder. Each frame is decoded into a Canvas, the RGBA pixel buffer is sent to a Web Worker, and the worker runs gifenc's neuquant-style colour quantiser, applies the resulting 256-colour palette, and writes a single GIF89a stream with the loop count and per-frame delays you specify.
Running the encoder off the main thread matters because palette quantisation is expensive. Each frame's pixel buffer is transferred (not copied) into the worker, which keeps memory flat even when you stack twenty 1080-pixel screenshots. The worker reports progress 0-100 back to the UI so you can see how the encode is going on long jobs.
Per-frame delay is stored in centiseconds inside the GIF spec — every delay you enter in milliseconds is rounded to the nearest 10 ms, which is the smallest unit the format actually supports. Browsers and chat clients then enforce a minimum playback delay (Chromium uses 20 ms for very short delays to match Safari and Firefox), so frames below that threshold play slightly slower than the file says.
Frame ordering is fully drag-to-reorder, and individual frames can be deleted, duplicated, or have their delay tweaked without re-uploading the source images. The preview uses a real GIF rendered in an img tag, not a JavaScript playback loop, so what you see is exactly what the exported file will play.
The biggest practical limit is the GIF format itself: 256 colours per frame and no alpha channel, only a single transparent index. Photos with subtle gradients banding will show that banding in the export. For colour-rich content, MP4 or WebM is much smaller and looks better — but GIF still wins for one-click sharing in chat apps and for in-line previews on platforms that do not autoplay video.
Frame count is technically unbounded, but each frame adds tens to hundreds of kilobytes after quantisation depending on resolution. For Slack or Discord-friendly files, target 600 px on the long edge and under 50 frames; for embed-heavy product demos, stay under 20 frames at 400 px to keep the file under 5 MB.
Everything runs locally. The frames live as object URLs in your tab, the worker never makes a network request, and the final GIF is downloaded directly from the worker's output buffer. Closing the tab frees the memory immediately.

Common Use Cases

01

Reaction GIFs for chat

Stitch a few screenshots or photos into a looping reaction for Slack, Discord, or iMessage where short looping content beats a video file.

02

Product demo loops

Show a UI flow as a 6-10 second loop on a landing page or in a README without forcing visitors to start a video player.

03

Documentation walkthroughs

Capture sequential states of a feature and turn them into a GIF that GitHub renders inline in pull requests and issue threads.

04

Loading and progress animations

Build sprite-based spinners or progress indicators from hand-drawn or AI-generated frames for apps that still need GIF support.

Frequently Asked Questions

It uses gifenc, a small modern GIF89a encoder that runs in JavaScript with a neuquant-inspired colour quantiser. Encoding happens inside a Web Worker so the page stays responsive during long jobs.
GIF stores delay as an integer number of centiseconds, so anything you enter is rounded to the nearest 10 ms. Browsers also enforce a minimum playback delay (around 20 ms in Chromium) for compatibility with very old animated GIFs, which is why ultra-fast frames may play slower than expected.
There is no hard cap, but each frame is held as a decoded bitmap until encoding finishes. Most modern laptops are comfortable up to 200 frames at 600 px; mobile devices start to choke around 50-60 frames at 1080 px.
GIF supports only 256 colours per frame, picked by quantising the original RGBA pixels. Smooth gradients in photos compress badly into 256 buckets and visibly band as a result. For photo content, consider MP4 or WebM instead.
Yes, but only one transparent index per frame — GIF has no real alpha channel. Pixels with alpha below 128 are mapped to the transparent index; semi-transparent pixels are rounded one way or the other.
There is no hard size cap, but anything beyond 50 MB will struggle to upload to chat platforms (Slack tops out at 1 GB but in-line previews break above 50 MB; Discord caps at 25 MB on free accounts). Keep dimensions modest and frame counts under 100 for embeddable files.
No. The frames are held as object URLs in your tab, the worker reads them via Canvas getImageData, and gifenc produces the binary entirely client-side. There is no fetch that carries pixel data.
Yes. The encoder supports infinite looping (the default) and any positive integer count. Browsers honour the count for the first playback session and then typically restart on hover or scroll into view.
Not directly — drop in extracted frames instead. Use a tool like ffmpeg locally to extract frames from a clip, then upload them in order. Future updates may add direct video frame extraction.
GIF compression is run-length-based, so frames with many subtle colour transitions encode poorly. Reduce the colour count by simplifying the source images, drop the resolution, or trim frames to keep the file size under control.

Advertisement