Private Video
GIF Maker

Convert video clips (MP4, WebM, MOV) to high-quality GIFs directly in your browser. Trim multiple segments, adjust frame rate and resolution, add captions and stickers β€” no uploads, 100% private.

Upload Video

Drag & drop your video here

MP4, WebM, or MOV β€” processed entirely in your browser

Private GIF Maker
100% Local & Secure

Everything happens on your machine. Your video stays in your browser tab β€” we never see, touch, or store it. gif.js encodes each frame locally, so the result is as private as it gets.

Created with the open-source gif.js library, which runs in a Web Worker by default. This page uses no analytics, no cookies, and no server side β€” just your browser and a free tool that stays cool under load.

How GIF Conversion Works

Simple Steps:

  1. 1Upload your video by dragging & dropping or clicking the upload area.
  2. 2Configure output settings: frame rate, resolution, aspect ratio, and looping.
  3. 3Add multiple segments to stitch clips together or trim to exact moments.
  4. 4Customize appearance: add captions with outline, stickers, and apply colors via the popover.
  5. 5Generate and download your GIF β€” everything happens locally in your browser.

Pro Tips:

  • 8–15 FPS is the sweet spot for most clips: smooth enough, and half the file size of 30 FPS.
  • Scale to 50% and use "High Color" palette only when the clip has gradients β€” flat colors compress fine at standard palette.
  • Use multiple segments to keep only the best moments and cut dead time between them.
  • Social Preset cards now show rich styling with gradients, icons, and detailed badges (like YouTube Money Estimator).
  • Adding an outline (stroke) to your caption text makes it readable on any background color.
  • Use the custom color popover (+ button) for precise color matching β€” includes hex input and Apply/Cancel buttons.
  • Preview your segments before generating to save time β€” the overlay shows captions and stickers at the bottom matching the canvas output.
  • Keyboard shortcuts: Space = play/pause, ←/β†’ = frame step, Enter = generate.

Common Use Cases

Educational Tutorials

Clip long screen recordings into short, looping GIFs that illustrate a single concept β€” no video player or buffering required. Perfect for embedding in blog posts, internal docs, or knowledge bases.

Example:
A 5-minute Cursor walkthrough trimmed to a 12-second loop showing just the multi-cursor shortcut in action.

Social Media Memes

Turn reaction clips, sports highlights, or stream moments into shareable memes with a built-in caption and sticker overlay. Pick the Twitter, Reddit, or Discord social preset to nail the right aspect ratio instantly.

Example:
A 15-second Twitch clip captioned "when the deploy finally passes" exported at 480Γ—270 for an autoplaying Reddit post.

Tutorial Highlights

Extract key steps from software tutorials into looping GIFs that students can watch repeatedly without scrubbing through video. Use the outline feature to make captions pop on any background.

Example:
A 3-second loop showing the exact keystrokes for a Vim command, with yellow outline on black text.

Email Newsletter Clips

Embed animated GIFs in email campaigns β€” GIF is the only animation format with 100% email client support (Gmail, Outlook, Apple Mail, Yahoo). MP4 simply will not play in most inboxes.

Example:
A product launch teaser loop, capped at 1 MB to stay under Gmail's clipping threshold, sent to a 20k-subscriber list.

Data Visualization Loops

Convert chart animations, dashboard demos, or animated infographics into compact looping GIFs for slide decks, reports, or Notion pages where embedded videos would balloon the file size.

Example:
A 30-second annual-revenue racing bar chart exported at 720p, 10 FPS, 2Γ— loop β€” fits cleanly into a quarterly board-deck PDF.

Presentation Enhancements

Loop short video clips as animated backgrounds in PowerPoint or Google Slides. Use the scale and resolution controls to keep file sizes low while maintaining visual quality.

Example:
A 10-second sunset clip scaled to 30% and looped infinitely as a slide transition effect.

Frequently Asked Questions

πŸ”§Technical Details & Encoding Methods

GIF Conversion Pipeline

Core Pipeline:

Browser File β†’ ObjectURL β†’ <video> decode β†’ Canvas 2D drawImage β†’ gif.js LZW encode β†’ Blob URL download
All encoding runs in a Web Worker β€” main thread stays free for UI

Your video is decoded natively by the browser, then sampled frame-by-frame using the Canvas 2D API. Captions and stickers are composited onto each frame before gif.js quantizes the colors to a 256-color palette and compresses using the LZW algorithm β€” the same compression GIF has used since 1987.

1

Decode & Load

Browser's native HTMLVideoElement decodes the MP4/WebM/MOV. loadedmetadata fires once duration and videoWidth/Height are available.

Key API: HTMLVideoElement, URL.createObjectURL

2

Seek & Capture

For each output frame, seek the video to time t, wait for the seeked event, then drawImage() the current frame onto a hidden canvas.

Frame Rate: 2-30 FPS (user-controlled)

3

Composite Overlays

Caption text (with 8-direction outline) and sticker images are drawn on top of the video frame. The same drawOrder runs on every frame for consistency.

Canvas API: fillText, drawImage, lineWidth stroke

4

Encode & Download

gif.js quantizes each canvas frame to 256 colors, then LZW-compresses the pixel data. The result is a single GIF Blob you can preview and download.

Output: Animated GIF89a with Netscape looping

File Size & Performance

The File Size Formula:

File Size β‰ˆ (Width Γ— Height Γ— FPS Γ— Duration) Γ· Compression Ratio
Compression depends on color complexity and palette mode

Three knobs dominate file size: resolution (pixels scale quadratically), frame rate (linear), and duration (linear). Reducing any of them is the fastest way to shrink the output.

⚑

Frame Rate (2–30 FPS)

Lower FPS reduces file size linearly. 10 FPS is the sweet spot for most clips; 30 FPS for smooth motion. The live counter shows exactly how many frames will be encoded.

Example: 10s clip @ 480Γ—270: 10fps β‰ˆ 0.5 MB, 30fps β‰ˆ 1.5 MB

πŸ“

Resolution Scaling

Scale slider (25%–200%) or custom width/height. Halving each axis reduces pixel count by ~75% and file size by ~60–70%. Dimensions are rounded to even numbers for optimal encoding.

Example: 1280Γ—720 (922k px) vs 640Γ—360 (230k px) β†’ ~ΒΌ the file size

🎨

Palette Mode

GIF is limited to 256 colors per frame. Standard uses fixed 256-color palette β€” best for flat-color content. High Color uses gif.js NeuQuant neural-net quantization for smoother gradients at 2–3Γ— encoding time.

Trade-off: Quality vs file size β€” High Color can 2Γ— file size

βš™οΈ

Web Worker Encoding

GIF encoding runs in a dedicated Web Worker (2 workers) so the main thread stays free for UI interactions. The encoder is gif.js β€” a battle-tested LZW compressor that handles 256-color quantization and looping semantics correctly.

Speed: ~0.5–2s per frame depending on resolution and palette

Privacy & Security Architecture

The privacy model is architectural, not just policy β€” your video physically cannot leave your device because there is no server to receive it. Here's exactly what that means.

πŸ”’

Zero Server

No file ever leaves your device. All processing is in-browser JavaScript; the page makes no network requests for your data.

Network tab: Zero POST/PUT requests after page load

πŸ’Ύ

In-Memory Only

Blob URLs and canvases live in page memory. The cleanup() handler revokes all Object URLs and pauses the video on unmount.

Lifecycle: Memory cleared on tab close, refresh, or reset

πŸ“–

Open Source Engine

Encoding is done by gif.js (jnordberg) and Mediabunny, both audited and open-source. No opaque binaries handle your pixels.

Verify: github.com/jnordberg/gif.js β€” 1k+ GitHub stars

πŸ›‘οΈ

No Tracking

No analytics, no cookies, no referrer leakage. The privacy badge is honest because nothing is collected.

DevTools: No tracking scripts, no third-party iframes

Output Settings & Customization

Every output knob is exposed as a control in the tool. Here's what each one does, how it affects the GIF, and the exact numeric range or behavior you can expect.

⏱️

Frame Rate (2–30 FPS)

Slides from 2 FPS (stop-motion feel, tiny files) to 30 FPS (smooth video). 10 FPS is the default sweet spot for most clips. The live frame counter updates as you adjust the slider.

Range: 2 FPS (slideshow) β†’ 30 FPS (cinema-smooth)

πŸ“

Resolution & Aspect Ratio

Scale slider (25%–200%) downsizes or upscales the source. Toggle the aspect-ratio lock to auto-adjust height when you change width. Custom Width/Height inputs override the scale.

Tip: Pixel-perfect specs for any platform in one click

πŸ“±

Social Media Presets

One-click cards for Twitter (1200Γ—675), Reddit (480Γ—270), Discord emoji (128Γ—128), YouTube thumbnail (1280Γ—720), Instagram square (1080Γ—1080), and more. Each card shows platform icon and dimensions.

Count: 10+ pre-configured platforms

πŸ”

Loop Control

Choose Infinite (default), Play Once, or 1–100 repetitions. The loop count is baked into the GIF's Netscape Application Extension, so it travels with the file everywhere.

Formats: Infinite / Once / N times (1–100)

βͺ

Reverse Playback

One-click toggle flips the segment order during frame extraction β€” perfect for boomerang-style reactions, satisfying reveal effects, or creative "rewind" moments without re-editing the source video.

Use cases: Boomerangs, reveals, rewind memes

🎨

Palette (Standard / High Color)

Standard uses 256 fixed colors for fast encoding β€” best for flat-color content. High Color uses gif.js NeuQuant neural-net quantization for smoother gradients, at 2–3Γ— encoding time.

Algorithms: Fixed 256-color vs NeuQuant neural net

Caption & Sticker Overlays

πŸ’¬

Caption Engine

Full text overlay with 9 built-in web-safe fonts (Impact, Arial Black, Comic Sans MS, etc.), 12–72 px size slider, and a 9-swatch + custom hex color popover. Live canvas preview matches the output exactly.

Fonts: Impact, Arial Black, Comic Sans, Helvetica, Verdana, Georgia, Courier, Trebuchet, Times

✏️

8-Direction Outline (text-shadow)

The outline is drawn as 8 layered text-shadows (N, NE, E, SE, S, SW, W, NW) at the full outline width, producing a continuous ring around each glyph. Width (0–6 px) and color are user-controlled.

Width range: 0–6 px, with custom color picker

🎭

Sticker Overlay

Upload any PNG or JPG (transparent PNGs recommended for logos/reactions). X/Y position sliders (0–100%), scale (0.5×–3Γ—), and a checkerboard preview show exactly where the sticker will land on every frame.

Max size: Up to 40% of frame dimensions to stay performant

βœ‚οΈ

Multi-Segment Stitching

Add unlimited segments, each with its own start/end time. Frames are extracted in order and concatenated into one GIF β€” ideal for "highlights only" reels, skipping dead time between moments.

Limit: Unlimited segments per GIF

Known Browser Limitations

While the tool works in all modern browsers, performance and feature availability vary. Below are the real-world limitations you'll encounter β€” and what to do about them.

🧭

Safari

Slower encoding and higher memory usage for large frames or long clips due to JavaScript engine differences. Very large GIFs (>500 px wide) may fail to encode in older Safari versions.

Workaround: Stick to 480–640 px wide, or upgrade to Safari 16.4+

🦊

Firefox

GIF encoding may be slower than in Chrome-based browsers due to differences in JavaScript performance. High Color mode can significantly increase encoding time.

Workaround: Use Standard palette for faster encoding

⚠️

Chrome / Edge Memory

Encoding very large frames (e.g., 1920Γ—1080 at 30 FPS for many seconds) may consume significant RAM and could cause the tab to become unresponsive if system memory is limited.

Workaround: Limit to 720p or below, or close other tabs

πŸ“¦

GIF Format Limits (All Browsers)

The GIF format inherently lacks alpha transparency (only single-color transparency) and is limited to 256 colors per frame, which can cause banding in gradients or photorealistic content.

Workaround: Reduce dimensions or frame rate to stay within practical file size limits

Browser Compatibility

βœ“ Fully Supported

Chrome 90+, Firefox 88+, Edge 90+, Safari 14+. Requires HTML5 video, Canvas 2D, and Web Workers for frame extraction and encoding. All features work as expected.

⚠ Partial Support

Older Safari (pre-16.4) may exhibit stuttering when seeking very short video segments due to differences in HTMLVideoElement seek behavior. If encoding seems stuck on a 1-second segment, try a longer source clip.

βœ— Not Supported

DRM-protected video (Netflix, Hulu, Disney+) cannot be captured β€” the video element displays black frames. Internet Explorer & legacy Edge lack required APIs (Web Workers, Blob URLs).

Was this tool helpful?

Help us improve by sharing your experience