About
I'm an infrastructure engineer based in the UK. I currently work as a Technical Specialist at Alleviate IT Solutions, an MSP, where I look after cloud and on-premises infrastructure for a range of clients. Before that I was a Cloud Infrastructure Engineer at StepChange Debt Charity.
Outside work I build software to scratch my own itches. I lean towards tools that run locally, keep your data on your own machine, and don't need an account to be useful. Lately that has meant a chess trainer that runs entirely in the browser and an IT operations platform that grew out of the work I do every day.
Projects
-
ChessReader
Free, open-source chess analysis and training that runs entirely in your browser. Paste a PGN or pull your Chess.com or Lichess archive and it reads your games back to you the way a coach would: what you got wrong, what you keep getting wrong, and what to do about it. Stockfish runs in the page, every blunder becomes a flashcard on a spaced-repetition schedule, and there's opening prep for the people you're about to play. Nothing is uploaded.
-
The Canon private, in development
A centralised IT operations platform for a managed service provider: incidents, change requests, ITIL-aligned problem management, daily and backup checks, a kanban board, a customer portal, a knowledge base and cloud cost reporting, all under role-based access with a full audit trail.
Scripts
Small utilities I actually use. Standard-library Python, configured by environment variables, free to take.
Criterion × Radarr toolkit
Which Criterion Collection films are missing from a Radarr library, which are worth caring about, and getting Radarr to fetch them. Read the README for the run order.
- criterion_crossref.py Cross-references your Radarr library against the full Criterion list on Letterboxd, matching on TMDB ID with a fuzzy title fallback.
- fetch_ratings.py Ranks the films you're missing by their Letterboxd rating.
- add_to_radarr.py Adds every missing film to Radarr as monitored, without kicking off a search.
- search_radarr.py Triggers searches for a priority list in paced batches so your indexers aren't hammered.