This page exists to provide an index of my software or other technical projects as well as a brief description of them. While I doubt that anyone seriously uses any of my work, I’ve moved software forges twice in the past and services disappear all the time. This page means that if a repo URL you rely on goes down, you can check here to see if I’ve migrated it to another forge or in some circumstances download an archived tarball of the project.
I currently use Sourcehut as a software forge. I have to use Github for work things, and I have a personal account on Gitlab.com which I am not planning on using much anymore.
All of my projects are licensed under the GNU GPL v3 unless otherwise stated.
- GNU GPL Version 3 (.txt, 36KiB)
Table of Contents
Active and Maintained Projects
This is a list of stuff that I’ve done that I’m at least nominally committed to updating or maintaining into the near future. This also means I’m likely to respond to issues and questions about these projects if you’re interested at all.
Ticketsnake and Ticketbasher
These are a pair of CLI utilities which allow you to interact with Redmine instances in various ways. I wrote them to make my life at work a bit cosier and more efficient.
Ticketsnake
- Source code: ~mrshll1001/ticketsnake on Sourcehut
- Python
- Active: 2024 to present
Ticketsnake is a CLI to interact with Redmine instances. It is designed to have minimal dependencies. I mostly wrote it for fun and to practice writing good CLIs following good CLI usability guidelines, but I have found it very useful for my work at Open Data Services Co-operative and I believe it is used by at least one other person there as well.
Ticketsnake distinguishes itself from other similar projects by being a single-file Python script and only requiring a single dependency which is not in the Python standard libraries (click). This makes Ticketsnake excessively easy to install and very lightweight. Click is available in the Debian repos (and likely many others), so users of Ticketsnake can expect to be able to use Ticketsnake without having to install it via pipx
and have competing package managers managing software on their systems.
Ticketsnake also distinguishes itself with a few nice features and close attention to detail to CLI usability. It knows when it’s being printed to a terminal and when it’s being piped to be the output of other software, it supports JSON as well as human-oriented output, and respects the user by respecting the XDG base directory specification and environment variables such as NO_COLOR
.
Ticketbasher
- Source code: ~mrshll1001/ticketbasher on Sourcehut
- Bash
- Active: 2024 to present
Tickerbasher is a companion script to Ticketsnake. While Ticketsnake provides a featured CLI on Redmine instances to retrieve and interact with data, Ticketbasher makes this a bit more friendly for humans by providing some nice interactions on top of Ticketsnake.
For example, Ticketbasher will present menus of issue statuses or users in fzf
to prevent you from having to remember status ids etc. This keeps Ticketsnake lean and smooth, allowing it to focus on just being a good Redmine CLI while Ticketbasher leverages the UNIX paradigm to provide an integrated and smooth user experience; using existing software tools where appropriate to add functionality atop of the CLI.
Harvest CLI
- Source code: ~mrshll1001/harvest-cli on Sourcehut
- Python
- Active: 2023 to 2024
This was my first serious attempt at a CLI and it’s one that I use every day at my job. It is notably rougher around the edges than Ticketsnake because I wrote it earlier and it is due a slight refactoring based on later lessons.
Again, my goal (other than fun and learning) was to produce a dependency-light script which could be installed via a simple Make file and not require many libraries which are not included in the Python standard libraries. It ended up being a bit heavier than I’m now comfortable with because it contains a needless wrapper class, which I am aiming to refactor out in the next iteration.
Luanti (formerly Minetest) Mods
I play Luanti (formerly Minetest) because it scratches the itch Minecraft used to scratch and it’s much more accessible for me to mod and to build my own experience. It’s also FLOSS, and I will always prioritise using FLOSS software over proprietary games. These are some mods I’ve written for it which are mostly designed for personal use but are listed here in case anyone fancies using them.
Simple Gemstones
- Source code: ~mrshll1001/luanti-simple-gemstones on Sourcehut
- Lua
- Active: 2022 to 2023
Simple Gemstones was my first Luanti mod designed primarily for my personal use. It’s actually a Modpack because that means you can disable various features modularly to provide your own drop-in replacements. It’s feature-complete and will only receive maintenance updates. Minetest has since become Luanti and I am expecting some API changes when I upgrade to the next Devuan LTS but other than that there won’t be any new development other than replacing some textures.
My main motivations for this mod were to learn how to write Minetest/Luanti mods, and to create a set of Gemstone nodes and items which replicated functionality I enjoyed from the Tekkit Classic era modpack for Minecraft.
It’s not formally released via the Luanti ContentDB due to the fact that I borrowed some textures from Minecraft, a Minecraft gemstones mod, and another gemstones Luanti mod. This makes the licensing a bit murky if I chose to formally release it. Once I replace these textures I may consider releasing it, but since the mod is mostly designed for personal use in my own game this is unlikely to happen any time soon.
Alchemicka
- Source code: ~mrshll1001/luanti-alchemicka-mod on Sourcehut
- Lua
- Active: 2022 to 2024
Alchemicka is my second Luanti modpack and again is primarily designed for personal use. It was originally designed to be a clone of Equivalent Exchange 2 which was a Tekkit Classic era of Minecraft, however I have since went back to the drawing board and want to go in a slightly different direction with it.
As with Simple Gemstones, it uses some textures from other projects such as ProjectE for Minecraft. I probably shouldn’t use these due to licensing ambiguity but they serve as stand-in textures while I develop the mod since I am not a pixel artist. For this reason, as well as the fact that it’s very much in a pre-alpha stage of “throwing things at the wall and learning how to implement various things”, it won’t be released on the Luanti ContentDB anytime soon.
This project will be developed further but it’s not a priority project for me since my time is limited.
Older and Unmaintained projects
This is a list of stuff that I’ve done and am done with. Some of it is old, and some of it is more recent but “finished” and I’ve not committed to maintenance in the future to keep them up to date. There’s very little here that would be of interest or use with regards to keeping up to date anyway.
HSDS API Validator
- Source code: ~mrshll1001/hsds-api-validator on Sourcehut
- Python
- Active: 2024 (one-shot)
This is a very-rapidly-produced proof-of-concept API validator which can be used to validate HSDS conformant APIs and their returned data. It is written in only 163 lines of Python and as of writing is compatible with HSDS conformant APIs and APIs conformant to well-formed HSDS Profiles.
I wrote this as a personal project although I was allowed to do this on company time by Open Data Services Co-operative and we didn’t bill Open Referral for it. The validator is 50% love letter to the standard, its community, and our work on it for being so well designed that such a thing is possible in only 163 lines of code, and 50% “screw you” to any predatory consultants who would charge through the nose for something heavy and inflexible when it’s actually easier to write something flexible (and decent) in a Friday afternoon (and part of a Tuesday morning).
I’ve listed the project as unmaintained because I’ve achieved my aims with it and it’s unlikely I’ll develop it further. Any future work will likely be done under a different banner or migrated to an Open Data Services Co-operative project.
gmi2html
- Source code: ~mrshll1001/gmi2html on Sourcehut
- Python
- Active: 2023 (one-shot)
gmi2html was a very-quickly implemented gemtext to HTML parser. I wrote it primarily for fun and to learn about a few things. I learned how to structure a library so that it can be hosted on PyPi and made available for others, and I learned how to write my first parser in python.
Part of me wanted to then use this code to string together something which would allow me to read gemlogs in my RSS reader. The excessive README is the result of me preparing for that eventuality but I ended up deciding that I didn’t need that particular piece of kit and that I had gotten what I wanted out of the project. It was a fun afternoon or two and I look back on it fondly.
Multilingual Jekyll Site Template
- Source code: ~mrshll1001/mulitlingual-jekyll-site-template) on Sourcehut
- HTML, Liquid
- Active: 2021 (one-shot)
I used to use Jekyll as a static site generator for mrshll.uk and wrote this template for a friend to help them produce a multilingual site in Jekyll, similar to mine. The template deliberately contains no CSS as it was designed to have them apply their own styles on top.
I originally learned how to achieve this effect in Jekyll by following instructions from Anthony Granger’s blog. The template is unmaintained as it has served its original purpose and I now use Hugo to power this site.
- Build a multilingual website with Jekyll on Anthony Granger’s blog
Todo-py
- Source code: ~mrshll1001/todo-py on Sourcehut
- Python
- Active: 2020 to 2023
Todo-py is my Python implementation of todo.sh
, the CLI todo.txt
tool. It represents my very first foray into the world of writing CLIs. I used the Python argparse library and the code is very messy and unoptimised, but it manages to be a one-file install and not use anything which is not in the Python standard libraries.
- Todo.txt the plain text todo system
- todo.sh CLI on Github
My main motivation for Todo-py was to add automatic Git committing after each action, but I also wanted to indulge in some programming and practice my string parsing skills in Python.
I actually still use Todo-py every day but in the future I plan to flex my since-acquired Bash muscles and add the feature for Git commits into the original Todo.sh, therefore deprecating Todo-py entirely.
Brimstone
- Source code: ~mrshll1001/brimstone on Sourcehut
- PHP (Symfony framework)
- Active: 2017 to 2021
Brimstone was my old indieweb software which I used to use to power the website at this domain. It was fun to hack on and learn indieweb stuff and served as a really fun tool to learn more about writing somewhat-good PHP in a powerful framework.
I stopped maintaining Brimstone when I changed the way that I like to write prose (i.e. moving to a text-editor with markdown files rather than writing in the web interface) and also when it became clear that maintaining it on a server was becoming tougher. My hosting provider upgraded the PHP installation which broke all the forms used to write posts, and in order to make it work again I’d need to upgrade the version of Symfony in order to make it play nicely with the newer version of PHP. This proved to be too involved for my personal circumstances at the time so I switched to a static site generator and haven’t looked back.
Zadkiel
- Source code: ~mrshll1001/zadkiel on Sourcehut
- Python
- Active: 2018 (one-shot)
A very pretentiously named script which parsed and transformed my exported Twitter.com statuses and massaged them into an XML file that I could import into Brimstone. I’m not sure whether this technically constitutes the T in an ETL pipeline!?
It was named to keep it in theme with Brimstone as a sort of biblical-thing. I looked up a bunch of biblical archangels and Zadkiel seemed fitting. Yes I was trying to shoehorn such a name in. Yes I cringe when I think back on this.
Accounting Scrapbook
- Source code: Available inside of ~mrshll1001/phd-technical-artefacts on Sourcehut
- Java (Android application)
- Active: 2016 to 2018
Accounting Scrapbook was some research software I developed and used in my PhD research. I developed it as part of a design process with my research partners and deployed it in two different organisations to understand how charities in the UK could use digital technology to collect and organise data about their work and spending.
The basic premise is that you can use the application to collect various types of information that are useful to charities such as spending data, quotes from people, photos etc. and then tag them quickly. Users can create “scrapbooks” which are basically just collections but the key feature is that scrapbooks can be tagged and that a single item can belong to any number of scrapbooks. This means that a single item of data e.g. a spend or a photo can be rapidly imbued with context which can support later parsing and display by other tools, and support charity workers demonstrating the rich and interlinked context of their daily work.
It supports exporting the data as JSON formatted in the Qualitative Accounting Data Standard and was deployed alongside Rosemary Accounts.
Rosemary Accounts
- Source code: Available inside of ~mrshll1001/phd-technical-artefacts on Sourcehut
- PHP (Symfony framework)
- Active: 2016 to 2018
Rosemary Accounts was some research software I developed and used in my PhD research. Like Accounting Scrapbook, I developed it as part of a design process with my research partners and deployed it in two different organisations to understand how charities in the UK could use digital technology to collect and organise data about their work and spending.
Rosemary Accounts was the partner application to Accounting Scrapbook. It could be used to generate data about work and spending in charities, but it was really designed to act as a receiver of data collected/generated by Accounting Scrapbook and provide an interface for managing it, summarising it, and displaying it.
It supports importing data as JSON formatted in the Qualitative Accounting Data Standard and was deployed alongside Rosemary Accounts.
The Qualitative Accounting Data Standard
- Source code: Available inside of ~mrshll1001/phd-technical-artefacts on Sourcehut
- Technical Writing
- Active: 2016 to 2018
Qualitative Accounting was my first attempt at a data standard before I really knew how they worked properly. I created it for my PhD research as a result of the design process I did with my research partners. It was designed to be an exchange medium for then-as-yet-to-be-designed software systems to swap and use data.
It’s pretty embarrassing when I look back on it. Other than the poor design of the data structures there is no actual standards technologies used in it – no JSON schema just some documentation mimicking the style of some popular standards.
Accountable
- Source code: Available inside of ~mrshll1001/phd-technical-artefacts on Sourcehut
- PHP (Symfony framework)
- Active: 2015 (one-shot)
Accountable was a technology probe developed for a research project during my MRES degree. I used it to frame conversations around open data and spending in local governments and charities. The findings were later published at the top venue in HCI — the SIGCHI conference — in 2016. I have a soft spot in my heart for Accountable because it was the first time I got to use a proper PHP framework, the first time I wrote a scraper to scrape websites and the first time I tried to standardise heterogeneous data for storage and visualisation.
- Accountable: Exploring the Inadequacies of Transparent Financial Practice in the Non-Profit Sector on the ACM Digital Library. The paper is open access so you should be able to download it.