From claude-content
Converts video clips to high-quality GIFs using ffmpeg 2-pass palette workflow with palettegen and paletteuse for optimal colors and dithering. Gathers start time, duration, width, FPS.
npx claudepluginhub gupsammy/claudest --plugin claude-contentThis skill is limited to using the following tools:
Convert a video clip to a high-quality GIF using the mandatory 2-pass palette workflow.
Converts webm/mp4 videos to optimized GIFs using ffmpeg with quality presets like palette generation and dithering. For demo animations from recordings.
Converts image sequence folders or sprite sheets to GIF animations with custom FPS, grid layouts (e.g., 4x4), looping, and auto-compression to size limits like 950KB for WeChat stickers.
Guides converting videos to image frame sequences (JPG/WebP) for smooth web scroll animations using EZGif or FFmpeg. Use for AI-generated videos, MP4 extraction, or scroll-based effects.
Share bugs, ideas, or general feedback.
Convert a video clip to a high-quality GIF using the mandatory 2-pass palette workflow.
Single-pass GIF always produces banding and color artifacts. The palettegen → paletteuse pipeline analyzes the actual clip to build an optimal 256-color palette, then renders with it. Never skip this.
Ask for any not already provided in the request:
0480px; height auto-calculated to preserve aspect ratio15; higher = smoother + larger fileIf the user asks about aspect ratio or the source has unusual dimensions, probe first:
ffprobe -v quiet -print_format json -show_streams "$INPUT" | \
python3 -c "import json,sys; s=[s for s in json.load(sys.stdin)['streams'] if s['codec_type']=='video'][0]; print(s['width'], 'x', s['height'])"
Pass 1 — generate optimized palette:
ffmpeg -ss $START -t $DURATION -i "$INPUT" \
-vf "fps=$FPS,scale=$WIDTH:-1:flags=lanczos,palettegen=stats_mode=full" \
/tmp/palette_$$.png -y
Pass 2 — render GIF using palette:
ffmpeg -ss $START -t $DURATION -i "$INPUT" -i /tmp/palette_$$.png \
-lavfi "fps=$FPS,scale=$WIDTH:-1:flags=lanczos [x]; [x][1:v] paletteuse=dither=bayer:bayer_scale=5" \
"$OUTPUT" -y
Use $$ (shell PID) in the palette temp path to avoid collisions with concurrent runs.
Show the full 2-pass command and estimated output path. Add a size warning if duration × fps is large (rough heuristic: >20s at 15fps at 480px → likely >10MB).
rm -f /tmp/palette_$$.png
Report output path and file size.
stats_mode=full on palettegen analyzes the entire clip — not just the first frame — for better palette coverage across motion.dither=bayer:bayer_scale=5 is the sweet spot for photographic content. Use dither=none for flat-color content (illustrations, slides, screen recordings with solid backgrounds).-ss placed before -i uses container-level fast seek. Apply to both passes for consistent start points and dramatically faster seeks on long source files.flags=lanczos on scale gives sharper downsampling than the default bilinear.-loop $N to pass 2: 0 = infinite, 1 = play once, 2 = play twice.