London, UK
I’m a software engineer on an integration team, shipping work end to end — backend, platform and frontend.





















































Third Bridge Group LimitedThird Bridge GroupThird Bridge2024–Present
Royal College of RadiologistsRCR2022–2024
BSc (Hons) Computer Science, QMULBSc Computer Science, QMULBSc Comp Sci, QMULComp Sci, QMUL1st · 82%2021–2024
Self-stackingphoto gallery
Twenty years of photographs had turned into 1,374,328 file paths across overlapping backups. I built the system that reduced them to one library holding a single copy of every file, and a website that browses it and stacks repeat shots of the same moment into one. The rule for what counts as a repeat was tuned against my own judgements, and changed when the results stopped matching what I wanted.
Stacking set from photos I sorted by hand: 97.0% precision, 93.2% recall
Screens 3,632,211 pairs fast, then checks 566,522 point by point
Each delete logged first, then all 435.6 GB re-hashed to check
1,374,328 paths re-checked in 220 ms
Every Eaterguide inLondon onone map
Eater's London guides are superb but scattered across hundreds of articles, each with its own small map. This collects all of them, merges the duplicates into one entry per restaurant, and puts them all on one map you can install on your phone. Put it in airplane mode on the Underground and it all still works.

Find any of 2,336 restaurants by name, guide, address or description, or jump straight to a place in London.
About 90 MB of map is stored on the phone. Browsers cannot serve part of a stored file, so the app’s service worker slices out the pieces itself.
The whole rail network in each line’s official colour. Where lines share track they are drawn side by side, so none hides another.
4,043 guide entries merged into 2,336 restaurants; 665 of them carry write-ups from more than one guide.
Tools for the home server, tools for the way I work, and two pieces of coursework.

A screen recording of a website cannot be taken twice: the next time the page changes, so do the scroll, the timing and the take. Here the motion is committed as TypeScript and the capture is deterministic. Chromium is stepped one compositor frame at a time over the raw DevTools socket, since Playwright cannot pass the flag that needs, and ffmpeg encodes the frames. 23,600 lines, one dependency.
Source
They Shoot Pictures, Don’t They? ranks 26,552 films, and no streaming service carries more than a fraction of them. Film Index turns the list into a private cinema: browse and filter the ranking, track what each of us has watched, send a film to the home library in one click, and play it in the browser through the server’s GPU or natively in mpv. The public demo is the catalogue half, with the home server switched off.
Live demo
Every Team Fortress 2 cosmetic, worn on a class, with its trade price in dollars and in keys. The wiki’s pictures stay on the wiki, so it renders its own in Blender, from the game’s own models. Paste a Steam profile and it shows only what you own, through a Worker that holds no API key. A non-commercial fan project, built in two days by agents working its own issue board.
Live site
Before an NHS Trust can advertise a consultant radiologist’s post, the Royal College of Radiologists reviews its job description. That ran on a 44-column spreadsheet, Word forms and email across more than a hundred Trusts, and I was the one running it while I studied. My dissertation automated the job: a portal for each role, a state machine that draws its own diagram so everyone can see where a post stands, and checklists edited without code. 92.7%, and the EECS Final Year Project Prize.
SourceHome-server monitoring that never wakes a sleeping disk. SMART pollers spin drives up and resident agents burn watts, so this is a standard-library sampler with a command allowlist that makes waking a disk impossible by construction. Every spin-up and every rise in power is traced to the process behind it, with a confidence and the evidence, and the dashboard prices its own electricity.
SourceA rule that asks an agent whether a change is small enough to make in place fails at once, because every change is small while it is being made. So this one does not ask. A hook checks a single fact — .git is a file in a worktree and a directory in the main checkout — and refuses every write and every history-changing git command on the wrong side of it. This site is built under it.
Source
The brief set an unusual block, in which every convolution is several parallel ones blended by a small learned gate, and a bar of 94% on CIFAR-10. I implemented it from scratch and then worked on the training: a fourth stage, SGD with momentum and cosine annealing in place of Adam, and Cutout. That took a 91.07% baseline to 95.03% test accuracy. Graded 100%.
SourceOne wallpaper never fits every screen. paperWiz takes the dominant colour of the picture you choose, paints your other monitors with it, and frames small or portrait pictures so they look intended on a wide display. It began as a Bash script over feh and pywal and is now a native Windows app that talks straight to the wallpaper COM API, puts your setup back after you sign in, and installs without admin rights.
Source