I have a tendency to start a lot of projects. I open source most of them. This list is meant to highlight some of the more interesting ones.


Open source, usable, but incomplete.
Hardware Abstraction Layer for the Raspberry Pi RP2040 SoC, written in Ada.


Closed source, complete.
This board does level shifting of the +12V and TACH signals from three pin PC fans to allow a 3.3V microcontroller to sense and PWM modulate the fan speed. This was mostly a learning experience. I learned that you should just spend a little more money on four pin fans.


Open source, complete.
A friend needed a breakout board to supply power for an odd USB-C connector.


Open source, incomplete.
Ada bindings for the excellent notcurses library.


Closed source, incomplete.
A frequency counter meant to replicate the functionality of the Tektronix DC501 module. Project mostly abandoned because I bought a decent oscilloscope with frequency counting abilities.


Open source, complete.
A 5x3 bitmap font for use with small LCD screens. Emphasis on code and memory size.

PCD8544 driver

Open source, complete.
Just a little SPI LCD.


Open source, complete.
A small node.js library that populates environment variables from blobs in Google Cloud Storage. Useful for eliminating .env files.

comp.lang.ada archive

Open data, complete.
I collected every post for the comp.lang.ada usenet group and imported them into a public-inbox repository. Very early posts were delivered via UUCP and needed to be reformatted. I also built spamassassin filters and removed quite a bit of nonsense. A cron keeps the archive up to date with new posts.


Open source, abandoned.
Scripted unattended install of OpenBSD to a block or loopback device. This is intended to be used to build Amazon EC2 AMI images, but could work for other cloud providers with some modification. I gave up trying to run OpenBSD on EC2 as the new Graviton 2 instances need to boot from NVMe, which is not supported in OpenBSD. Graviton 2 instances use a custom “Elastic Network Adapter” that does not have a driver in OpenBSD. Support for NVMe boot and the ENA have been added to FreeBSD and are under active development, so this may be possible to port over eventually, but I have decided that this isn’t how I want to spend my time.


Open source, complete.
A command line tool that runs a command repeatedly until it completes. Supports speculative backoff. Built for an abandoned branch of diskprices that decomposed the data import and filtering tasks into simple commands that followed the UNIX philosophy. I might try this again someday, but the Python task runner works well enough for now.


Closed source, complete.
Spoiled by engineering catalogs like Digi-Key and McMaster, I noticed a lack of such a price list for storage devices. I wrote a tool to query Amazon’s Product Advertising API for relevant products, parse some metadata, filter spam, and sort the listing by price per terabyte. Affiliate revenue from this site funds my other projects.


Open source, complete.
The nrfx library contains drivers for Nordic’s NRF5x chips. I wanted to use the Meson build system to cross-compile this library, rather than Makefiles or CMake. This repo is a template for future projects.


Open source, complete.
At the beginning of the COVID-19 pandemic, a lot of people started contributing CPU cycles to the Folding@Home project. I wrote a quick and dirty Dockerfile to get the Folding@Home client running inside a container, as it was incompatible with my desktop configuration.


Open source, incomplete.
Simple Microcontroller Operation Library is the best acronym I’ve ever come up with. This is a HAL and drivers for ARM Cortex-M chips. Currently, the ATSAMD21 and NRF51 are supported. This library was born out of my frustration with the poor quality of vendor HAL and Arduino libraries. The libopencm3 project has done a better job of this than I ever could, so I wouldn’t recommend using smol, but it does serve as a useful reference on occasion.


Open source, incomplete.
Random symbols and footprints I’ve created for KiCAD. I should do a better job of maintaining this.


Open source, abandoned.
An Adafruit Feather compatible board for the EFM8 8051 microcontroller. I had planned to build an Arduino-like IDE to introduce people to writing assembly. I ran into obstacles with the EFM8’s poorly documented flash protocol and ultimately decided that this project is bigger than I thought it was when I started. I might come back to it someday, but it’s getting hard to justify writing assembly when we have such good compilers for ARM microcontrollers that keep getting cheaper.

Yocto on GameShell

Open source, complete.
The GameShell is a handheld game console with an ARM Cortex-A7 SoC. The manufacturer provides schematics and Linux kernel patches, but not u-boot patches. I re-did the u-boot port by modifying similar board definitions, reading the Linux patches and making educated guesses about the hardware. I released this work as a standalone patch on the Clockwork Pi forum to enable others to build fully open source firmware for this device. I also built the meta-clockwork layer to make it easy to target this device with Yocto.

Yocto on Lego Mindstorms EV3

Open source, incomplete.
I submitted a pull request and got the machine definition for lego-ev3 merged into the upstream meta-ti layer, so it’s marginally vendor supported now. The EV3 uses a rather old ARM926EJ-S chip. Linux kernel patches exist for most of the motor and sensor interfaces, but I think most of what they do is better off in userspace these days. I hear the newer Lego electronics use STM32 chips, which seems like a better fit for the application. Sometimes I take this off the shelf and poke at it, but I think I’m more likely to wire up the Lego motors to a modern microcontroller than try to fight with this thing again.


Open source, complete.
A reimagining of Clusto, but with access controls, auditing, and gRPC interfaces. It worked well for managing a bunch of remote devices. It could do much more. I have no idea if anybody still uses it.


Open source, complete.
All databases need backups. Cassandra clusters are tricky to backup. Tablesnap uses inotify to watch a directory tree for new SSTables and uploads them to S3. This means you get a point-in-time snapshot every time a major compaction happens. This worked well with Cassandra 2.x. I’m told that SSTables are no longer immutable in Cassandra 3.x, so I have no idea what kind of consistency you get if you run tablesnap on those clusters. I’ve successfully avoided being in charge of any Cassandra clusters since 3.x was released, so I don’t really maintain this anymore. There are a few commercial forks of tablesnap that probably work better.


Open source, incomplete.
I just wanted to see how fast I could parse OSM planet files using nanopb. It’s pretty quick, but performance really depends on what you do with the data after you parse the file.


Open source, complete.
The DoD solved one of the biggest problems in computer science decades ago: Naming things. This is a silly and rather inefficient bash script that spits out a random combination of code words. Name your projects! Confuse your friends and enemies alike!


Open source, complete, unmaintained.
I was building Yocto images for some machines that needed to use nVidia’s binary graphics drivers. This was a huge pain to get working. Do yourself a favor and don’t buy another nVidia chip until they start releasing open source drivers.


Open source, complete.
If you have a C-band satellite dish or can find a server on the internet with the right port open, you can receive a packetized stream of weather data from NOAA. This Python library parses that stream without too much fuss.


Open source, complete.
It does container-like things using the clone(2) syscall. This project was meant to demonstrate that not everything needs to be as complicated as Docker.


Open source, complete.
When this was written, Graphite was falling over under the load of trying to ingest millions of metrics on a single machine and everybody was mad about it. statsrelay is a consistent hashing proxy for statsd events. This way, you can shard your metrics across a large number of backends and keep your job. This is not an ideal solution, but it’s what I could come up with at the time. I’m told that some companies still run it. Lyft has forked it and rewritten it in Rust for some reason.