Projects
This list is a sparse sample of the things I like to do as part of my research or in my free time:
Research
The two main projects I am working on at the moment as part of my research are:
Personal
- nkt (GitHub): my note taking and organisation tool.
- cozroe (GitHub): my gemini server.
- vscode-metapost (GitHub): an extension for VSCode / VSCodium for live-previewing MetaPost figures and syntax highlighting.
- thallo (GitHub): a command line tool for interacting with Outlook Calendars that knows timezones better than you do.
- fuzzig (GitHub): fuzzy-finder algorithms based on Smith-Waterman aliment solvers.
- zorro (GitHub): a CLI for interacting with local Zotero libraries and improving the search.
- Buckets.jl (GitHub): fast, parallel, and low-allocation algorithms for binning numbers.
Proof of concepts
Zig libraries
I have written a lot of little utility libraries in Zig for various personal projects:
- atomz (GitHub): an Atom feed generator for Zig.
- farbe (GitHub): ANSI colours for the terminal, but it's slowly becoming a little more general than just handling escape codes.
- clippy (GitHub): a comptime-configured argument parser.
- znotify (GitHub): an
inotify
wrapper for Zig. - lightz (GitHub): a Tree-sitter based syntax highlighting library.
- zigtex (GitHub): embeddable LaTeX to SVG renderer.
- md4zig (GitHub): a wrapper around md4c.
- termui (GitHub): terminal user interfaces in Zig using unbaked shells.
- tisch (GitHub): table printing utilities.
- dedalus (GitHub): A TLS 1.3 Gemini client/server library.
- zig-wolfssl (GitHub): wolfssl built with Zig.
- zig-FITSIO (GitHub): a wrapper with hand-written bindings for CFITSIO
- zig-markdwon (GitHub): I started writing my own SAX-style parser for Markdown, but gave up in the end due to time-constraints.
Other
Below are various other things I once did but probably don't actively maintain anymore:
-
2023: Ugolino, a feed aggregator (GitHub)
-
GGJ 2022: Crossing Party Lines (GitHub)
A little game my friends and I created for the 2022 Global Game Jam. It was written in Zig, targetting WASM for the WASM-4 fantasy console. The game was inspired by the Partygate scandal in the UK at the time, where the Prime Minister Boris Johnson was found to have attended "illegal lockdown parties" in parliament when social distancing measures were in act.
The game involved being at a parliament party where you have the option of responding to different party events. The option you choose disables an option in the press section of the game, where you have to try and explain your behaviour. The aim is to try and enjoy yourself as much as possible without appearing to be too feckless to the press. Each day of the game ends with a page from the Sue Gray report which informs you as to how you're doing.
You can play it online but it's extremely poorly put together, and crashes after the first iteration of the game loop.
-
2020: MQ7 Arduino Library (GitHub)
Part of my IoT projects, we were using various sensors all round the house for the fun of it. One of them was the MQ7 carbon monoxide detector. All of the libraries I could find online didn't seem to report any sensible values, and when I dug into the datasheet, it looked like they had implemented something completely different. So I wrote my own, that made use of the calibration steps that the other libraries also overlooked.
It is also available via the official Arduino repository of libraries.
-
2020: Argus.js (GitHub)
My friends and I were watching a lot of films together during 2020 COVID lockdowns. Eventually the "hit play on the count of three" became too much of a nuisance, so I wrote my own synchronised video player. I gave up on this project soon after the lockdowns loosened up and we could meet up in person again. The thing was badly put together using JavaScript and Vue.js.
-
2020: collectd-nvidia-smi (GitHub)
On a home server I was setting up, I wanted to start playing around with machine learning using an old GPU I had from when I was younger. Since the machine was intended to be always on, I was using all sorts of metrics and brokers and monitor the thing. The one that I was using the monitoring the system was collectd, which is highly configurable with different plugins. At the time there was nothing for monitoring your GPU with
collectd
, so I wrote my own minimal wrapper that would just periodically callnvidia-smi
and parse the output into something thatcollectd
could make sense of -
2020: ReEcho: an Echo360 lecture downloader (GitHub)
I created this during the first UK COVID lockdown. Lectures for some of my courses were being distributed by Echo360, which annoyingly did not let you download lectures and instead forced you to use an absolutely awful video player that rarely seemed to work on my machine. So this little Python script lets you exploit the fact that there is an underlying stream that the video player is using and directly download the lecture via the command line.
-
2018:
Asteroid (GitHub)
My friends and I developed a little music server called Asteroid. It allowed people who connected to our server to request and vote for songs in a jukebox queue. We used it for the house parties we used to host, and tried, through various iterations, to polish the project. It has a special place in this list because it was one of the first software projects I collaboratively developed with friends, trying our best to learn the industry standard ways of doing things, entirely in our free time.
I learned a lot from this project. One thing in particular, since we were running the server on a Raspberry Pi 2 Model A that I had lying around in my room, how nasty race conditions can be in test suites. On our laptops we could spin up a development server in the test suite and then probe it in various ways to validate it. On the Pi, these tests would always fail, because the server took significantly longer to come online. Seems trivial now but you have to learn it at some point.