Skip to content
Create a gist now

Instantly share code, notes, and snippets.

@SlexAxton /.zshrc
Last active

My gif workflow
gifify() {
if [[ -n "$1" ]]; then
if [[ $2 == '--good' ]]; then
ffmpeg -i $1 -r 10 -vcodec png out-static-%05d.png
time convert -verbose +dither -layers Optimize -resize 600x600\> out-static*.png GIF:- | gifsicle --colors 128 --delay=5 --loop --optimize=3 --multifile - > $1.gif
rm out-static*.png
ffmpeg -i $1 -s 600x400 -pix_fmt rgb24 -r 10 -f gif - | gifsicle --optimize=3 --delay=3 > $1.gif
echo "proper usage: gifify <>. You DO need to include extension."
brew install ffmpeg
brew tap phinze/homebrew-cask
brew install brew-cask
brew cask install x-quartz
open /usr/local/Cellar/x-quartz/2.7.4/XQuartz.pkg
# click through the stuff
brew install gifsicle
brew install imagemagick
# I had a weird problem with Convert/imagemagick where I had to do:
ln -s /usr/local/Cellar/libtool/2.4.2/lib/libltdl.7.dylib libltdl.7.dylib
# But hopefully you don't have to
# Take screencast using Quicktime. Export as high quality as possible.
gifify --good

An example!


The GIFs work fine in a browser, but a couple image viewers (Xee, ACDSee) only show the first frame and give a vague loading error message.

Any chance of removing the movie's file extension so the name ends up as screencap.gif instead of


This is definitely targeted at going along with pull requests, so that's ok with me re: browsers only.

I think that's possible. I'll have to read up on bash scripting for the 10000th time, but I'm sure it's nothing crazy. Happy to take a suggestion :D


Does it matter what you used to record the original video file? What did you use to record


I use QuickTime (free) or Screeny (pretty).

Just save in native quality for best results.


feature request: palindromic looping (back n forth)!

also the --good setting is incredible. same quality as what i got with GifBrewery but 20% of the size. dayum.


Looks like the location of x-quartz has moved to /usr/local/Caskroom/x-quartz/2.7.4, so line 5 in should be:

open /usr/local/Caskroom/x-quartz/2.7.4/XQuartz.pkg

I kept getting this error:

Incompatible library version: convert requires version 11.0.0 or later, but libltdl.7.dylib provides version 10.0.0

I fixed it with this command brew link libtool --force


does this require zsh?

edit: nope. just threw the .zshrc code into my .bashrc and it works fine.


Brew Cask put the package for XQuartz into /opt/homebrew-cask/Caskroom/x-quartz/2.7.4

If that helps anyone.


Quality is pretty amazing.




Regarding "", try:

+ GIF="${1%.*}.gif"
  if [[ $2 == '--good' ]]; then
    ffmpeg -i $1 -r 10 -vcodec png out-static-%05d.png
-   time convert -verbose +dither -layers Optimize -resize 600x600\> out-static*.png  GIF:- | gifsicle --colors 128 --delay=5 --loop --optimize=3 --multifile - > $1.gif
+   time convert -verbose +dither -layers Optimize -resize 600x600\> out-static*.png  GIF:- | gifsicle --colors 128 --delay=5 --loop --optimize=3 --multifile - > $GIF
    rm out-static*.png
-   ffmpeg -i $1 -s 600x400 -pix_fmt rgb24 -r 10 -f gif - | gifsicle --optimize=3 --delay=3 > $1.gif
+   ffmpeg -i $1 -s 600x400 -pix_fmt rgb24 -r 10 -f gif - | gifsicle --optimize=3 --delay=3 > $GIF

If you're wondering what the GIF line is about:

$ FOO=""
$ echo "${FOO%.*}.gif"

use brew cask install xquartz if you get Error: No available cask for x-quartz


Not sure if anyone cares about the output, but I like to make my bash functions quiet and less verbose... Here is my stab at it. The output of the command is much prettier. I also added the ability to scale it to a max width (via an argument to the gifify command)...

function gifify {
  if [ -z "$1" ]; then
    echo "$(tput setaf 1)No input file given. Example: gifify [max width (pixels)]$(tput sgr 0)"
    return 1


  echo "$(tput setaf 2)Creating $output_file...$(tput sgr 0)"

  if [ ! -z "$2" ]; then
    maxsize="-vf scale=$2:-1"

  ffmpeg -loglevel panic -i $1 $maxsize -r 10 -vcodec png gifify-tmp-%05d.png
  convert +dither -layers Optimize gifify-tmp-*.png GIF:- | gifsicle --no-warnings --colors 256 --delay=10 --loop --optimize=3 --multifile - > $output_file
  rm gifify-tmp-*.png

  echo "$(tput setaf 2)Done.$(tput sgr 0)"

Hmm....I'm getting the following:

convert: unable to load module `/usr/local/Cellar/imagemagick/6.8.9-1/lib/ImageMagick//modules-Q16/coders/': file not found @ error/module.c/OpenModule/1282.
convert: no decode delegate for this image format `PNG' @ error/constitute.c/ReadImage/501.
convert: no images defined `GIF:-' @ error/convert.c/ConvertImageCommand/3187.

I checked and that file exists. I've reinstalled imagemagick and libpng umpteen times now. Not sure what else to try


Few issues getting stuff installed, Xquartz seems to have changed names and versions, but now getting an error gifify:7: command not found: ffmpeg any thoughts? :(


@thatryan It sounds like ffmpeg didn't install right.

  • Try running the command ffmpeg, if that seems to fail, try installing again brew install ffmpeg.
  • If brew seems to be unhappy about that, try brew doctor

afaik the can now just be

brew install ffmpeg gifsicle imagemagick

i don't believe xquartz is at all neccessary. (not sure why it was.)


Worked pretty good for me.

brew install ffmpeg gifsicle imagemagick

Thanks @paulirish & @slexaxton


Wow, I like @tonycoco's solution. Well done!


I've added the gifify function to my bash-it fork: nwinkler/bash-it@e4bdad6


There's now an installable binary for that, lots of options, optimized!


I get error on that command: brew install brew-cask

Error: Failed to download resource "brew-cask"
Failure while executing: git clone --depth 1 --branch v0.53.3 /Library/Caches/Homebrew/brew-cask--git


Anyone come across this error?

Incompatible pixel format 'rgb24' for codec 'gif', auto-selecting format 'rgb8'


If this helps anyone, my XQuartz location ended up being:
open /opt/homebrew-cask/Caskroom/xquartz/2.7.7/XQuartz.pkg
I assume that's due to the update to 2.7.7?


thatryan: Yes, I have that error (Yosemite). No idea what to do about it.


For those looking to install @vvo's gifify with prerequisites:

# install pornel/giflossy (fork of gifsicle)
unzip -d gifsicle-1.82.1-lossy
cp gifsicle-1.82.1-lossy/mac/gifsicle /usr/local/bin/
# install ffmpeg
brew install ffmpeg --with-fontconfig --with-libass
# install imagemagick
brew install imagemagick --with-fontconfig
# install gifify
npm install -g gifify

Thanks @vvo, @pornel, @paulirish, @SlexAxton, and internets.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.