Skip to main content


Some of my active (and not so active) projects…



rq (Rego Query) is inspired by jq, and aims to offer a similar set of capabilities oriented around running Rego queries. In the long run, rq is intended to make it as easy as possible to utilize Rego both interactively as a shell command, and within shell scripts. Though it is already possible to use Rego in this with via opa eval using the official opa command, rq is intended to be easier and simpler to use specifically in a shell context, and has additional convenience features to support this use case, such as more input and output formats, syntax highlighted output, and so on.

Technologies: Go, OPA (Open Policy Agent), Rego


LogQuery is a tool for reading logfmt formatted data, then running SQL queries on it using SQLite.

Technologies: Go, SQLite.


gemdown includes a set of tools which aim to be useful for writing a site in the text/gemini format (gemtext) which will be published using both Gemini and HTTP. It may also be useful for some gemini-only workflows. gemdown includes multiple subcommands which are discussed below.

Gemdown used to be used to generate this website.

Technologies: Go, Gemini.

Bem (Build Environment Manager)

A simple tool to manage build environments based on Docker. In short, BEM intends to reduce to a minimum the friction required for non-experts to use Docker for interactive development work.

Technologies: Python, Docker.


This program is a complete, self-contained simulator for most of the RV32I instruction set, as well as a simple assembler for the same. It is implemented entirely in AWK. I have tested it only under GNU AWK 5.0.1, it may or may not work under other AWKs.

Technologies: AWK, RISC-V.


ftpmusync is a music synchronization tool. It is specifically designed for synchronizing a local music folder to another device over FTP. This is useful because many smartphone-based media player applications have an “FTP server” feature for allowing easy access to their stored media library.

Technologies: Python.


Headalyzer is a tool for generating header files (or equivalent) in several languages. This is useful when you have shared constants that you wish to use across several languages. This is especially handy when you need to share information in projects that use FFI.

Technologies: Go.


This is a collection of tools and utilities I have written which are large enough to warrant packaging properly and writing man pages for, but not large enough to make a dedicated project/repository/package worthwhile.

Technologies: various, mostly Python.


gmixerctl is a GUI wrapper for the OpenBSD mixerctl command. gmixerctl aims to have 100% feature parity with mixerctl, and may add a few more convenience features in the future (such as setting sndiod flags).

I believe OpenBSD has made some changes to mixerctl since the last time I used it as my daily driver. It’s very possible that gmixerctl has bit-rotted as a result. Caveat emptor as in all things.

Technologies: Python, Tk.


noc-tools is a collection of network-on-chip oriented tools written by the University of South Carolina Heterogeneous and Reconfigurable Computing research group. nocsim is a software simulator for network on chip implementations nocviz is a visualization tool for NoCs using a simple TCL driven API to allow it to be used to visualize or control a variety of NoCs, including nocsim

Technologies: C, TCL, Agar.


ShellDoc is a tool for generating reStructuredText formatted documentation from shell scripts, or any programming language that uses the # symbol to denote comments. This generally makes it useful as a documentation generator for languages that do not have documentation generators.

Technologies: Python.


color2overlay is a fun little program which accepts a sequence of hexadecimal color codes, and produces a number of rectangles of the given colors, evenly sized and distributed in the center of the resulting image. color2overlay supports changing the margin around the drawing area (the region where the rectangles are drawn), changing the canvas size, changing the width of the rectangles, and applying translucency and blur effects. The result can optionally be overlaid on top of an existing image, or saved directly for futher processing by other programs. color2overlay also supports applying bitmasks to the R, G, and B channels separately.

Technologies: Python.


Camlann is a compatibility layer that allows the same C codebase to simultaneously target the Altera NIOSII architecture as well as Linux on general-purpose architectures such as AMD64 or IA32. Specifically, Camlann is made to work with the NIOSII University Program extensions. Camlann is purpose written for the University of South Carolina CSCE313 course, but may prove useful to others wishing to target the NIOSII and IA32/AMD64 with the same code.

Technologies: C, SDL.


This is a collection of tools and utilities that I and other’s have written. This project is a combination of two parts. The first is the toolchest itself, a simple package manager for installing, uninstalling, and managing tools. The second component is a collection of packages, which are mostly scripts and small tools which are too small to warrant being standalone software packages.

“The toolchest” was my stab at writing my own package manager. It was highly portable, and ran fully without root access. This was one of my earliest “big projects”. In retrospect, it’s drastically over-complicated for the problem space it solves. Oh, and the whole thing is written in pure shell.

Technologies: various, mostly shell.


OpenChariot is a software distribution intended to provide useful services to aid in developing software. At present, this includes git repository browsing, statistics generation, bug tracking, and documentation building.

OpenChariot used to run my projects page (all my repositories were self hosted).

Technologies: various, mostly shell.


HeRC Matrix Tools is a collection of open source sparse and symmetric matrix tools, originally created for the University of South Carolina HeRC research group.

hercm was my first real project after graduating high school. Maybe not as useful as I thought it was at the time, but it sure did help with wrangling MTX files.

Technologies: Python.

Open Source

I contribute to, or have contributed to several open source projects…

Open Policy Agent

Open Policy Agent (OPA) is an open source, general-purpose policy engine that enables unified, context-aware policy enforcement across the entire stack.

I have contributed to OPA a few times professionally as an employee of Styra. I would consider my most notable contributions to date to be the object.subset() builtin and some performance optimizations for glob.match().


Fyne is a new retained-mode UI toolkit written entirely in Go (though rendering is done via GLFW). It’s fast and easy to use. The website includes screenshots and details.

My biggest contribution has been the creation of the “storage repository” system, which is Fyne’s answer to GVfs. It allows “repositories” to be registered at runtime to handle arbitrary URI schemes. All of Fyne’s internal libraries use the storage repository system, meaning any protocol can seamlessly be used to read, write, or browse files. The design work and code review was lengthy and highly collaborative, but I can take credit for the vast majority of the code to implement this system.


Agar (or libAgar) is a cross-platform GUI toolkit. It provides a base framework plus a standard library of widgets from which GUI applications can be built. Applications work under X11, Windows, MacOS, SDL 1.2 and others. Agar takes advantage of texture and GPU acceleration wherever available. Agar can also attach to an existing framebuffer, SDL or GL context and operate as a self-contained window-manager.

I used Agar to implement “nocviz” as part of the nocsim project discussed earlier in this document. In the process of doing so, I added the following features:

  • Line-segment-aligned arrowhead drawing.
  • Directed edge support for AG_Graph.
  • Clip AG_Graph edge to node bounding boxes.
  • Introduced a Bezier curve drawing primitive.
  • Improve rendering of multi-line strings in AG_Console.

The project for which I used Agar has now concluded, however I would still highly recommend it to anyone needing to write a GUI in C.