Blog.
Recent Posts
Surviving my second year of CompSci at Cambridge
19 June 2024 27 minIt feels like just yesterday that I was writing about my first year at Cambridge, but it’s already...
Calling JavaScript functions from Rust by embedding V8
27 January 2024 10 minBeing the language of the web, JavaScript seems to be everywhere and do everything. And sometimes, a...
Youngest Player Starts: Board Games and Markov Chains
3 January 2024 14 minOver Christmas, I’ve spent a fair bit of time playing board games with my family. However, being m...
All Posts
Surviving my second year of CompSci at Cambridge
19 June 2024 • 27 minute readIt feels like just yesterday that I was writing about my first year at Cambridge, but it’s already...
Calling JavaScript functions from Rust by embedding V8
27 January 2024 • 10 minute readBeing the language of the web, JavaScript seems to be everywhere and do everything. And sometimes, a...
Youngest Player Starts: Board Games and Markov Chains
3 January 2024 • 14 minute readOver Christmas, I’ve spent a fair bit of time playing board games with my family. However, being m...
The dodgy security of biometric passports
14 December 2023 • 10 minute readIf you have a passport, chances are it’s insecure. Within a decade, it’ll probably track your ev...
Modernising device live migration at Nutanix
19 September 2023 • 13 minute readFor the last 12 weeks, I’ve been working at Nutanix as a Software Engineer Intern on their hypervi...
How to survive your first year of CompSci at Cambridge
17 June 2023 • 24 minute readMy first year at Cambridge has been nothing short of absolutely incredible. I’ve made some amazing...
Optimising content moderators with ML in Switzerland
30 March 2023 • 12 minute readLast week, I had the privilege of participating in START Hack 2023, a 36-hour hackathon hosted by ST...
Exploring garbage collection in V8 with WebGL
7 January 2023 • 13 minute readOver the Christmas break, I’ve been working on a game engine called TSGL, using TypeScript and Web...
Can you learn to better predict the future?
20 November 2022 • 7 minute readI spent the last weekend participating in HackX, a hackathon hosted by the Cambridge Existential Ris...
How to learn another programming language
14 November 2022 • 10 minute readPlenty of people have already written about how to learn to program, but there are comparatively few...
Building Stuart, a blazingly-fast static site generator
3 September 2022 • 14 minute readA few weeks ago, I watched a video introducing me to Hugo, a static site generator written in Go tha...
How I built Equion, the mathematician's Discord
11 August 2022 • 11 minute readLast week, I made Equion, one of my longest-running projects, open-source. Originally designed to he...
How are mutexes implemented in Rust?
16 July 2022 • 11 minute readMutual exclusion locks, or mutexes, are a vital component of any multi-threaded program. In this pos...
Implementing atomics from scratch in Rust
8 July 2022 • 10 minute readWhen talking about multi-threaded applications and concurrency, we often hear the term “atomic”....
Migrating TidesX to Cloudflare Workers and Workers KV
21 June 2022 • 7 minute readThe recent heatwave here in the UK brought huge growth to TidesX, my tide times app which serves ove...
Two-factor authentication from scratch with TOTP
8 June 2022 • 6 minute readTwo-factor authentication is a vital part of securing any account. By requiring a secondary code to ...
Dynamically generating embed images for Gatsby
29 May 2022 • 5 minute readOne of the most important things about a blog is encouraging people to read it. A vital part of this...
Creating a blog with Gatsby
25 May 2022 • 3 minute readWith the A-level exam season in full swing, I’ve been finding more and more creative ways to procr...