GIF Maker

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

100% private

Stack a series of images into a looping animated GIF — pick the per-frame delay, whether it loops forever or plays once, and the output size. Useful for product walkthroughs in changelogs, hand-drawn animations from a folder of frames, and short before-after reveals where a video would be overkill. Output is a real GIF (not a video) so it autoplays everywhere — README files, chat apps, old forum software. The encoding runs locally in a Web Worker via the gifenc library.

Drop or tap to make GIF

Upload multiple frames — JPG, PNG, WEBP

They will animate in the order you add them

Runs right inside your browser tab. 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 pure-JavaScript GIF89a encoder. Each frame is decoded into a Canvas, the RGBA pixel buffer is sent to a Web Worker, and the worker runs gifenc's PNNQuant colour quantiser, applies the resulting 256-colour palette, and writes a single GIF89a stream with the loop setting 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 or have their delay tweaked without re-uploading the source images. After clicking Create GIF, an encoded-GIF preview renders in an img tag so you can verify the final output before downloading.
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 pure-JavaScript GIF89a encoder with a PNNQuant 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.
Transparency is not preserved. Each frame is composited onto a canvas before encoding, so transparent PNG areas are filled with the browser's default background. GIF itself supports only one transparent index per frame — no partial opacity.
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 Loop animation checkbox makes the GIF play indefinitely. When unchecked, the GIF plays through once and stops.
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.
Maintained by the WebToolVerse teamLast updated Suggest an edit

Advertisement