Software Projects
A collection of selected software projects that I’ve created that I think are worth highlighting. Additional projects can be found on my Github profile.
- migrator (TypeScript)
After building some lightweight Express applications that used Slonik as a simple query builder for PostgreSQL, I built this tool to allow me to easily apply DDL changes to Postgres from my TypeScript applications.
- rust-migrator (Rust)
I enjoyed building a simple migration tool in TypeScript and thought it could serve as a great example project for learning other languages, so I built a version in Rust.
- Fleakr (Ruby)
A full-featured API client for Flickr photostreams that represents my first serious effort at creating a reusable software library. This code demonstrates a departure from the constraints of Rails to really dive deep into some core principles of object oriented design. There are some “clever” spots in the code that I don’t think I would repeat if I were to approach this problem domain again, but there’s a lot of good composition and delegation of responsibility in how this code is designed and implemented.
- dnsimple (Python)
I had been using the dnsimple Ansible module to manage DNS records when creating and destroying servers, but the underlying Python module became out of sync with the way that Ansible was trying to interact with it. I set about updating the code to handle the new API endpoints and structure the code in a way that maximized usability and modularity with an eye to supporting the updated API version. While this never became the canonical Python module for DNSimple, some ideas were ported to the official module.
- resume-generator (TypeScript)
I had been using PDFKit and Ruby to generate PDF versions of my résumé from a collection of Markdown documents, but it seemed like every time I went to update the content and regenerate the document the formatting would be vastly different. After some research, I decided to ditch PDFKit and use Puppeteer to implement the Markdown → HTML → PDF pipeline with much better results.
- http (C)
This one is a bizarre sleeper hit. In revisiting the C programming language, I was interested in exploring how to handle low-level socket connections which resulted in this basic, mostly non-functional HTTP library. This is currently my most popular project on Github for reasons that are unknown to me.
- minecraft-server (Ansible / Python)
After experiencing lag on our outdated home computers when using “Open to LAN”, I took some time to pull together an existing Ansible role to create an on-demand Minecraft server on Digital Ocean. I experimented a bit with using Block Storage to store world data, but moved to persisting data in a Space to allow for a multi-server setup.
- axios-http-mock (TypeScript)
Implemented as an adapter for the popular Axios HTTP request library, this package allows developers to mock low-level HTTP requests using a fluent type-safe interface.
- Custom HTTP Routing (Go)
In the instances where using a third-party routing library is overkill, I wanted to demonstrate some alternatives with varying degrees of complexity for how to leverage the Go
net/http
package withServeMux
to route requests to different handlers.- jira (TypeScript)
Anyone who has worked extensively with Jira knows that it can be difficult to find or create tickets with all the correct attributes (e.g. team, sprint, etc.). Instead of having to hit the web every time I wanted to add a ticket to our sprint backlog, I leveraged clack to help build a slick CLI application to do it instead.
- Graft (Ruby)
After working with a variety of APIs, I had the idea of making a simple translation layer with a DSL that could seamlessly map attributes from either XML or JSON response payloads. I didn’t pursue the idea far enough to run into any complicated edge cases, but it was a good introduction to designing a DSL to solve a real problem I was facing. You can tell the age of the project as it uses hpricot for parsing XML, rather than a more modern solution like Nokogiri.
- TestFS (Ruby)
It was sometimes difficult to manage fixtures for tests that required filesystem access. This was a solution to set up and tear down required files on a per-test basis. It was a fun DSL to work on that was definitely inspired by builder.
- nestjs-playground (TypeScript)
After spending a significant amount of time with TypeScript and Nest.js, I wanted to explore ways of building services that was influenced by my years of experience developing applications, but that respected the idioms of the language and framework. This is a project where I am able to dive deeper than the official documentation and demonstrate useful solutions to common problems while maintaining overall testability.
- Geocoder (Ruby)
A short-lived attempt at creating a near-zero dependency geocoding library. I don’t think I ever used it in an actual project, but my reliance only on the basic HTTP functionality available in the Ruby standard library is a theme that can be found in other API clients that I continue to write. While
Net:HTTP
is cumbersome to use for more complex use cases, it’s usually a sufficient tool.- scratch-stats (TypeScript)
As part of my attempt to get the young creatives (aka teens) in my household to appreciate the interconnectedness and programmability of the modern-day web, I created this project to demonstrate a simple way to interact with their preferred programming environment (Scratch) by pulling all their project stats from the publicly available Scratch API.
- logging (TypeScript)
Some form of logging in applications is useful, but getting it set up correctly and emitting structured logs can be a bit of a pain. I wrote this simple wrapper around the winston logging package to make that setup easier and allow it to plug into tools like Slonik.