| Home | GitHub | Twitter |
I'm currently working as a Senior AI Engineer @ aveni.
I have a PhD from Heriot-Watt University, where my research was on applying natural language processing-based machine learning algorithms to programming languages.
Prior to that, I obtained a First-Class Master's degree (MEng) in Digital Electronics (now known as Electronics and Computer Engineering) from the University of Sheffield.
In my spare time I enjoy: reading, listening to podcasts, doing crosswords, solving puzzles, playing board games, walking my dog, and watching sports.
You can contact me on twitter or via e-mail.
Things that I've worked on.
| 2026-09 |
Cryptic Index: An index of indicators for cryptic crossword clues.
|
| 2026-09 | Minesweeper Sudoku: A puzzle game combining Minesweeper and Sudoku. |
| 2026-08 | Tetronimo Place: A puzzle game combining Tetris and Shikaru. |
| 2026-08 | 122333 Sudoku: A Sudoku variant. |
| 2026-08 | Wordie Place: A word game. Place tiles to complete words. |
| 2026-08 | Bee Switch: A word game. Shift words until you spell a pangram. |
| 2026-08 | Bee Definition: A word game. Guess words based on their definitions. |
| 2026-08 | Wordie Down: A word game. Shift words to spell hidden words. |
| 2026-08 | Wordie Loop: A word game. Place words to fill a loop, where the last letter of each is the first letter of the next. |
| 2026-08 | Wordie Grid: A word game. Fill a grid so every row spells a word, try and beat the target score. |
| 2026-08 | Pineapple Grid: A puzzle game. Place cards into a grid, scoring every row and column as a poker hand. |
| 2026-08 | Pineapple Lines: A solo variant of Pineapple Open Face Chinese Poker. |
| 2025-08 | The Castles of Burgundy Automata: An implementation of an Automata to play the The Castles of Burgundy board game solo. |
| 2025-07 | Forest Shuffle Automata: An implementation of an Automata to play the Forest Shuffle card game solo. |
| 2025-04 |
repository-template: A repository template for Python projects, using:
uv, ruff, pre-commit,
and pytest.
|
| 2024-04 | clip-search: Text-to-image search with OpenCLIP, Docker, Flask, Faiss, etc. and a basic front-end. |
| 2024-04 | hackerdaily2hackernews: A Google Chrome extension that redirects from HackerDaily comments to Hacker News comments. |
| 2022-10 | lexisearch: Retrieval augmented generation on transcriptions from the Lex Fridman Podcast. |
| 2022-02 | GloVedle: A version of Wordle using GloVe embeddings. |
| 2022-02 | Wordle Terminal: A Python port of Wordle which is played in the terminal. |
| 2022-01 | UUIDv4 Generator: Generate UUIDv4s in the browser, because I didn't like the way the top result on Google generated them. |
| 2021-XX | Sentiment Analysis Tutorial: A tutorial on how to implement some common deep learning based sentiment analysis (text classification) models in PyTorch with torchtext, specifically the NBOW, GRU, bi-LSTM, CNN and Transformer models. Somehow got popular and has quite a few stars. |
| 2021-XX | Sequence-to-Sequence Learning Tutorial: A tutorial implementing neural (deep learning based) sequence-to-sequence models in PyTorch with torchtext, by implementing six NMT papers. Also has quite a few stars and was used as a basis for the official PyTorch language translation tutorial. |
| 2021-08 | easynlp: A library for performing natural language processing - such as zero-shot classification, translation, named entity recognition, summarization, and question answering - inference on given data utilizing the pre-trained models from transformers. |
| 2021-02 | Image Classification Tutorial: A tutorial covering how to implement some deep learning computer vision models in PyTorch with torchvision. Covers: a basic multi-layer perceptron, LeNet, AlexNet, VGG and ResNet. |
| 2021-01 | A Tour of Optimizers: A tutorial on common optimization algorithms used for neural networks, including: SGD, Adagrad, Adadelta, RMSprop and Adam. |
| 2020-10 | numberworld: A reinforcement learning toy environment for task-oriented language grounding. |
| 2020-07 | Glyphs of Dialogue: A small project combining ideas from GlyphNet and Dimensions of Dialogue. |
| 2020-03 | Recurrent Attention Model: A PyTorch implementation of the Recurrent Attention Model from the Recurrent Models of Visual Attention paper. |
| 2019-03 | countworld: Generating synthetic datasets that deal with counting. |
| 2016-?? | snake: Snake in Javascript. |
| 2016-?? | difference: A timed mental maths game in Javascript. |
Things I've learned, formatted as Python notebooks.
| Top |