This repository has been archived by the owner. It is now read-only.
Utility for auto-generating screenshots for exercises
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
webkit2png @ a52a048



exercise-screens is a utility that renders PNG screenshots of every static and Perseus exercise on Khan Academy. It is a very simple script that fetches a list of exercises from /api/v1/exercises and runs webkit2png on each one. The resulting images are stored in an Amazon S3 bucket for use in various places on the site.

For historical reasons, exercise-screens generates two versions of each screenshot. The first is a "full-size" screenshot that can be any dimensions but contains the entire <div id="problemarea">. The second is a cropped square screenshot whose dimensions are guaranteed to be 256 by 256 pixels. However, this behavior is easily customizable if you'd like differently sized output.

The first version of exercise-screens used PhantomJS to capture screenshots, but now it uses spicyj's fork of webkit2png and therefore only runs on Mac OS X now. The only other prerequisite is ImageMagick; Homebrew users can get it by running the command brew install imagemagick.

Setting up exercise-screens

git clone
cd exercise-screens
git submodule update --init
[sudo] pip install -r requirements.txt

Then customize the S3 bucket name in and create a file named containing your Amazon Web Services credentials. See for an example of how your should look.

Running exercise-screens

Once your S3 credentials and bucket name are configured, simply run ./ The script will tell you what it is currently processing and how many errors it encounters. An error is not the end of the world; there currently exist some small inconsistencies in the Khan Academy content entities that cause some exercises to have URLs that don't exist.

To run exercise-screens at regular intervals, you can set it up as a LaunchAgent, which is like a cron job on OS X steroids. After customizing the example plist, do the following:

cp org.khanacademy.exercise-screens.plist.example ~/Library/LaunchAgents/org.khanacademy.exercise-screens.plist
launchctl load ~/Library/LaunchAgents/org.khanacademy.exercise-screens.plist

and then exercise-screens will be executed periodically by the system.

You might also be interested in setting up a custom error document for your S3 bucket, which will let you serve a nice placeholder image instead of an ugly 404 in the event that someone tries to access a screenshot that doesn't exist.