alexwlchan
Gumdrop, a silly app for messing with my webcam
The bare minimum for syncing Git repos
Creating Caddyfiles with Cog
Swapping gems for tiles
Parody posters for made-up movies
The Good, the Bad, and the Gutters
Using perceptual distance to create better headers
The passwords I actually memorise
Where I store my multi-factor recovery codes
Quick-and-dirty print debugging in Go
My favourite books from 2025
Drawing Truchet tiles in SVG
Adding a README to S3 buckets with Terraform
The palm tree that lead to Palmyra
Meeting my younger self
Hard problems in social media archiving
The Internet forgets, but I don’t want to
When square pixels aren’t square
Can you take an ox to Oxford?
Cleaning up messy dates in JSON
Detecting AV1-encoded videos with Python
Why can’t my iPhone play that video?
Doing my own syntax highlighting (finally)
Creating a personal wrapper around yt-dlp
Opening all the files that have been modified in a Git branch
Linking to text fragments with a bookmarklet
Resizing images in Rust, now with EXIF orientation support
Using vcrpy to test HTTP interactions in Python
Create space-saving clones on macOS with Python
Slipstitch, Queer Craft, and community spaces
Today was my last day at the Flickr Foundation
Minifying HTML on my Jekyll website
Moving my Glitch apps to my own web server
Recreating the bird animation from Swift.org
My favourite websites from my bookmark collection
What I learnt about making websites by reading two thousand web pages
Building a personal archive of the web, the slow way
Creating a static website for all my bookmarks
Handling JSON objects with duplicate names in Python
A faster way to copy SQLite databases between computers
A flash of light in the darkness
Beyond None: actionable error messages for keyring.get_password()
Localising the <time> with JavaScript
Always running
What I’ve Learned by Building to Last
Whose code am I running in GitHub Actions?
Fast and random sampling in SQLite
We all lose when art is anonymised
An unexpected lesson in CSS stacking contexts