TJ VanToll

My Gif Creation Workflow

| Comments

I’m a big fan of embedding animated gifs in, like, everything. In my opinion, blog posts, tutorials, GitHub issues, tweets, and really, any online medium can occasionally stand to benefit from a quick gif.

I create a lot of these gifs, so I thought I’d share my routine for actually building these things, as I’ve tried several different workflows before ending up with something I like. The tl;dr is I work on a Mac; I use QuickTime to record my screen; and I use a little command-line script to convert the QuickTime-recorded .mov file into a .gif file. If that sounds interesting read on.


I start by opening QuickTime and selecting its File –> New Screen Recording option:

Next, I select the area of the screen I want to record. For instance, in the gif below I select a section of the iOS simulator, and then hit Start Recording.

Once I’ve recorded what I’m interested in showing, I click the stop button in the menu bar to end the recording:

After QuickTime pops up the completed recording, I use QuickTime’s Cmd + T command to trim off the bits at the beginning and end:

After I trim off the edges, I use File –> Save to save the movie as a .mov file. From there the movie is ready for a gif conversion.

I find that this simplistic editing is sufficient for ~95% of the gifs I create. On the rare occasion I need to do some more advanced editing, I use ScreenFlow to prepare the video file.


There are a number of tools for converting movie files into gifs, but I’m a fan of a quick little command-line script I stumbled upon several weeks ago by Sebastiano Poggi:

Personally, I like saving the script above at ~/dev/, as that’s where I tend to dump these type of utility scripts. The script depends on the ffmpeg command-line utility, so before using the script you have to install FFmpeg first.

There are a few different ways you can install FFmpeg, but I find the easiest to be via Homebrew:

$ brew install ffmpeg --with-fdk-aac --with-ffplay --with-freetype --with-frei0r --with-libass --with-libvo-aacenc --with-libvorbis --with-libvpx --with-opencore-amr --with-openjpeg --with-opus --with-rtmpdump --with-schroedinger --with-speex --with-theora --with-tools

All the --with-* flags are optional, and to be completely honest with you I don’t know what the vast majority of them are. I include them all because I occasionally need to create gifs from a variety of movie file types.

Putting it all together

Now that I have a QuickTime-recorded .mov file, and Giffify available at ~/dev/, I can now use the script to create gifs. For example, assuming I have at ~/Desktop/, I can create ~/Desktop/ios.gif using the following command:

$ ~/dev/ ~/Desktop/ ~/Desktop/ios.gif

Here’s what that gif looks like:

The Giffify script allows you to pass a height as the script’s fourth parameter. I tend to use this option whenever I’m concerned about the file size of the generated gif. As an example, I can make a 200px-tall version of the gif above with the following command:

$ ~/dev/ ~/Desktop/ ~/Desktop/ios.gif 200

And here’s what the smaller version of the gif looks like:

And… that’s it. It you have any questions about my workflow feel free to ask in the comments, or share what has worked for you.