My Projects

Selected Projects

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


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 is used to generate this very website (assuming you are viewing it in an HTTP browser).

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: Go, 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...


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[1] has been the creation of the "storage repository" system, which is Fyne's answer to GVfs[2]. 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.

[1] - Fyne PR #1768

[2] - GVfs Homepage


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:

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.

Copyright 2018-2021 Charles Daniels.

This work is licensed under CC-BY-SA 4.0