Articles

Here's a chronological list of all the posts on this website. A star (*) means that I thought the post was pretty neat (or, that a lot of other people thought it was pretty neat).

* Compiling Lisp to Bytecode and Running It

Extending my Lisp compiler and adding a fast virtual machine.

Generating Mazes

Visualizations and techniques for different maze generation algorithms.

* Making Python Less Random

Using ptrace to intercept and modify a process's getrandom syscall.

2D Multiplayer From Scratch

Exploring patterns and systems for creating realtime browser games.

* Lisp Compiler Optimizations

Smaller programs that do less work.

* Lisp to JavaScript Compiler

Transpiling Lisp to JavaScript using Rust.

Adding a Line Profiler to My Language

Creating my own developer tooling, and some thoughts on line profilers.

* Compressing CS2 Demos

Shrinking demo data by a factor of 13x.

2023

* A Custom WebAssembly Compiler

Making my programming language 4000x quicker, and adding a static type checker.

* Rendering Counter-Strike Demos in the Browser

Building a demo player for coaches and analysts to visualize CS2 gameplay.

Porting Boolrule To Rust

Building a fast boolean expression evaluation engine.

* Running Untrusted Python Code

Using seccomp and setrlimit to build a Python sandbox.

Building Family Websites

The highest user-joy-per-visit than any other project I'll ever work on.

* My Own Python Web Framework

Using Vercel's Build Output API to explore some framework ideas.

My Time At The Recurse Center

Thoughts and reflections on my six week batch.

* Sandboxing JavaScript Code

An overview of the sandboxing landscape, and some experiments with Deno.

Implementing Highlighting, Search, and Undo

How I added three new features to my text editor.

* Making a Text Editor with a Game Engine

Writing my own quirky version of nano using the 2D game engine Ebitengine.

* Profiling and Optimizing an Interpreter

Rewriting library code to speed up my interpreter benchmark by 28%.

Adding For Loops to an Interpreter

Extending an existing tree-walk interpreter step by step.

2022

A Personal File Share CLI

Sharing files with my friends from the terminal.

CodeGuessr

Building a guessing game for popular open source projects.

Recent Projects I Didn't Finish

A few ideas I tried. Including flamegraphs, fast HTTP routing, and infinite chess.

* Virtual Ants

Artificial life and Langton's ant.

* Implementing Bitcask, a Log-Structured Hash Table

Shipping a speedy key/value store for datasets larger than memory.

* Building and Solving Sokoban

Creating an automated solver for Sokoban puzzles.

* Beating grep with Go

Writing a fast file searching program and benchmarking it.

When I'm Sad My Computer Sends Me Cats

I wrote a program that sends cats to my phone when I'm sad at the computer.

2021

Designing a Code Playground for Adventlang

Using Web Workers and WebAssembly to build a speedy UI.

* Designing a Programming Language for Advent of Code

What is the minimum amount of features I need to not hate my life during this festive season?

DOOM Rendered via Checkboxes

WebAssembly meets 16000 HTML checkboxes.

* Porting Niceware to Rust

The sensation of incremental progress when programming with Rust.

* Creating the Golfcart Programming Language

Writing an interpreter from scratch.

Listening to Satellites with my Raspberry Pi

Building a live dashboard with the help of a few hardware modules.

Computer Vision and Embroidery

Picking the correct thread colors from embroidery hoop images.

* GeoGuessing with Deep Learning

Applying photo geolocation estimation to the game of GeoGuessr.

* WebAssembly Search Tools for Static Sites

Building a technical demo to understand this blossoming area of technology.

Generating Text With Markov Chains

Generating random but familiar text by building Markov chains from scratch.

2020

* Personal Websites and Internet Writing

People that inspire me the most (and that I steal from most regularly).

* Building My Own Chess Engine

Exploring the computational complexity of chess. Code snippets in Python so you can do the same.

Writing Software for an Among Us League

Making a casual game more competitive and arguing with my friends about Elo systems.

Learning the Ink Programming Language

Picking up Ink and giving back to the community.

Privacy Focused Analytics From Scratch

Learning more about user data collection by writing my own analytics system.

* Boids in WebAssembly Using Go

The famous flocking simulation built with the Ebiten game library.

* Creating Randomness Without Math.random

Building a replacement for JavaScript's random number generator.

A Practical Introduction to Graphs (Network Diagrams)

Calculating the path between two countries with the least border crossings.

Polyfilling the Fetch API for Old Browsers and Node.js

A quick look at polyfilling, along with with solutions for both environments.

The Flow of Knowledge in a Team (or Why I Dig Tickets)

Engineering tickets often end up meaning a lot. For the product but also emotionally for the individual.

Adding Comments to Gatsby with Netlify Serverless Functions + GitHub

Use Netlify serverless functions to let users add comments to a static website.

Hacking Together an E-ink Dashboard

A prototype Raspberry Pi dashboard to save me talking to my smart assistant.

How I'm Working Remotely

Writing code, working (almost) solo, and exploring remote-life during the UK lockdown.

Twitter Ticker Tape with a POS58 Receipt Printer

Building a fun toy with my Raspberry Pi, Python, and Tweepy.

Book Review: The Developer's Guide to Content Creation

Discussing an amazing resource for those writing for developers.

DEV Article Analysis

Building a tool for users to analyze their work over time.

Gatsby Sparks Joy

Migrating from Jekyll to Gatsby.

2019

Hardest JavaScript Puzzle I've Ever Solved

Writing JavaScript with a one character width restriction.

Let's Build a CAPTCHA Generator with Node.js

Using Canvas, Express, and a GitHub Action.

Cloning Memcached with Go

I'm really starting to enjoy Go.

My First Golang Program

Conway's Game of Life in Ebiten.

My Experience with Pair Programming

Pairing for fun and profit.

What If I Want My Website to Last for 100 Years?

Prepping for the internet to happen.

A Tutorial on Tricking Google: Encoding Messages in Apostrophes

Using character codes to hide in plain sight.

Your First Open-Source Pull Request: a Walkthrough

Making a small change to the Jekyll project.

Saving Data in JavaScript Without a Database

The title is a lie I also show how to use SQLite.

Interview Question: Implement a Progress Bar

Different ways to do one thing well.

Solving Puzzles With High-Performance JavaScript

It's fast but is it worth it?

A Tiny Project, From Inception to Deployment

A JavaScript webscraper for MDN.

Continuous Deployment to Glitch via GitHub Webhooks

Joining two of my favorite ecosystems together.

* Fun With Linear Time: My Favorite Algorithm

Breaking down the Boyer–Moore majority vote algorithm with examples in Python.

The Weird Rules I Set Myself That Got Me a Job

Advice that I haven't seen elsewhere.

How to Write an Awesome GitHub README

Attract and educate.

Talking to Python from JavaScript (and Back Again!)

Let's learn how to pass data back and forth between languages.

Embed Your Latest DEV Posts Anywhere (Tutorial)

Using the DEV.to API with Node.

Build a Python Bot to Find Your Website's Dead Links (Tutorial)

Crawling a website for missing resources using the Python standard library.

Answered: What the Heck is Code Golf?

I love code golf and you should too!

JavaScript One-Liners That Make Me Excited

Dust off your ternary expressions, we're going in.

Need a Friend? Write a Reddit Bot with Python to Follow You Around (Tutorial)

The basics of building a Reddit bot that listens for phrases and replies to them.

Coding a Live Cam for the Raspberry Pi in Python (Tutorial)

A lo-fi solution for streaming images from your Raspberry Pi to the web.

How Flappy Bird Got Me My Start in Software

An overview of how I learned to code. Also a bit on my experience during my CS Masters.

A Day in the Life of a Mediumly Productive Software Engineer

Living, working, building, and drinking too much coffee.

Kicking Butt and Taking Names With WebSockets (Tutorial)

A little on the history of WebSockets and a brief overview on how to use them in JavaScript.

Creating Cute GitHub Badges Based Off a Project's Mood (Node.js)

Creating GitHub badges based off the time when most people contribute to a GitHub project.

Real-Time Streaming of Every Emoji Posted as a Comment to Reddit.com

Building a website which live streams every emoji posted to Reddit.com.

I Ported Sudoku to Your URL Bar and It Plays like a Dream

Goofy project in which you can play Sudoku entirely within your URL bar.

Cloning Dominos Order Tracker as a Microservice with Node.js and Firebase!

Writing an order tracker with Node, Express, and Firebase.

Benchmarking WebSocket Servers with Python!

Benchmarking websocket servers and frameworks with async Python.

Leetcode - Episode 17 - Moving, Shaking, and Folding (3 x E)

Solutions for: Move Zeroes, Merge Two Sorted Lists, and Merge Two Binary Trees.

Leetcode - Episode 16 - Pretty Efficient (3 x E)

Solutions for: Flipping an Image, Leaf-Similar Trees, and Maximum Depth of N-ary Tree.

Leetcode - Episode 15 - Three Tree Qs (3 x E)

Solutions for: Invert Binary Tree, N-ary Tree Postorder Traversal, and N-ary Tree Preorder Traversal.

Leetcode - Episode 14 - Short, Easy Solutions (3 x E)

Solutions for: Monotonic Array, Max Consecutive Ones, and Contains Duplicate.

Leetcode - Episode 13 - Finding My Stride (3 x M)

Solutions for: Range Sum of BST, Max Increase to Keep City Skyline, and Custom Sort String.

Leetcode - Episode 12 - Starting Early (3 x E)

Solutions for: Verifying an Alien Dictionary, Reverse Only Letters, and Backspace String Compare.

Leetcode - Episode 11 - Faster than 99.17% (1 x M, 2 x E)

Solutions for: Reverse Vowels of a String, Isomorphic Strings, and Reverse Words in a String.

Leetcode - Episode 10 - Short Solutions (1 x M, 2 x E)

Solutions for: Single Number II, Fibonacci Number, and Ransom Note.

Leetcode - Episode 9 - Trudging Through (3x E)

Solutions for: Majority Element, Detect Capital, and Not Boring Movies.

Leetcode - Episode 8 - Breaking Out Some Mediums (3x M, 1x E)

Solutions for: Encode and Decode TinyURL, Insert into a Binary Search Tree, Minimum Add to Make Parentheses Valid, and Goat Latin.

Leetcode - Episode 7 - Getting More Pythonic (3x E)

Solutions for: Two Sum, Valid Anagram, and Length of Last Word.

Leetcode - Episode 6 - Progressively Harder (3x E)

Solutions for: Keyboard Row, Reorder Log Files, and Single Number.

Leetcode - Episode 5 - Fastest Solutions Yet (3x E)

Solutions for: Uncommon Words from Two Sentences, Search in a Binary Search Tree, and Fizz Buzz.

Leetcode - Episode 4 - gnivloS melborP (3x E)

Solutions for: Reverse Words in a String III, Sort Array By Parity II, and Reverse String.

Leetcode - Episode 3 - The Streak Continues (3x E)

Solutions for: Sort Array By Parity, Robot Return to Origin, and Self Dividing Numbers.

Leetcode - Episode 2 - Three More Easys

Solutions for: N-Repeated Element in Size 2N Array, Univalued Binary Tree, and Unique Morse Code Words.

Leetcode - Episode 1 - Three Easys

Episode one of tacking Leetcode problems and discussing solutions. Jewels and Stones, Unique Email Addresses, and To Lower Case.