🛠️ Software

A few of the software projects I've worked on over the years.


A prototype handheld device to test low-power displays and chorded input.

Build log

JavaScript Libraries

Popular async utilities for node.js and the browser.

High-level lazy streams library.

Tiny immutable data structures.

Ergonomic internal DSL for creating DOM elements.

Convenient chainable API for node.js HTTP responses.

Simple URL dispatcher using nested regular expressions.

Progressive Enhancement

Some experiments on designing templates for progressive enhancement.

JavaScript implementation of the template engine. Allows incremental DOM updates based on server-rendered templates.

Python implementation for server-side rendering.

Test suite to test server implementations against.

CHICKEN Scheme Libraries

Provides a CHICKEN Scheme interface to the Raspberry Pi GPIO pins. Co-authored with Jörg F. Wittenberger.

Scheme implementation of RFC 3492. Encodes internationalised domain names in the ASCII subset supported by DNS.

Scheme code to parse and serialise Bencode, the encoding used by BitTorrent for storing and transmitting loosely structured data.

Partial Scheme bindings to the libsodium crypto library, a "portable, cross-compatible, installable, packageable fork of NaCl, with a compatible API, and an extended API to improve usability even further".

Parser for CommonMark, a more highly specified version of Markdown. This is a very simple binding to the libcmark library.

Scheme implementation of a TOML markup parser. Passes toml-test suites for encoding and decoding.

A fast HTTP server for CHICKEN Scheme based around Joyent's http-parser C library (used internally by Node.js).

Low level bindings to Lightning Memory-Mapped Database (LMDB) for CHICKEN Scheme, closely following the C API (but without the manual memory management).


Complementary CHICKEN Scheme packages for working with LevelDB, a key/value database library by Google. The abstract interface is provided by the level egg, and the real LevelDB backed store is implemented in the leveldb egg. This is similar to the LevelUP / LevelDOWN split used in the Node.js bindings.

Abstract interface for level implementations.

C binding to LevelDB providing a level implementation.

Namespaced access which can exposed as a level implemenation.

Wraps a level implementation to automatically read/write scheme values.

Rust Packages

Macros for creating request routers in hyper. Created to more easily support async request handlers. Less necessary now with async/await support in rust.

Drive a Sharp Memory Display module from a Raspberry Pi. Written for the Bramley project.

Zig Packages

A simple parser for netstrings written in Zig.

Archived projects

Some older projects no longer in active development.

One of the very first unit testing frameworks for Node.js. It provided a simple TDD and export based syntax later used by expresso (which itself was later replaced by Mocha).

An easy way to create, parse, and validate forms in Node.js.

A JavaScript package manager focused on the browser. It was created slightly before Bower and provided a (still to this day) very nice installation workflow which meant you could jam install jquery, then immediately require("jquery") in your frontend application using RequireJS - no manual build step (e.g. Browserify, Webpack) required.

Of course, it failed to gain much traction, and there has since been a huge amount of development in this space with projects like Yarn and Webpack, and NPM positioning itself as a more general JavaScript repository (not just Node.js).

Secure cookie-based session middleware for Connect.

A lightweight client for CouchDB for Node.js and the browser.

Standalone code based on CouchDB's proxy module for proxying mochiweb requests.

A Music Player Daemon (MPD) client module for Erlang. Read the original article. I'm not sure, but this might be my first open-source code! It's either that or a Erlang language definition for the SHJS highlighting library.


Kanso was a set of tools for creating JavaScript apps that ran directly on CouchDB (called CouchApps). In 2012, I made a short screencast about it:

Your application code and database could be easily shared with other users via CouchDBs multi-master replication. Kanso saw a number of real-world uses cases, including projects to collect healthcare data in Africa and a First Nations dictionary project in the Northwest Territories where Kanso's ability to quickly develop seamless offline experiences proved invaluable.

Ultimately, I retired Kanso and joined other CouchApp developers on the Hood.ie project: a separate application layer that could sit in front of CouchDB and provide capabilities to extend the original CouchApp concept: