Matt Pearson
Work

Things I’ve built.

The four at the top have full case studies, covering what each one had to do, what it cost and what I would do differently. Below them are two more written up the same way, then the smaller pieces, with a link to the code wherever there is code worth reading.

Featured · simulation and optimisationRestart Lab

A set-piece simulator built so its own results can be checked. It plays a corner out thousands of times, scores every chance with an expected-goals model trained on real matches, and will not call a routine a winner until it has beaten a random search of the same size.

Python · StatsBomb xG · optimisation · SHAP
The Restart Lab optimisation study screen, showing a convergence curve against the random baseline, plain-language SHAP findings, and the parallel-coordinates cloud of every trial.
Client work · storefront and portfolio for a painterBarnett Art

Anna Barnett needed to sell original work online and add new pieces without me. It takes card payments through Stripe, cannot sell the same original twice, and switches between a shop and an enquiry site on one environment variable.

Next.js 16 · Postgres · Drizzle · Stripe · Terraform
The Barnett Art home page: the artist's name set large in a serif on warm paper, with a landscape painting framed alongside it.
Client work · University of Bath Boat ClubBUBC

A club website rebuilt to outlive the committee that commissioned it. Editors publish a race report in five minutes, it targets 95+ on Lighthouse, and it runs for about ten pounds a year.

Astro · Sanity · Vercel · Tailwind · WCAG 2.2 AA
The BUBC home page: a wide photograph of an eight passing under Pulteney Bridge, the club name set over it in a serif, and a band of club statistics below.
Research · final-year dissertationThe Bike Fit Study

Fifty-one riders, three sessions each, asking whether a professional bike fit actually changes what the body does, and whether it differs between men and women. I designed the protocol, ran every session, and built the pipeline from raw sensor stream to finding.

Experiment design · Python · COSMED · Qualisys & Theia3D · EMG
The bike-fit data pipelineSix instrument streams, each sampling at its own rate on its own clock, are resampled and aligned onto one common timeline. Perceived exertion is recorded at minutes four, nine, fourteen and nineteen of the twenty-minute trial.ONE SESSION, ONE TO TWO GIGABYTESCOSMEDbreath by breathQualisys · Theia3Dmarkerless captureEMGmuscle activationIMUorientationMoxymuscle oxygenationPressure · strainand respirationresample · align · reconcileOne timelineevery stream on the same clock49141920-minute trial at 95% of FTPperceived exertion recorded at each mark
Also written up

Two more, same treatment.

Case studies for work that sits outside the four above.

Also built

Coursework, experiments and client work.

Smaller pieces. Where there’s code worth reading, the link goes straight to it.

IMDb sentiment pipeline

Naive Bayes written from scratch, not imported, sitting behind three vectorisers I also wrote: bag of words, TF-IDF and PPMI. Lemmatisation, stop-word strategy, n-gram size and minimum document frequency are all command-line flags, so the comparison between configurations is one command rather than one edit. The best of them reaches 85.1% on a held-out test set.

Python · scikit-learn · NLTKCode →

Space Invaders reinforcement learning

Coursework building and comparing reinforcement learning methods on Atari Space Invaders, run against the Arcade Learning Environment. A second piece followed it into intrinsic motivation, where the agent generates its own reward signal because the game's own is too sparse to learn from.

Python · RLCode →

Brain tumour detection

YOLOv10 fine-tuned on annotated MRI scans and wrapped in a Gradio interface, so a prediction can be inspected scan by scan instead of collapsing into a single accuracy number. It is the direct descendant of the EPQ I wrote on computer-aided diagnosis, five years earlier and with considerably worse tools.

PyTorch · YOLOv10 · GradioCode →

Society Matchmaker

An eight-person team project on student society engagement. I ran the user research and built the random forest recommender behind it. In a controlled study of eighteen participants our engagement ratio came out at 36% against the students' union site's 15%, with the paired tests significant at p < .001.

Python · random forest · user research

Morse code transceiver

Systems architecture coursework, and the only hardware on this site. Two Arduinos wired together and made to talk: a dot button and a dash button on separate interrupts, a one-second gap to decide where a character ends, a lookup decode into letters, and an LCD showing the message as it builds. A potentiometer selects one of ten channels and a receiver ignores anything not addressed to its own, except channel zero, which reaches every device on the wire.

Arduino · C++ · I²C · interrupts

Sudoku solver and dice-game agent

Two first-year AI courseworks where the algorithm was written rather than imported. The sudoku solver treats each square as a variable and the puzzle as a constraint satisfaction problem: propagate after every placement, always take the square with the fewest remaining values, and backtrack the moment a domain empties. The dice game is a Markov decision process solved by value iteration, sweeping the state space until the values stop moving.

Python · constraint satisfaction · value iteration

Agent experiments

A NEAT agent that teaches itself the Chrome dinosaur game by evolving its own network topology, and a pair of cellular automata in Processing: Conway's Game of Life, then a forest fire model built on the same grid mechanics with drought, wind and regrowth added.

Python · NEAT · ProcessingCode →

Argonauts

A 2D platformer in Unity with dashing, wall-jumping and enemy AI. The follow-up was a grappling traversal game built in Unreal over a hackathon weekend.

Unity · C#Code →