My open source work in 2016

I've been going back over the work I've done this year and thought it would be helpful to write it down. I find it helpful to reflect on what I've built, and as a reader you might find it helpful to see what a year of active open source involvement can look like.

Throughout this year I discovered a few things about myself & open source work:

This post outlines most of the open source work I did this year, and doesn't cover most of the closed-source or client-focused work I did. I was lucky this year to work with the Freeman Lab at Janelia Research Campus, where I worked on open source projects, and to receive a Shuttleworth Flash Grant for open source work (read more about that here).

Winter/Spring 2016

State management

During the late fall of 2015 and the winter of 2016 I spent a lot of time learning about and implementing unidirectional data flow modules. My first project was rewriting redux using ES5, without support for middleware, and using an event system that gave more flexibility in listening to state changes. That module was store-emitter. The problem with store-emitter was that it had slightly different syntax than redux. As a result I worked with Jeremy Freeman on minidux, a proper clone of redux that used only ES5.

Part of the motivation for those two modules was that redux came along with an unreasonably large amount of development dependencies, so ES5 alternatives were useful. I really appreciate the ideas behind both react and redux, but found the implementations to be more complicated and difficult to work with than necessary.

Work on store-emitter led to experimenting with a tiny framework named virtual-app, a project that combined store-emitter, virtual-dom, and virtual-raf to create a light-weight alternative to react and redux. virtual-app received a handful of contributions from folks including Yoshua Wuyts, who later created choo, which I now prefer to use over other front-end frameworks.

Experimenting with state management further and trying to simplify as much as possible, I created send-action, which was designed to be the simplest unidirectional state module possible, it's just two functions and a state object, with no plugins, no middleware, and very minimal development dependencies.

EditData

I worked with Kevin Neff on refactoring app.editdata.org to use virtual-app, and we improved a number of editdata modules. I experimented with creating forms that could add/edit data to JSON & CSV files in GitHub repositories.

Seattle Boundaries

In April I started work on the UI for boundaries.seattle.io with the help of a group of contributors. This project provides a way to check which boundaries in Seattle a point is inside. So if you want to know which school district your house is in, or which police beat your workplace is in, etc., this app can help. It also has a developer API and a collection of GeoJSON you can use in your Seattle-focused apps.

Minidocs

Starting in March I worked with Jeremy Freeman again on developing minidocs, a JS module and command-line tool for generating documentation sites from a folder of markdown files. This work got me really excited about single-purpose static-site generators. Projects like Jekyll are powerful general-purpose tools for generating static sites, but there's a lot of opportunity to create targeted tools with minimal configuration. Minidocs is a great example of that.

Township

In March I also started putting together the initial modules for township in a separate township GitHub organization with the help of Luke Swart.

In 2015 I worked with Luke Swart and Christina Montilla on Flatsheet (which was renamed to EditData), and one of the biggest challenges we came up against was creating an authentication system that included permissions based on data model, organization, and team. Township was created to make it easier to develop authentication and authorization systems using Node.js and leveldb. Existing projects like passport felt like the wrong abstraction, and were mostly focused on the express framework, which I don't use. I also considered using auth0, but preferred self-hosted solutions for managing auth credentials, and didn't have a great time using their API clients.

Township started as an abstraction of Flatsheet's authentication system which was initially based on accountdown.

Summer 2016

staticland

At one point in the spring I started saying out loud "Hey now that Let's Encrypt is a thing, it would be nice to have static site hosting that automatically issued SSL certificates using Let's Encrypt."

I had no idea how to build it at the time, but that didn't stop me. I quickly created a prototype and had help from Luke Swart on the initial nginx config.

That project became staticland, a static site hosting service that I now use for almost all of my projects.

Documentation projects

During summer I worked more on minidocs, and started work on adventuretron, a framework for building learn-to-code workshops using electron, as well as a handful of modules for interactive JavaScript example docs, including interactive-sandbox.

Township

I continued work on township, and during the summer created township-auth, township-access, and township-token, which together form the basic functionality needed to create an authentication and authorization system using JWTs.

Popup Arcade

One of my favorite summer projects was hacking on Popup Arcade. I learned a lot about raspberry pi, electronics, and working with acrylic and laser cutters. I'll be revisiting this project again in the warmer months of 2017.

Fall 2016

Documentation

During November I tried to do National Novel Writing Month, except instead of writing a novel I would write documentation. This mostly failed, except I created the following:

Node.js & JavaScript onboarding projects

After considering the difficulty that can come up when onboarding new JavaScript/Node.js developers, I created dev-env-status, an electron app that checks a user's computer to see if Node & Git are installed and available, and gives installation instructions if not. I created this with the intent of holding Node.js install parties call Dev Env Party, a kind of reusable event format for helping new Node.js users started by helping them install the necessary dependencies on their computers.

Read more about my documentation-writing sprint.

Township

The township project got another solid round of changes thanks to the Dat team adopting it for their authentication system. There's now the high-level township module which provides easy to set up request handlers for Node.js servers, and township-client, an API client for those request handlers.

SSL and static sites

I continued learning about SSL over the fall, particularly about what it takes to get A+ test results from the Qualys SSL Labs test.

staticland

After doing a small amount of promotion of staticland there are now a few repeat users hosting sites on the service, who have helped by reporting bugs and other issues. I put a significant amount of work into making staticland more usable, and there's a long way to go with further improvements.

I'm now using staticland for almost all static sites that I run, and am starting to experiment with building more complicated projects based on staticland.

docpage.org

As a quick test of the new township modules, and as an experiment in creating single-purpose static site generators, I created docpage, a command-line tool and hosting service that creates a simple documentation site from a single markdown file. You can build a site, start a development server, and publish the site to docpage.org. This project took me about 20 hours to complete, and got me excited about making similar experiments.

What's next?

Over the next year I plan to continue work on township, editdata, staticland, adventuretron, and related projects. I also hope to produce more editorial work including documentation, educational materials, and journalism, instead of focusing so much attention on software. Read more about my plan for next year.

Interested in supporting these projects?

I'm always looking for two kinds of support:

See also