Open source software

Below is a selection of my open source work. The full archive of my open source software is available on GitHub.


Jit is a stripped-down but well-developed Git client written in pure Ruby, as presented in my book Building Git. It supports most of the common commands for creating commits, branching and merging, viewing the history, and pushing and fetching content between repositories.


Faye is a realtime messaging product for the web, aiming to make it straightforward for developers to deploy publish/subscribe messaging in their Ruby and Node.js applications. It has been very widely adopted and has spawned a set of WebSocket libraries for both platforms.

websocket-driver (Ruby, Node) implements the complete WebSocket protocol, including historical support for old versions of the protocol that saw deployments in browsers. This library is designed to be combined with many different I/O and server implementations, allowing integration into users’ preferred platform. It is used as the basis of the WebSocket support in Rails and the Webpack dev server, among many others.

faye-websocket (Ruby, Node) provides an implementation of the standard WebSocket API for Ruby and Node, built on top of websocket-driver. In Ruby it uses the EventMachine I/O library and integrates with Passenger, Puma and Thin. In Node it integrates with the standard library HTTP and TCP/TLS modules.

websocket-extensions (Ruby, Node) provides a framework for extending the WebSocket protocol. It defines a set of APIs that parser libraries and extension plugins to implement and facilitates their interoperation, making sure headers are negotiated correctly and messages flow through the extensions in the right order. It is used inside websocket-driver.

permessage-deflate (Ruby, Node) implements support for per-message compression in the WebSocket protocol, as a plugin for websocket-extensions. It can thus be used with websocket-driver, faye-websocket, and Faye itself.


Vault is a password manager, available both online and as a command-line program. It uses HMAC to deterministically generate unique service passwords based on a master passphrase, without the need to necessarily store any secrets. When used on the command-line, it does allow storage of settings in an encrypted format using storeroom, a cross-platform library providing an encrypted filesystem-like key-value store.


Canopy is a PEG parser generator. Given a grammar description, it can generate a parser for that grammar in JavaScript, Ruby, Python, or Java. It allows the parser’s behaviour to be extended in a language-agnostic way, by declaring typed extensions for parse tree elements and functions that should be called to construct the tree during parsing.


jstest is a cross-platform JavaScript testing framework. It is the tool I use to test all my own JS work, and is also used to teach unit testing in my book, JavaScript Testing Recipes.


Terminus is a driver for the Ruby browser testing framework Cabybara. Using a WebSocket connection to the browser, it lets the user script any page running in any browser on any device, allowing for true cross-platform integration testing. It uses Faye for its network protocol, as well as pathology, a JavaScript implementation of XPath, which itself is based on my Canopy parsing library.


Infer is an experimental minimalist logic programming language, designed for the direct expression of logic rules and the automated production of proof diagrams. It provides only a system for logic inference, with little baked-in syntax and no built-in data structures or libraries. It lets the user build up a logic from the smallest possible ingredients to model their problem.


tnt, short for typographic number theory, is an implementation of the formal system of the same name presented in Gödel, Escher, Bach. It provides a tool for working through proofs in this system, making sure that only proofs that follow the rules are accepted.


Fargo is a Lisp-family programming language written in JavaScript. Based on R5RS Scheme, it supports tail recursion, hygienic macros, and delimited continuations. It reuses the core library from Heist, an earlier Scheme-like language I wrote in Ruby, which supports reusable call/cc continuations.

This entry was posted in Bookmark the permalink.