Journal
Occasional writing on web development, AWS, open source, and building products.
Dynoxide 0.9.8: fixing the orphan problem
If you backgrounded dynoxide in an npm script, killing the dev server left it running. 0.9.8 fixes three root causes so the process actually dies when it should.
Read article →
Introducing Dynoxide: a fast, embeddable DynamoDB engine
I built a DynamoDB engine in Rust that starts in 15ms and passes 526 conformance tests. Here's why, and what it's for.
Read article →
Automating my son's YouTube with Python and FFmpeg
My son wanted a YouTube channel. I wanted to make sure I wasn't the bottleneck. Here's how I automated the entire weekly workflow with Python, the FPL API, Whisper, FFmpeg, and the YouTube Data API.
Read article →
Recently Played: bringing back my Last.fm component
I had a Last.fm widget on my site in 2010. Fifteen years later, I brought it back as an Eleventy WebC component with SSR, live polling, and localStorage caching.
Read article →
WireGuard for safe browsing on kids' devices
Kids' devices leave the home network. WireGuard tunnels their DNS back through home filtering — everywhere, automatically.
Read article →
Running AdGuard Home and Unbound on a home server
AdGuard Home handles the filtering, Unbound handles the resolving. Together they give you private, ad-free DNS for your whole network.
Read article →
Building a tiny Intel N100 home server
I built a silent, tiny home server for £250 using an Intel N100. It runs 24/7 on about 8 watts.
Read article →
Remove trailing slashes with CloudFront and 11ty
Trailing slashes and 11ty's folder structure caused redirect loops. A simple CloudFront function fixed it.
Read article →
Enhance CSRF package - now supports multipart form data
My Enhance CSRF plugin now supports multipart form data - meaning file uploads work with the csrf-form component out of the box.
Read article →
DynamoDB Streams locally with arc.codes & Enhance
DynamoDB Streams don't work locally with Dynalite. I built an arc plugin that fixes that with DynamoDB Local and a polling middleware.
Read article →