npx skills add ...
npx skills add zc277584121/marketing-skills --skill video-to-gif
Convert a video to multiple GIF variants with different quality/size tradeoffs. Generates a comparison set so the user can visually pick the best result.
npx skills add zc277584121/marketing-skills --skill video-to-gif
Convert a video file into multiple GIF variants with different parameters, so the user can visually compare and pick the best one.
Prerequisite: FFmpeg and uv must be installed. gifsicle is optional (enables lossy compression variants).
The user wants to create a GIF from a video clip but isn't sure about the right parameters. GIF quality involves tradeoffs between:
Rather than guessing, this skill generates multiple variants and lets the user decide.
When the user provides a video file:
This generates GIFs in <input>_gifs/ directory with the full preset (18 variants):
Output includes a sorted comparison table showing file size, FPS, width, and colors for each variant.
| Preset | Variants | Best For |
|---|---|---|
full | ~18 | General use — broad exploration of the parameter space |
minimal | ~4 | Quick comparison — just a few key tradeoff points |
lossy | ~12 | Smallest files — includes gifsicle lossy compression levels |
quality | ~12 | Best visuals — higher res, includes bayer dithering |
| Flag | Default | Description |
|---|---|---|
-o, --output-dir | <input>_gifs/ | Output directory for all GIF variants |
--start | none | Start time in seconds (trim source) |
--end | none | End time in seconds (trim source) |
--presets | full | Preset config: full, minimal, lossy, quality |
--fps | preset | Override FPS values (e.g., --fps 10 15 20) |
--width | preset | Override width values (e.g., --width 480 640) |
--colors | preset | Override color counts (e.g., --colors 128 256) |
--lossy | preset | Gifsicle lossy levels (e.g., --lossy 0 30 80) |
After running, open the output directory and compare:
The sweet spot for most screen recordings is usually around 640px, 15fps, 256 colors.
--start/--end first — GIFs over 10 seconds can get very large.# Convert first 10 seconds of a video
uv run --python 3.12 .../video_to_gif.py demo.mp4 --end 10
# Extract a specific segment
uv run --python 3.12 .../video_to_gif.py demo.mp4 --start 5 --end 15
# Custom parameter sweep
uv run --python 3.12 .../video_to_gif.py demo.mp4 --fps 12 15 --width 480 800 --colors 256
# Lossy compression comparison (needs gifsicle)
uv run --python 3.12 .../video_to_gif.py demo.mp4 --lossy 0 30 60 100