08 Aug 2019

Projects

This is a selection of projects I've worked on over the years. It's not an exhaustive list - you can find more of my code on GitHub.

Collaborative editing

TamaWiki

A wiki designed around collaborative text editing developed in Rust, WebAssembly, and React. Still in early development.

Progressive enhancement

Some experiments on designing templates for progressive enhancement. For my thoughts on this see the blog post.

Magery

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

python-magery

Python implementation for server-side rendering.

magery-tests

Test suite to test server implementations against.

CouchDB and Offline First

Kanso (started 2010)   archived

A really powerful set of tools for creating JavaScript apps that ran directly on CouchDB (called CouchApps). Kanso saw a number of real-world uses cases, some of which I was lucky enough to work on, including projects to collect healthcare data in Africa and a First Nations dictionary project in the Northwest Territories.

JavaScript libraries

Async

Utilities for working with JavaScript callbacks, works in both Node.js and the browser. Async provides around 70 functions that include the usual functional suspects (map, reduce, filter, each…) as well as some common patterns for asynchronous control flow (parallel, series, waterfall…).

Highland

High-level streams library for Node.js and the browser, with strict laziness so it can be used to sequence side-effects.

Copy Kitten

A tiny immutable JSON data structures library (< 1kb gzipped). I wrote this for time when Immutable.js was overkill.

Pithy and Pithy2

Experiments in developing ergonomic internal DSLs for generating DOM elements. Pithy2 is a re-write with a more flexible but slightly less pretty API, that includes excellent TypeScript support. It's also a really small module - most the source code is probably type annotations.

Couchr   archived

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

Connect middleware

Node.js libraries designed for use with the Connect HTTP server framework (though easy to use separately, too).

Quip

A convenient chainable API for Node.js HTTP responses.

Dispatch

A really simple URL dispatcher that allows arbitrarily nested regular expressions for matching URLs and calling an associated function.

Nodeunit (2010)   archived

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).

Forms (2010)

A quick way to define, render and validate forms in Node.js. You can tell this was in the early days of NPM because I managed to get the package name 'forms'.

Scheme and C libraries

Raspberry Pi GPIO

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

Punycode

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

Bencode

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

Sodium

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".

CMark

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

TOML

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

LMDB (lolevel)

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

LevelDB

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.

  • level - Abstract interface for level implementations.
  • leveldb - C binding to LevelDB providing a level implementation
  • sublevel - Namespaced access which can exposed as a level implemenation
  • level-sexp - Wraps a level implementation to automatically read/write scheme values

Package management

Jam (started 2012)   archived

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 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).

Erlang

mochiproxy (2012)   archived

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

erlmpd (2009)   archived

A Music Player Daemon (MPD) client module for Erlang.

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.