I’m a skilled software developer that enjoys tackling problems methodically, contributing to open-source projects and keeping up to date with technological developments.
My main language is Python, and I’m skilled with Django, asyncio, Flask, PostgreSQL, Elasticsearch, TypeScript, React, Git, Linux and more.
Recent experience
Digi2al (2020–2024)
Projects I’ve worked on at Digi2al include a data management system, an assessment platform, a design system and a planning application.
Languages, libraries and tools I used on these projects include Python, FastAPI, TypeScript, React, Next.js, Elasticsearch, GraphQL, Remix, Django, Flask, PostgreSQL, Playwright, GitHub Actions and Tauri.
Department for International Trade (2017–2020)
I worked on the API layer of an open-source customer relationship management system, built using Python, Django Rest Framework, PostgreSQL, Elasticsearch and Celery.
GitHub projects
BMLL Technologies (2015–2017)
I worked on both the API layer and front end of BMLL’s stock market data analysis platform, built using Python, asyncio, PostgreSQL, Celery and AWS.
Sainsbury’s (2014–2015)
I worked on an online order capacity utilisation forecasting system built using Flask.
Personal projects
Columns UI Extensible C++ UI plugin for the foobar2000 audio player.
iPod manager C++ iPod management plugin for the foobar2000 audio player. Involved reverse engineering database formats and communication protocols.
photos.reupen.uk Personal photography website, built using Astro and Sharp.
Takao Theme for the Sphinx documentation generator.
aiogithub Python asyncio-based GitHub API v3 client.
Links of interest
Blog posts
- The case of the misplaced GitHub username
- __init_subclass__ – a simpler way to implement class registries in Python
- The free coffee that almost slipped through my fingers
- The queue to nowhere
- Python 3.5: Getting to grips with type hints
Pull requests
- Correct MIME type of .txt files
- Fix uploads of m4a files with audio/mp4 content type
- Enforce allow_empty=False during partial validation of parent serializer
- Add support for pagination in OpenAPI response schemas
- Add Django 3 support
- Add workaround for Django 3 memory leak under gevent
Bug reports
- Using asgiref.local.Local with gevent leads to memory leaks
- Accumulating memory usage with 0.10.x
- StringAgg with ordering in subquery generates invalid string_agg() SQL function call
- Change in behaviour when saving a model instance with an explicit pk value if the pk field has a default
- Annotations crash with Subquery and DurationFields
- A multi match cross_fields query omits field boosts if there is only one field in that group