Projects

A collection of open source projects I have developed.

Docker Images

I have published a number of public Docker images to Docker Hub.

All images have:

  • Been optimized to have the fewest number of the smallest layers possible.
  • High test coverage using Google's Container Structure Test.
  • Base images kept up-to-date by Renovate, with automatic pull request merges.
  • CI/CD using Circle CI for automatic testing and pushing to Docker Hub.

libtorrent

A collection of images with libtorrent compiled, including Python bindings, to be used as a base image for applications such as qBittorrent and FlexGet.

Related blog articles:

qBittorrent

A collection of images with a headless version of qBittorrent (qbittorrent-nox) compiled and the web UI exposed.

FlexGet

A collection of images with FlexGet installed and the web UI exposed.

Metalsmith Plugins

I have published a number of plugins for Metalsmith, a plugin-based static site generator originally from Segment, to npm.

All plugins have:

  • High test coverage using Jest.
  • Dependencies kept up-to-date by Renovate, with automatic pull request merges.
  • CI/CD using Circle CI for automatic testing and publishing to npm.

A plugin to find related files within collections, such as related blog articles.

metalsmith-css-unused

A plugin to remove unused CSS rules.

Related blog articles:

metalsmith-htaccess

A plugin to create an .htaccess Apache HTTP Server (httpd) configuration file.

metalsmith-html-glob

A plugin to process glob patterns (e.g. <script src="**/*.js">) in HTML tags.

metalsmith-html-linter

A plugin to lint HTML files.

metalsmith-html-relative

A plugin to make local paths relative (e.g. <a href="../index.html">) in HTML tags.

Related blog articles:

metalsmith-html-sri

A plugin to add subresource integrity attributes (e.g. <script src="..." integrity="sha384-sc7RxY9...">) to HTML tags.

metalsmith-html-unused

A plugin to remove resources (.css, .js, .png, etc.) that aren't referenced by any HTML file.

Related blog articles:

metalsmith-include-files

A plugin to include files outside of the source directory.

Related blog articles:

A Metalsmith plugin to automatically check for broken links.

Related blog articles:

metalsmith-reading-time

A Metalsmith plugin to estimate pages' reading times, similar to Medium.

metalsmith-tracer

A tool to automatically trace and measure Metalsmith build time.

Raspberry Pi Tools

I have written a number of Bash scripts for Raspberry Pi to automate building and installing kernels and drivers from source.

rpi-kernel

A script to build and install the Raspberry Pi Foundation kernel from source.

rpi-headers

A script to build and install the Raspberry Pi Foundation kernel headers from source.

Kernel headers are used for compiling code that interfaces with the kernel, such as drivers.

rpi-backports

A script to build and install the Backports Project drivers (formerly compat-drivers) from source.

rpi-rtl8812au

A script to build and install a Realtek RTL8812AU WiFi driver from source.

FIRST Robotics Competition

I have developed a number of applications for use in the FIRST Robotics Competition, a worldwide STEM competition for high school students.

SharkScout

A Python (CherryPy, ws4py, Genshi) and MongoDB-based web app for both quantitative and qualitative competition scouting. Used by the Hammerheads (226) in the 2017 and 2018 competition seasons.

Built with unreliable client connections as a primary concern, the app makes use of front-end caching and background syncing with web sockets. Designed to make use of team and event data from The Blue Alliance, stored locally for offline use, there is very little work required to get started.

SharkCV

A Python and OpenCV-based vision processing framework designed to run on a coprocessor. Used by the Hammerheads (226) in the 2016 competition season.

Similar to the GRIP and Limelight software, SharkCV was designed to abstract away most of the OpenCV complexity so configuration can be fast and easy. Unlike other hardware solutions, SharkCV running on a coprocessor such as a Raspberry Pi gives many different options for both input and output sources.