How to convert mp4 to gif for slack & discord
- Step 1Trim the MP4 to the part worth sharing — Chat GIFs should be a few seconds. Cut to the relevant span with the lossless trimmer first (instant keyframe stream-copy). The shorter the clip, the smaller the GIF — and the more likely it autoplays inline.
- Step 2Drop the clip onto the converter — Accepts
.mp4,.mov,.mkv,.webm,.avi,.m4v,.ts. It loads into FFmpeg.wasm in your browser — nothing is sent to Slack, Discord, or any GIF host until you paste the finished file yourself. - Step 3Pick a width for the chat client — 480 px (default) reads well inline. For a screen recording with text, keep width around half the capture width (e.g. 640 px from a 1280 capture) so fonts stay legible. Wider = bigger file = more likely to exceed the autoplay threshold.
- Step 4Set FPS to balance smoothness and size — 12–15 FPS is smooth enough for UI demos and keeps the frame count low. Only push toward 24 for genuinely fast motion. FPS is the second-biggest size lever after width.
- Step 5Run the two-pass encode and download — Pass 1 builds the palette, pass 2 encodes the GIF with dithering. Download the
.gif— it's a normal looping GIF ready to paste into a message. - Step 6Paste into Slack or Discord and confirm autoplay — Drop the GIF into the message box. If it shows a click-to-load placeholder instead of autoplaying, it's over the inline threshold — lower width to 360 and FPS to 12 and re-run, or switch to animated WebP (Discord supports it inline).
Slack vs Discord GIF behaviour
How each platform handles GIFs, so you know what to target. Inline autoplay depends on staying under each client's size threshold.
| Platform | GIF inline autoplay | Loops | Animated WebP inline |
|---|---|---|---|
| Slack | Yes, under its size threshold | Yes | Limited — prefer GIF |
| Discord | Yes, under its size threshold | Yes | Yes, supported inline |
| Both | Static placeholder if too big | — | — |
Size-tuning matrix for chat
FPS/width combos and their effect, using the tool's only two controls. Trim short first for the biggest win.
| Target | Width | FPS | Effect on size |
|---|---|---|---|
| Smallest inline GIF | 320–360 | 12 | Smallest; reads fine in a chat thread |
| Default chat GIF | 480 | 15 | Tool defaults; good balance |
| Legible screen-rec text | 640 | 12 | Bigger but keeps small fonts readable |
| Fast motion demo | 480 | 24 | Smoother; noticeably larger file |
If the GIF is still too big
Escalation order when chat won't autoplay your GIF. Each step is a real tool or control.
| Step | Action | Tool / control |
|---|---|---|
| 1 | Lower FPS to 12 | FPS control here |
| 2 | Lower width to 360 | Width control here |
| 3 | Trim shorter | lossless trimmer |
| 4 | Switch to animated WebP (Discord) | video-to-webp |
Cookbook
Recipes for MP4→GIF conversions that autoplay inline in Slack and Discord. Trim short first, then tune FPS and width.
Bug-repro screen recording for a Slack thread
A 6-second screen capture of a bug. Trim to the failing action, keep text legible, dial size down for inline autoplay.
Step 1: lossless-trimmer -> bug_6s.mp4
Step 2: video-to-gif
Width 640 (from 1280 capture), FPS 12
scale=640:-1:flags=lanczos -> readable UI text
-> bug.gif
Paste into Slack -> autoplays inline, teammates see
the repro without clicking.Quick feature demo for a Discord dev channel
Discord autoplays GIFs and supports WebP inline. For a short UI demo, GIF at 480/15 is plenty.
Trim to the 4s demo. video-to-gif: Width 480, FPS 15 -> demo.gif Drop in Discord -> loops inline. If it's borderline on size, video-to-webp gives the same loop at ~30% of the file (Discord plays WebP inline too).
GIF too big for Slack autoplay — shrink it
Slack showed a click-to-load placeholder. Drop width and FPS, re-run.
Was: Width 720, FPS 20 -> placeholder in Slack Now: Width 360, FPS 12 -> autoplays inline No re-trim needed; just rerun the two-pass encode with the smaller numbers.
Crop the IDE chrome before converting
Only the editor pane matters. Crop to it first so the GIF spends its pixels on the relevant region.
Step 1: video-cropper -> editor_region.mp4 Step 2: video-to-gif: Width 600, FPS 12 -> snippet.gif Cropping first means a smaller, sharper GIF because you're not encoding the toolbars and tabs.
Speed up a long install log before GIF-ing
A 40-second install is too long for a chat GIF. Speed it up first, then convert a snappy version.
Step 1: video-speed-controller (2x) -> install_2x.mp4 Step 2: video-to-gif: Width 480, FPS 12 -> install.gif Half the frames -> half the GIF, and the log still reads as a fast-forward demo.
Edge cases and what actually happens
Slack/Discord shows click-to-load instead of autoplaying
Size thresholdBoth platforms only autoplay GIFs under an inline-size limit; over it you get a placeholder. Lower FPS to 12, width to 360, and re-run — or trim the clip shorter. For Discord specifically, animated WebP plays inline at a smaller size.
GIF is bigger than the source MP4
ExpectedGIF lacks H.264's video compression — each frame is a 256-colour image. A small MP4 routinely becomes a larger GIF. That's normal; the goal isn't 'smaller than the MP4' but 'small enough to autoplay'. Width and FPS are your levers.
UI text is unreadable in the GIF
Width too lowSmall fonts need pixels. If you shrank a 1280 capture to 320 px, glyphs blur. Keep the GIF width at roughly half the capture width (e.g. 640 from 1280), or crop to just the relevant pane with the cropper so you can afford a larger effective resolution.
The demo had narration
By designGIF has no audio track, so narration is dropped. For a demo where the talk-track matters, post the MP4 directly (Slack and Discord both play uploaded MP4s with sound), or keep both files. GIF is for the silent, autoplaying loop.
Converted the whole 40-second clip
By designThis tool converts the entire file — there's no trim inside it. A long clip makes a giant GIF that won't autoplay. Trim with the lossless trimmer or speed up with the speed controller first, then convert.
Recording from a screen-capture tool won't decode
Decode errorMost captures are standard H.264 MP4 and decode fine. Some tools emit unusual codecs that FFmpeg.wasm can't handle, failing the palette pass. Re-encode to standard MP4 with the transcoder first, then convert to GIF.
High-DPI capture looks soft after shrinking
ExpectedA Retina/4K capture at 320 px loses most of its detail. Lanczos minimises softening but can't add resolution. Crop to the region of interest first, or accept a larger width — there's a hard trade-off between chat-size and crispness.
Cursor flicker between frames
ExpectedAt low FPS the cursor can appear to jump. Raise FPS to 15–20 for cursor-heavy UI demos so pointer motion reads smoothly, accepting the slightly larger file. There's no cursor smoothing in the tool — FPS is the control.
Frequently asked questions
Why won't my GIF autoplay in Slack/Discord?
It's over the platform's inline-autoplay size threshold, so you get a click-to-load placeholder. Shrink it: drop FPS to 12 and width to 360, or trim the clip shorter, then re-run. For Discord, animated WebP autoplays inline at roughly 30% of the GIF size.
What width should I use for a screen recording?
Roughly half the capture width keeps text legible — 640 px from a 1280 capture, for example. The default 480 px is fine for non-text demos. If small fonts still blur, crop to just the relevant pane first with the cropper so you can use a larger effective resolution.
Does my MP4 get uploaded to a GIF host?
No. The conversion runs entirely in your browser via FFmpeg.wasm. Your MP4 is read and processed locally and the GIF downloads locally — it only reaches Slack or Discord when you paste it yourself. Nothing touches a third-party GIF service, which matters for internal demos.
Is there a watermark?
No watermark and no account required. The output is a clean GIF with nothing stamped on it.
Can I add sound to the chat GIF?
GIF can't carry audio — it's a silent format. For a demo with narration, upload the MP4 directly to Slack or Discord (both play uploaded video with sound), or post the GIF for the silent autoplay loop and link the MP4 for the audio version.
How short should the clip be?
A few seconds. GIF size scales with frame count (FPS times duration), so the most reliable way to stay under the autoplay threshold is to trim short. Use the lossless trimmer for an instant cut, or the speed controller to fast-forward a long log.
What input formats can I convert?
MP4, MOV, MKV, WebM, AVI, M4V, and TS — all decoded in-browser by FFmpeg.wasm. If an unusual capture codec fails to decode, re-encode to standard H.264 MP4 with the transcoder first.
Why two passes — isn't that slower?
Slightly slower, much better looking. Pass one builds a palette from your clip's actual colours; pass two maps frames onto it. A single generic palette bands gradients and dirties screen-recording UI — the two-pass approach is why JAD's chat GIFs stay sharp.
Should I just use WebP for Discord?
Discord supports animated WebP inline, and it's about 30% of the GIF file size at the same quality — so for Discord, WebP is often the better choice. Slack's WebP support is more limited, so GIF is the safer bet there. Pick per platform.
Can I batch-convert several clips?
Batch limits are tier-based: Free is 1 file at a time, Pro is 5, Pro-media 50, Developer unlimited. For a handful of demo clips on Pro you can queue several at once; on Free, convert them one at a time.
How do I keep the GIF small without it looking bad?
Lower FPS before width — going 20→12 FPS halves the frames with little visible loss on UI motion, and is less destructive than shrinking width on text-heavy captures. Then trim short and, if needed, crop to the relevant region. The two-pass palette keeps quality high even at small sizes.
What's the biggest source clip I can convert?
Free tier allows a single source up to 1 GB; Pro is 10 GB, Pro-media 100 GB, Developer 100 GB. There's no duration cap. You can drop a large raw capture and trim it down without re-exporting, since processing is local.
Privacy first
Every JAD Video tool runs entirely in your browser via WebCodecs and FFmpeg (WebAssembly). Your video files never leave your device — verified by zero outbound network requests during processing.