Skip to main content


For my day job, I help to build digital services at Wellcome Collection, to help people discover and use the collections. My particular interest is in digital preservation, and I enjoy the future-proofing that involves. Sometimes it’s designing a storage repository that doesn’t rely on the continued existence of a given software stack, sometimes it’s writing code with enough comments to make sense to future developers.

Outside work, I try to do stuff that’s fun, stuff that doesn’t have any practical purpose. If it’s colourful, pretty, or whimsical, I’m there. That could be software, or short stories, or stitching. I used to contribute to open-source Python projects, but I’ve mostly stopped – these days, I try to minimise the free time I spend coding.

I love sharing what I’ve learnt. I’ve had some great teaching, and my blog posts and conference talks are how I pay that favour forward. There are hundreds of posts on this site, quite a few others elsewhere, and you may have seen me speaking at events like PyCon UK and Monki Gras.

This page lists some of my projects, so you can get an idea of what I’ve been up to:

Interested in anything on this page? Want to know more? Get in touch!

Wellcome Collection

I’ve been a software developer at Wellcome Collection since 2017, which is a museum and library exploring health and human experience. I help to build digital services that present and preserve the collections, making them more accessible and discoverable. All of our work is in public GitHub repositories and available under an MIT licence. The projects I’ve worked on include:

Storage service
The storage service is the preservation repository for Wellcome’s digital collections. It uploads files to cloud storage providers like Amazon S3 and Azure Blob, and ensures the integrity and correctness of the files. I was part of the team that built the original storage service, and I handle ongoing maintenance and debugging. Recently I’ve been working on documentation and a demo, so that other institutions can try running the storage service.
Catalogue API
The Catalogue API provides a unified search for the museum and library collections. I’m one of the developers who works on the Catalogue API and its associated infrastructure.
Stacks development blog
I’ve written a number of articles for the development blog, explaining key pieces of work and sharing what we’ve learnt. See a list of articles I’ve written.
Trans inclusion policy
I helped write Wellcome’s trans inclusion policy and guidance, which provides advice for trans staff and their managers and colleagues.

This site started as a place where I could practice my writing; I’ve since written over 300 posts. There’s no consistent theme – I have a lot of posts about programming, but plenty for non-programmers as well.
Last Week in AWS
Last Week in AWS is a publication that talks about news from the world of AWS and cloud computing. I’m a guest writer for their AWS blog, and you can see a list of articles I’ve written.
Wellcome Collection development blog
The development blog describes work that’s been happening at Wellcome Collection. Sometimes I write about projects my team has been working on, and you can see a list of articles I’ve written.
Fiction on AO3
I’ve written a small amount of fiction, which is posted on AO3. This is light-hearted writing and something I’d like to do more of.

Talks and workshops

A person in a green top standing at a podium, in front of a large screen with the words “duplicate bugs”.
Espousing the benefits of sans I/O programming at PyCon UK 2019. The coordination of my slides, jumper and eyeshadow is entirely deliberate. Image courtesy Mark Hawkins.

I’ve given talks and workshops at a number of conferences. If you’d like me to speak at your event, get in touch for details.

These are a few of my favourites:

The Curb Cut Effect
A collection of stories about the “curb cut effect”: the idea that making something better for disabled people can make it better for everyone.
A Plumber’s Guide to Git
This is a two-hour workshop about the inner workings of Git (the “plumbing” commands). The goal is to give participants a better understanding of Git’s internal data structures, so they can be more confident and capable Git users. My notes are available online.
A robot stole my job!
A fun lightning talk about the unexpected consequences of build automation.
Assume worst intent
If you’re designing services, it’s important to think about how they might be misused to hurt people. If you don’t think about this upfront, your users will find out the hard way.
Sans I/O programming patterns: what, why, and how
I make my case for an approach to programming that gives you code which is dramatically simpler and easier to test.

If you want to see all of my talks, I have a complete list.

Conference organisation

PyCon UK
I helped to organise PyCon UK from 2016 to 2022. PyCon UK is a community conference celebrating the use of Python in the UK. I worn many hats in this role, including organising the schedule, maintaining the website, and helping at the reception desk.
Ideas for inclusive events
This is my ideas and suggestions for running inclusive, accessible events. It’s important for events to welcome as wide a range of people as possible. This is based on my experience both organising and attending in-person tech events, but these ideas aren’t tech specific.

Personal tools

These are tools I’ve written that make my life easier. Usually they solve a very specific problem and I don’t expect anybody else to use them directly, but I publish the source code and my notes in case they’re a useful source of ideas.

A tool for organising my scanned documents and reference files with keyword tagging. There’s a CLI to store files, and a web app to search for previously-stored files.
A command-line tool to find the dominant colours in an image. It prints a palette of colours in your terminal.
A command-line tool for getting data from Safari, like the URL of the frontmost window or the number of open tabs. I also use it for a text expansion macro: I can type ;furl in any app, and it gets replaced by the frontmost URL (with tracking parameters automatically removed).
A collection of CSS and JavaScript snippets I use to show alt text in my Twitter timeline (or highlight its absence).
This is a tool for looking up ingests in the Wellcome storage service. I love this as an example of solving one problem and solving it well – the ingests are also available in a Kibana instance, but a dedicated viewer means I can design it to make it as easy as possible to understand ingests.
Since AO3 doesn’t have an official API, I wrote a small Python library that provides a scripted interface to AO3 data by scraping the page HTML.

Open-source software

I’ve writen dozens of small patches for open-source software, mostly fixing typos or small bugs. I’m not currently taking an active maintainer role in anything, but these are a few projects where I’ve made larger contributions in the past:

Loris is a IIIF Image API server, written in Python by Jon Stroop. While Loris was in use at Wellcome, I was one of two Loris maintainers. I’m particularly pleased with the revised JPEG 2000 parser I wrote. (Wellcome stopped using Loris in 2021.)
url lib 3 is an HTTP client for Python. In 2017, I did a significant amount of work on the test suite: migrating it from nose tests to py.test, and cleaning up file descriptor leaks.
PyOpenSSL is a Python wrapper around the OpenSSL library. In 2016, I helped them migrate their test suite from unittest to py.test-style.
Hypothesis is a property-based testing library in Python, written by David MacIver. I was the second maintainer on the project, mostly working on the CI and build system.
Mathmo is a tool that generates maths exercises for A-level students, developed as part of the NRICH Project. As part of a summer job, I did some work to refactor the codebase and add several new types of question.

Fun stuff