Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Converts webm/mp4 video files to optimized GIFs via ffmpeg with configurable quality settings. Use when post-processing recordings into shareable GIFs.
.claude/skills/athola-gif-generation/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 50% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 106% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 11% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 44% | 0% |
Post-process video files (webm/mp4) and generate optimized GIF output with configurable quality settings.
This skill handles the conversion of video recordings (typically from browser automation) to GIF format. It provides multiple quality presets and optimization options to balance file size with visual quality.
- Validate input video file exists
- Check ffmpeg installation
- Execute GIF conversion
- Verify output and report resultsVerification: Run the command with --help flag to verify availability.
Confirm the source video file exists and is a supported format:
bash# Check file exists and get info if [[ -f "$INPUT_FILE" ]]; then file "$INPUT_FILE" ffprobe -v quiet -show_format -show_streams "$INPUT_FILE" 2>/dev/null | head -20 else echo "Error: Input file not found: $INPUT_FILE" exit 1 fi
Verification: Run the command with --help flag to verify availability.
Supported input formats: .webm, .mp4, .mov, .avi
Verify ffmpeg is available:
bashif ! command -v ffmpeg &> /dev/null; then echo "Error: ffmpeg is not installed" echo "Install with: sudo apt install ffmpeg (Linux) or brew install ffmpeg (macOS)" exit 1 fi ffmpeg -version | head -1
Verification: Run the command with --help flag to verify availability.
Choose the appropriate conversion command based on quality requirements:
bashffmpeg -i input.webm -vf "fps=10,scale=800:-1" output.gif
Verification: Run the command with --help flag to verify availability.
bashffmpeg -i input.webm -vf "fps=10,scale=800:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" output.gif
Verification: Run the command with --help flag to verify availability.
bashffmpeg -i input.webm -vf "fps=15,scale=1024:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=256:stats_mode=single[p];[s1][p]paletteuse=dither=bayer:bayer_scale=5" output.gif
Verification: Run the command with --help flag to verify availability.
| Option | Description | Recommended Value | |--------|-------------|-------------------| | fps | Frames per second | 10-15 for smooth, 5-8 for smaller files | | scale | Width in pixels (-1 maintains aspect ratio) | 800 for web, 480 for thumbnails | | flags=lanczos | High-quality scaling algorithm | Always use for best quality | | palettegen | Generate optimized color palette | Use for quality-critical output | | dither | Dithering algorithm | bayer for patterns, floyd_steinberg for smooth |
bash# Thumbnail (small, fast loading) ffmpeg -i input.webm -vf "fps=8,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" thumbnail.gif # Documentation (balanced) ffmpeg -i input.webm -vf "fps=10,scale=800:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" docs.gif # High-fidelity demo ffmpeg -i input.webm -vf "fps=15,scale=1024:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=256[p];[s1][p]paletteuse" demo.gif
Verification: Run the command with --help flag to verify availability.
Confirm successful conversion and report metrics:
bashif [[ -f "$OUTPUT_FILE" ]]; then echo "GIF generated successfully: $OUTPUT_FILE" # Report file size SIZE=$(du -h "$OUTPUT_FILE" | cut -f1) echo "File size: $SIZE" # Get dimensions and frame count ffprobe -v quiet -select_streams v:0 -show_entries stream=width,height,nb_frames -of csv=p=0 "$OUTPUT_FILE" else echo "Error: GIF generation failed" exit 1 fi
Verification: Run the command with --help flag to verify availability.
Reduce quality settings:
bash# Lower fps and resolution ffmpeg -i input.webm -vf "fps=8,scale=640:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" smaller.gif
Verification: Run the command with --help flag to verify availability.
Use dithering:
bashffmpeg -i input.webm -vf "fps=10,scale=800:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse=dither=floyd_steinberg" smooth.gif
Verification: Run the command with --help flag to verify availability.
Use basic conversion without palette generation for speed:
bashffmpeg -i input.webm -vf "fps=10,scale=800:-1" quick.gif
Verification: Run the command with --help flag to verify availability.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 4,124 | 7,692 | +87% | 1 | 1 | 0% | 404 | 2,330 | +477% | 0 | 0 | — |
case-02 | fail→fail | 3,488 | 7,855 | +125% | 1 | 1 | 0% | 336 | 2,242 | +567% | 0 | 0 | — |
case-03 | fail→fail | 3,306 | 6,382 | +93% | 1 | 1 | 0% | 278 | 2,131 | +667% | 0 | 0 | — |
case-04 | fail→fail | 15,451 | 12,135 | -21% | 1 | 1 | 0% | 2,419 | 3,922 | +62% | 0 | 0 | — |
case-05 | fail→pass | 14,853 | 10,044 | -32% | 1 | 1 | 0% | 2,198 | 3,307 | +50% | 0 | 0 | — |
case-06 | fail→pass | 15,285 | 14,060 | -8% | 1 | 1 | 0% | 2,066 | 4,263 | +106% | 0 | 0 | — |
case-07 | fail→pass | 10,950 | 3,316 | -70% | 1 | 1 | 0% | 1,708 | 2,354 | +38% | 0 | 0 | — |
case-08 | pass→pass | 8,920 | 4,394 | -51% | 1 | 1 | 0% | 1,671 | 2,524 | +51% | 0 | 0 | — |
case-09 | pass→pass | 9,507 | 8,057 | -15% | 1 | 1 | 0% | 1,713 | 3,289 | +92% | 0 | 0 | — |
case-10 | pass→pass | 5,754 | 3,288 | -43% | 1 | 1 | 0% | 1,000 | 2,321 | +132% | 0 | 0 | — |
case-11 | pass→pass | 7,249 | 14,642 | +102% | 1 | 1 | 0% | 1,250 | 2,704 | +116% | 0 | 0 | — |
case-12 | fail→pass | 12,597 | 5,025 | -60% | 1 | 1 | 0% | 2,312 | 2,574 | +11% | 0 | 0 | — |
case-13 | pass→pass | 5,209 | 2,299 | -56% | 1 | 1 | 0% | 865 | 2,143 | +148% | 0 | 0 | — |
case-14 | pass→pass | 7,150 | 1,719 | -76% | 1 | 1 | 0% | 1,030 | 2,051 | +99% | 0 | 0 | — |
case-15 | fail→pass | 11,427 | 6,016 | -47% | 1 | 1 | 0% | 1,972 | 2,832 | +44% | 0 | 0 | — |
case-16 | fail→pass | 12,897 | 8,049 | -38% | 1 | 1 | 0% | 2,217 | 3,330 | +50% | 0 | 0 | — |
case-17 | fail→fail | 9,158 | 5,110 | -44% | 1 | 1 | 0% | 1,592 | 2,663 | +67% | 0 | 0 | — |
case-18 | fail→pass | 7,464 | 2,368 | -68% | 1 | 1 | 0% | 1,121 | 2,150 | +92% | 0 | 0 | — |
case-19 | fail→pass | 6,903 | 1,935 | -72% | 1 | 1 | 0% | 998 | 2,020 | +102% | 0 | 0 | — |
case-20 | pass→pass | 8,525 | 3,607 | -58% | 1 | 1 | 0% | 1,454 | 2,326 | +60% | 0 | 0 | — |
case-21 | fail→pass | 10,581 | 3,656 | -65% | 1 | 1 | 0% | 1,715 | 2,362 | +38% | 0 | 0 | — |
case-22 | pass→pass | 12,266 | 9,531 | -22% | 1 | 1 | 0% | 2,067 | 3,492 | +69% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +41 percentage points is the difference between those two pass rates over the 20 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.