Software Portfolio - Jeff Hammel


As a software engineer for Automation and Tools team, I have help to develop a variety of tools, harnesses, and libraries, a few of which are highlighted below.

In addition to work found in Mozilla's mercurial repositories and its github repositories, examples of my Mozilla related work may be seen at and in toolbox. Web resoures are also available at

Fall 2011 - present


Mozbase is a project for the development of best of breed python packages for the support of test harnesses and tools related to Mozilla products such as the Firefox web browser. Utilities include profile and addon management, process launching, unification of system information, and test manifests.

Spring 2011


query results from toolbox

toolbox is an AJAX-heavy web presentation of an abstract data model for web resources in the form of fields with numbers of values and a name and URL defining the resource. The form of the fields are flexible and toolbox is intended to support a workflow providing easy and flexible addition and correction of tools in a collaborative setting. toolbox features a plugin architecture, including a data model which may be extended for different backends (currently couchdb, elasticsearch, and files are supported), a RESTful web services, Whoosh for full text search, and flexible deployment suitable for a development environment or production.

Spring 2010 - Summer 2011


Mozmill is a tool for automating Gecko-based applications such as Mozilla Firefox for use as a test harness.


Trac is a python component-architecture issue tracking framework. I've done various work developing Trac plugins and other software to improve Trac for The Open Planning Project's issue trackers as well as deploying and maintaining them. I've also built upon Trac to bring the power of issue tracking systems to real-world applications with software like GeoTrac. I have participated in the Trac community through interaction, plugin development, and contributing patches.

Spring - Autumn, 2009


configurable dashboard view of Active Issues from the GeoTrac demo

GeoTrac is a geo-issue tracker. The GeoTrac software is a TracLegos template that scripts the project creation including custom templates, configuration, and plugins. GeoTrac features a robust architecture focusing on componetization of software and specialization to particular issue-tracking needs.

The core functionality of GeoTrac is provided by Trac plugins written for the software:

geo-locate and map issues using OpenLayers
add and display images for tickets
create and annote Trac tickets via email, including geo-location
...other plugins...
AccountManager, TagsPlugin, etc

Autumn 2008

TracLegos project creation page


TracLegos enables the creation of Trac projects and their encapsulation as PasteScript templates. Trac plugins are installed via install_requires in a Trac project template's file. Trac core and plugin configuration are enscapsulated in trac.ini templates, and wiki pages and custom templates and static resources may be deployed upon project creation. TracLegos also features site configuration which may be used to enable policy for Trac project deployment. TracLegos has a web frontend (a webob_view) allowing through the web project creation and single sign-on, as well as command line and API interfaces. Multiple version control systems and database backends are supported.

Spring - Autumn, 2008

Cross-project time-tracking with the TracHours plugin

Trac Plugin Development

Trac features a powerful component architecture that allows fine-tuned customization of Trac software behaviour on a per-project basis through the use of plugins. is a community-driven website encouraging hosting of Trac plugins and associated software. Plugins I have written, largely commissioned by The Open Planning Project for their Trac projects, are available at my trac-hacks wiki page: Development spanned from end-user facing plugins, such as TracHours and AutocompleteUsers, to software aiding in infrastructure development, such as CreatePluginScript to make plugin creation easy. Trac plugin development often involved interaction with the Trac community. The functionality of the AutoQuery plugin has been included in Trac core and is scheduled to be released with Trac 0.12.

Spring - Summer 2008

Pair Development

Trac provides an easy entry-level experience for plugin development due to its straight-forward component architecture. I have co-developed on Trac with several colleagues at The Open Planning Project, often in the role of tutor.

August 2006 - January 2010

The Open Planning Project

I worked as a software engineer for The Open Planning Project and have undertaken several software projects in that role, primarily web applications using python and supporting tools.

January, 2010

PHP phonebook

Implemented and deployed a PHP phonebook for TOPP's FreePBX phone system. The software interfaces with the smart phone as well as the web interface and MySQL backend so that each employee could keep a permanent phonebook.

Autumn 2009

UncivilSurvey form


Improved and refactored pylons survey tool to report vehicular permit abuse in New York working with the Transportation Alternatives as the client as part of the Uncivil Servants campaign. UncivilSurvey presents a simple web form for mobile devices, checks the submission for legality, and saves the record in a database using SQLObject.

Summer 2009

demomap location of 148 Lafyette St, New York


Developed a demonstration mapping application using a webob view and OpenLayers. The goal of the project was to provide an example platform for encapsulation of mapping best practices for geolocation and use of OpenLayers. The tiles were provided by a GeoServer instance and geopy was used for geolocation of addresses. demomap practices were built on and extended in the development of GeoTrac.

Summer + Autumn 2009


whatsup is an outage escalation and site contact information tool. Web sites and associated metadata, including who is in charge of the sites, are read from .ini files using martINI. LDAP was used both for authentication as well as for contact data. Users could update a subsection of their LDAP entry through the web interface. whatsup is intended as a front end for simple presentation of who is responsible for what site as well as how to report site outages. Utilities were planned for interaction with monitoring tools, issue trackers, and planned site outage tools.

Autumn 2008


listen is a plone mailing list product which is used by opencore. I worked on implementing a UI redesign and fixing and testing the import/export facility, amongst other interaction with the software.

Spring 2007 - Spring 2008

project summary page for the opencore project


opencore is a web-based collaborative workspace for community organizing, featuring wikis, mailing lists, blogs, task tracking, and team management. opencore is built on Zope and plone technologies.

In addition to general work on opencore, I have taken a key role on producing some parts of the software:

Spring 2007

build and deployment system for opencore and other TOPP software using buildit; deprecated by fassembler, no longer maintained

Spring 2007


The Open Planning Project made use of SVN externals for software bundle management. externalator is a tool written to manage subversion externals. externalator features an command line interface similar to svn for adding, deleting, freezing, and displaying SVN externals.

Winter 2006


Sample pylons application to retrieve the contact information of government representatives given an address. No longer maintained.

Autumn 2006


membrane and remember are plone products for authentication. membrane provides pluggable authentication service plugins, and remember is a reference implementation of a plone member object. My work consisted of implementing password salting and hashing using bcrypt and various other work. Both products are used by by opencore.

Python Packages

I have also developed on my own time several pieces of software as part of building my website or just for fun because coding is enjoyable. Stable versions of these packages may be found on the cheeseshop and the source is hosted at my mercurial repository. Many of these are webob views. I love collaboration, so while I don't have nearly as much time to flush out these projects as I would like, if you'd be interested in working on any of these projects with me, I'd love to hear from you!


dynamic index listing generated by decoupage

decoupage is a webob view that allows customizable generated index files for conceptual directories. The index files are genshi templates which can be overwritten on a per-site and per-directory basis. decoupage includes pluggable formatters using setuptools entry points that allow for the manipulation of template data prior to rendering. decoupage uses martINI to process the .ini files used for its configuration. decoupage is a main component of, as explained in the page about this site. decoupage utilizes contenttransformer to adaptively serve static files.

example montage gallery using the background.html template


montage is a decoupage formatter plugin for displaying image galleries controlled by the /image keyword in decoupage .ini files. montage utilizes cropresize for thumbnail creation if specified in the configuration. Several templates are included to allow images to be displayed in a variety of contexts.

illustration of a transformation from a graphviz dot file to a PNG image


contenttransformer enables transformation of content of one type into content of another type via pluggable transformers. Some transformers are included with contenttransformer:

transforms graphviz dot files into PNG images
transforms reStructuredText to HTML
Though many more can be imagined or you can write your own to plugin to the [content_transformers] entry point.


cropresize uses PIL to crop and resize an image as appropriate for web presentation. cropresize is a convenience package that allows image resizing without aspect ratio distortion.


martINI is an extended facility for utilizing .ini files in python. includes API, command-line, and web interfaces. martINI is built on the ConfigParser module, which is part of python's standard library, though INITools may be worth refactoring for.


bitsyblog is a minimalist blog using genshi templates. Blog entries are stored as files on the filesystem with a datestamp and according to the permissions set by the blogger (public, secret, or private). In addition to a web interface, bitsyblog features a command line blog program.


manage redirects through the web in WSGI middleware. It is more of a vision at this point, but I hope to fill in that vision as time permits.


smartopen provides a system of pluggable handlers to convert input to URLs. I use this as bound to a fluxbox key stroke to open what is on my X clipboard, but other applications could be an IRC bot plugin or a TTW tool to guess links. Each handler checks to see if the input matches its link, and open it in Firefox or do other processing as dictated by command line options.


Example wordstream output. Odd-number lines are from the wordstream program

wordstream is a corpus of text associations with web and command line applications to interact with the associations. One interface, wordstream, allows direct interaction with the corpus from the command line or a browser (using jQuery AJAX functions to fetch the words). Another interface, dissociate, scrambles a set of text and rearranges like emacs' M-x dissociated-press. Feeding the corpus text will grow a stack of left to right word associations on a per word basis. The corpus can then be eaten: given a word, pop the top of its stack.

PasteScript Templates

PasteScript provides a pluggable file template system for the easy initialization of python and other file-based projects. I have created PasteScript templates to aid in my code development and also use PasteScript's template module an engine for TracLegos.

PasteScript templates play an important part in my software development process. Best practices and example usage may be encapsulated in the templates, and lessons from development may be backported as appropriate to iteratively improve the process of software development.


The webob_view template deploys a simple dispatcher system using webob that makes it easy to write small web applications.


extends webob view with genshi templates and serves static files including a version of jQuery.


a template to create other PasteScript templates


a template to create applications with a command line entry point