Projects

Ansible KConfig

2 minutes

I've been managing my devices since 2015, starting out with a make file and a bunch of symlinks, then a collection of bash scripts. In 2017 I graduated onto Puppet, before landing on Ansible in late 2018, where I still am today. Since my State of the Apps 2023, I've…

Astrill Extractor

Astrill, my VPN of choice, allows you to export OpenVPN config files for all its VPNs, allowing you to connect on platforms it doesn't provide clients for, which albeit isn't many. The AUR package astrill has started becoming really unstable on my machine recently, so I decided to switch it…

Attack on blocks game

Attack on Blocks is a space invaders style game I wrote for my IT coursework, for the games development unit. We could make any game we wanted, provided it could be done within the time limits, was very easy to play, and easily run on the college computers (which were…

Backgrounds

Even though I use i3, a window manager well known for being minimal, and black, I still like having desktop wallpapers. It makes my desktop feel far less plan, and my lock screens far less boring. I’m not one for keeping things the same, and so my backgrounds cycle, every…

CircleCI Artifact Proxy

2 minutes

My favourite feature of CircleCI, besides the fact it’s the fastest CI I’ve used, and support docker natively, is artifacts. Artifacts allow you to store files from your build, and download them from the web interface. This means you can use the interface to build mobile apps, installers, or even…

Date Group

Over the years, I’ve taken a lot of photos on my phone, and it’s hard to keep them organized properly. Large directories of files don’t play nicely with Nextcloud, my storage of choice. date-group is my tool to solve this. Give it a directory of files, and it’ll group them…

Django Management Auth

2 minutes

The exact definition of my job role is complicated, but a part of it is incident response, both from a sysadmin and developer perspective (often at the same time). Some issues are simple and obvious, others are more complex and peculiar, and other only happen for specific users. Django has…

Django Plaintext Password

2 minutes

It’s well known that storing passwords in plain text is a bad idea, A really bad idea. For production applications, there really is no excuse for it. Really, there’s no real reason for this module to exist. Although there are a couple reasons it might be handy. For example, during…

Django Plausible

It’s no secret I’m a huge fan of Plausible when it comes to analytics. I’ve jumped around a number of different platforms, and this one just clicked. I’ve been running Plausible on my websites (yes, even this one) for a while now. Adding it to your website is as simple…

Django SRI

Subresource integrity (SRI) is a way of securing your remote CSS and JS from being modified without your consent. This works by adding a hash of the file to the script or link tags, and if the remote file doesn’t match, it’s not executed. Most people would think this is…

Django secret key generator

2 minutes

What's a "secret key"? Django’s SECRET_KEY is the setting used as the basis for secret generation and signing. It’s used to generate session keys, password reset tokens and any other text signing done by Django. For the safety and security of a Django application, this must be kept as secret…

Docker DB Auto Backup

2 minutes

Databases house a lot of data, and it’s not quite as simple as just backing up their filesystem and getting everything fine. Most database engines will recommend a process for backing them up correctly, generally in the form of a command-line. So how does that play with databases running in…

Docker Static Server

Sometimes, you just need a simple container to host some static files. Whether that be files for download, images to show, or a directory of files.Why not just use Nginx? If you’re not really bothered, the default nginx container will work just fine for you, however this container has a…

Docker Website Server

If you, like me, have a website, you’ll probably need some way of serving it. And if, like me, your website is static, nginx is a great, lightweight and insanely fast file server. But, how do you configure it? Sometimes, you just don’t care, and want someone else to do…

Dotfiles

Dotfiles are a way for people to store settings and preferences to make setting up a new computer that much easier. I use both my laptop, desktop and work machine almost every day, and want them to be set up in an almost identical way. Most people store their dotfiles…

Git Mirror

Recently, I started moving most of my archived projects from GitHub onto my own Git server. Unfortunately, the self-hosted offerings aren’t perfect for mirroring. Gitea supports mirroring repositories into itself, but not pushing (work is planned). GitLab supports pushing repositories to an upstream, but not mirroring into itself unless you…

Grafana Apprise Adapter

Grafana is a great application for monitoring. With a plethora of data sources allowing for analysing and cross-referencing several metrics. Unfortunately, it doesn’t support much in terms of notifications. Apprise is a great library for creating generic integrations between applications and messaging services for receiving notifications. The only downside is…

Hugo Theme RevealJS

2 minutes

RevealJS is a versatile front-end framework for creating slide show presentations in your browser using HTML. It’s designed to be easy to use, and create high-quality presentations. To create a presentation with RevealJS, you’ll still need a server to run the presentation from. It’s certainly possible to access presentations by…

Hugo theme notes

2 minutes

For my notes, I started with gatsby-theme-code-notes, powered by Gatsby. Gatsby is a very popular static site generator, but I really don't want that much javascript on a site as simple as some text notes. But, at the time, the code-notes theme was fantastic and supported everything I needed, so…

Lantern

Lantern is a generic web server which wraps any application and allows it to respond to HTTP requests. The request body and headers are passed to stdin as JSON, and anything sent to stdout is returned to the client. Is this useful? Not really. Isn’t this basically just CGI? Yeah…

MDCal

MDCal is a project designed to make creating calendar feeds simpler. Static site generators are great, but sometimes you need a calendar rather than a website. View on GitHub Demo: https://mdcal.netlify.app/

Morse code decoder

It’s not often people need to decode text into morse code (and visa-versa), but if I had something like this when I needed to, it would have saved me hours of time!Usage In order to make it accessible for as many people in as many languages as possible, I converted…

Notes

As someone who spends a lot of time at a computer, you pick up certain commands and tricks which make life easier. Unfortunately, the human brain can only remember so much. And shell reverse search can’t remember everything. To store things like this, I created a “notes” site, powered by…

Prank Lock

2 minutes

Everyone knows that you should lock your devices when you’re not using them, but it still shocks me just how few actually do. Leaving your computer unlocked whilst you leave it, whether it be for the toilet, lunch, or to leave the house greatly increases the chance of someone compromising…

Teleprompt

2 minutes

Contrary to what some people may think, especially those who have met me in person, I actually give a fair number of presentations. Some with slides, some without. With the lengths of talk I do, not to mention my memory (or lack thereof), I need notes to prompt me on…

Wagtail Lite YouTube Embed

When it comes to loading times and invasive embeds, there's nothing quite like a YouTube embed. The stock YouTube embed is full of trackers and complex javascript, all of which impacts usability and page performance. Worse still, all of this happens regardless of whether the user actually plays the video.

Wiki Game Solver

2 minutes

The Wiki Game is an online game where you attempt to navigate through Wikipedia from a start page to a goal page using as few other pages as possible. Not long after I was shown it, I realized that I really wasn’t very good at it. After about 15 minutes…

Yoga Pal

Once I started work, I bought myself a Lenovo Yoga 3 14" laptop, because I needed a thin and light laptop for trains and the office. This came with windows, which within 10 minutes was running Ubuntu Gnome! Ubuntu greatly increased the performance, but I had to sacrifice all the…