This page lists my software projects and other smaller pieces of code which I've created at one point or another that might be of use to someone. Please send any questions or feedback to


I am the author and maintainer of IMAPClient, an easy-to-use, idomatic and complete IMAP client library for Python. It has its own website at

Raspberry Pi VU Meter

My wife and I have been working on a Raspberry Pi based media server with a built-in analog VU meter. There's some articles about this project on the blog.


elemental is an Emacs extension that provides elisp functions for "intelligently jumping between and transposing list/tuple/dictionary/function-parameter elements". It's hosted on bitbucket:


This is a fairly rough extension to Thunderbird that provides Mutt-like key bindings and functionality.

It is heavily used by the author every day but could do with some cleaning up, documentation etc. If you're interested in using it yourself, please email

mongrel is hosted on bitbucket:

rst_break - PyBlosxom plugin

This plugin allows the rst (reStructured Text) and readmore plugins to work together. It defines a reST "break" directive which will trigger the readmore plugin's breakpoint functionality. See the documentation at the top of the file for more information.

Download: (version 0.1)

This plugin is hosted on bitbucket:

draftsdir - PyBlosxom plugin

This simple plugin allows you to define a directory under your datadir that contains draft blog entries. Draft entries will not be displayed on the blog by default. To display drafts add a 'drafts' query parameter to the end of the page URL (for example or

Installation and configuration information is at the top of

Download: (version 0.1)

This plugin is hosted on bitbucket:

spamquestion - PyBlosxom plugin

spamquestion is a simple PyBlosxom plugin that helps to prevent comment spam.

A randomly selected question is shown on the comment form for a blog entry. The user must answer the question correctly in order to submit a comment. The approach works because each blog will use it's own set of unique questions that are easy for a human to deal with but are virtually impossible for a computer to answer unaided. This prevents makes automated spambots ineffective.

Unlike CAPTCHA based anti-spam systems, this approach does not disadvantage visually impaired users and works even in text only browsers.

Download: (version 0.2)

This plugin is hosted on bitbucket:

A quick hack to import PyBlosxom comments into the Disqus Comments API.

See the instructions and parameters at the top of file.



ssh-agent-applet is a Gnome applet that allows you to conveniently keep your ssh key(s) on external media. This means that if your computer is cracked or stolen, the attacker will not have a copy of private ssh key(s).

Using ssh-agent-applet, your keys are loaded into ssh-agent as soon as you insert your "key drive" into a USB port. The drive is automatically unmounted once the key loaded so you can remove it from the USB port immediately.

For developers, ssh-agent-applet is an example of how to write Gnome applets in Python and how to interface with HAL from Python using DBUS.

ssh-agent-applet is at version 0.1.


ssh-agent-applet is hosted on bitbucket:

An example of how to mix 2 arbitrary audio files over the top of each other in real time. This isn't terribly useful by itself but should help people out who are struggling with the lack of GStreamer documentation out there. It demonstrates how to load arbitrary audio files and perform mixing of multiple audio sources.