Alex Chan
alexwlchan.net
Alex Chan
@alexwlchan.net
Abusing ID3 chapters to turn videos into glanceable podcasts: alexwlchan.net/2026/glancec...

If you create hundreds of second-long chapters which have a video frame as cover art, you can get a video into an audio-only podcast player.
September 15, 2026 at 4:11 PM
Why can’t you combine .tar.gz files with cat? alexwlchan.net/2026/cat-con...

I wanted to combine some archives, so I had to understand the tar and gzip file formats. I learnt about tape drives, patent laws, and end-of-file markers.
Why can’t you combine .tar.gz files with cat?
To combine archives safely, I had to start by understanding the `tar` and `gzip` file formats. I learnt about tape drives, patent laws, and end-of-file markers.
alexwlchan.net
August 20, 2026 at 10:19 AM
Reposted by Alex Chan
I wrote about finding an SQLite bug for the Tailscale blog!

I learnt so much from working on this series of incidents, and I’m proud of the outcome and the story we can finally tell. 🥰
We spent months tracking down a rare SQLite corruption bug. Working with SQLite’s core developers, we found it—then uncovered a second bug along the way.

The story of the rare race condition we eventually caught:

tailscale.com/blog/sqlite-...
August 13, 2026 at 6:28 PM
I wrote about finding an SQLite bug for the Tailscale blog!

I learnt so much from working on this series of incidents, and I’m proud of the outcome and the story we can finally tell. 🥰
We spent months tracking down a rare SQLite corruption bug. Working with SQLite’s core developers, we found it—then uncovered a second bug along the way.

The story of the rare race condition we eventually caught:

tailscale.com/blog/sqlite-...
August 13, 2026 at 6:28 PM
Reposted by Alex Chan
Describing all my photos: alexwlchan.net/2026/describ...

I wrote about a change to my photo reviewing workflow: I now write a description for every photo I’m keeping. A sentence or two of context goes a long way to cementing the memory, so I remember more when I look back on the photo.
Describing all my photos
When I save a photo, I write a sentence or two of descriptive context. It helps me remember what's in a photo, why I took it, and how I felt when I did.
alexwlchan.net
July 5, 2026 at 7:03 PM
Describing all my photos: alexwlchan.net/2026/describ...

I wrote about a change to my photo reviewing workflow: I now write a description for every photo I’m keeping. A sentence or two of context goes a long way to cementing the memory, so I remember more when I look back on the photo.
Describing all my photos
When I save a photo, I write a sentence or two of descriptive context. It helps me remember what's in a photo, why I took it, and how I felt when I did.
alexwlchan.net
July 5, 2026 at 7:03 PM
Reposted by Alex Chan
I don’t want to repeat repeat myself: alexwlchan.net/2026/repeati...

I wrote about these two regular expressions:

\b([A-Za-z]+) \1\b
\b([A-Za-z]+ [A-Za-z]+) \1\b

They helped me find a bunch of mistakes where I had repeated words or phrases. Try them in your writing and code today!
I don’t want to repeat repeat myself
I wrote a pair of regular expressions to find repeated words and phrases in my source code.
alexwlchan.net
July 3, 2026 at 7:49 PM
I don’t want to repeat repeat myself: alexwlchan.net/2026/repeati...

I wrote about these two regular expressions:

\b([A-Za-z]+) \1\b
\b([A-Za-z]+ [A-Za-z]+) \1\b

They helped me find a bunch of mistakes where I had repeated words or phrases. Try them in your writing and code today!
I don’t want to repeat repeat myself
I wrote a pair of regular expressions to find repeated words and phrases in my source code.
alexwlchan.net
July 3, 2026 at 7:49 PM
Reposted by Alex Chan
Rebuilding the computer room: alexwlchan.net/2026/compute...

I wrote some thoughts on how computers have become a ubiquitous physical presence in our lives, and trying to reintroduce a dedicated space so my digital devices can’t always get to me.
Rebuilding the computer room
We traded the physical boundaries of dedicated rooms for the convenience of our always-on digital lives -- but recently I've been building those walls back up.
alexwlchan.net
June 29, 2026 at 8:43 AM
Rebuilding the computer room: alexwlchan.net/2026/compute...

I wrote some thoughts on how computers have become a ubiquitous physical presence in our lives, and trying to reintroduce a dedicated space so my digital devices can’t always get to me.
Rebuilding the computer room
We traded the physical boundaries of dedicated rooms for the convenience of our always-on digital lives -- but recently I've been building those walls back up.
alexwlchan.net
June 29, 2026 at 8:43 AM
Reposted by Alex Chan
Using the Screen Capture API to record a browser window: alexwlchan.net/2026/record-...

In which web tech continues to be amazing, and I use it to record a fun animation (with audio!) from the Lego website.
Using the Screen Capture API to record a browser window
When I saw a cool animation, I used the browser's native screen capture API to get a high-quality screen recording, audio included.
alexwlchan.net
June 7, 2026 at 8:36 AM
Using the Screen Capture API to record a browser window: alexwlchan.net/2026/record-...

In which web tech continues to be amazing, and I use it to record a fun animation (with audio!) from the Lego website.
Using the Screen Capture API to record a browser window
When I saw a cool animation, I used the browser's native screen capture API to get a high-quality screen recording, audio included.
alexwlchan.net
June 7, 2026 at 8:36 AM
Using Pytester to test my Playwright fixtures: alexwlchan.net/2026/pytester/

I wrote about using the Pytester plugin to make sure my fixtures and test helpers are doing the right thing. Just because code is in your test suite, it’s not immune to bugs!
Using Pytester to test my Playwright fixtures
Who tests the tests? Test code isn't immune to bugs, so I'm using pytest's Pytester plugin to ensure my Playwright fixture is behaving correctly.
alexwlchan.net
June 5, 2026 at 8:21 AM
Rendering a chat thread in CSS and JavaScript: alexwlchan.net/2026/css-chat/

I want to add text conversation to my scrapbook of social media, so I needed to render text bubbles in a web browser. It was tricky but I got it working. Modern web tech is amazing!

💬 💬 💬
Rendering a chat thread in CSS and JavaScript
I thought rendering chat bubbles would be straightforward, but I found it tricky to get the CSS right and make the bubbles "shrink-wrap" to fit the text.
alexwlchan.net
June 1, 2026 at 7:51 AM
Reposted by Alex Chan
Watching for file changes on macOS: alexwlchan.net/2026/watch-f...

I wrote about my new Swift/Python scripts to get notified of file changes… without using third-party dependencies.
Watching for file changes on macOS
I've written a Swift script that uses the FSEvents API to get notified of file changes, then I'm using stdout as a bridge to forward those notifications to Python.
alexwlchan.net
May 11, 2026 at 6:47 AM
Watching for file changes on macOS: alexwlchan.net/2026/watch-f...

I wrote about my new Swift/Python scripts to get notified of file changes… without using third-party dependencies.
Watching for file changes on macOS
I've written a Swift script that uses the FSEvents API to get notified of file changes, then I'm using stdout as a bridge to forward those notifications to Python.
alexwlchan.net
May 11, 2026 at 6:47 AM
Using Playwright to test my static sites: alexwlchan.net/2026/playwri...

I wrote about how I’m using Playwright to test my static websites from Python, the pytest fixtures I use, and a bunch of example assertions.
Using Playwright to test my static sites
Playwright is a testing library that lets you control a browser and check how the page is behaving, and it's great for testing and scripting web apps.
alexwlchan.net
May 2, 2026 at 9:28 AM
Building a basic cache with SQLite: alexwlchan.net/2026/sqlite-...

I wrote about how I’m using a simple key-value lookup to cache expensive operations and dramatically speed up working on my website.
Building a basic cache with SQLite
An SQLite table that caches expensive operations has dramatically sped up local development of this website.
alexwlchan.net
April 29, 2026 at 12:33 PM
Reposted by Alex Chan
HTTP GET requests with the Python standard library: alexwlchan.net/2026/python-...

For my local scripts I only need a handful of HTTP requests at a time, so I can do everything I want with a lightweight wrapper around urllib.request. Fewer dependencies FTW. 🥰
HTTP GET requests with the Python standard library
For my local scripting, a lightweight wrapper around the Python standard library gets me a friendly API without the dependencies.
alexwlchan.net
April 26, 2026 at 10:02 AM
HTTP GET requests with the Python standard library: alexwlchan.net/2026/python-...

For my local scripts I only need a handful of HTTP requests at a time, so I can do everything I want with a lightweight wrapper around urllib.request. Fewer dependencies FTW. 🥰
HTTP GET requests with the Python standard library
For my local scripting, a lightweight wrapper around the Python standard library gets me a friendly API without the dependencies.
alexwlchan.net
April 26, 2026 at 10:02 AM
Reposted by Alex Chan
Auditing my local Python packages: alexwlchan.net/2026/python-...

Recent supply chain attacks have me wondering “what Python packages do I have installed” – and virtual environments make that harder. I’ve started keeping a list of my environments so I can see exactly what’s installed, and where.
Auditing my local Python packages
Python's virtual environments mean I can have many versions of the same package scattered across my machine. I've started keeping a list of my environments so I can see exactly what's installed, and where.
alexwlchan.net
April 10, 2026 at 7:48 PM
Auditing my local Python packages: alexwlchan.net/2026/python-...

Recent supply chain attacks have me wondering “what Python packages do I have installed” – and virtual environments make that harder. I’ve started keeping a list of my environments so I can see exactly what’s installed, and where.
Auditing my local Python packages
Python's virtual environments mean I can have many versions of the same package scattered across my machine. I've started keeping a list of my environments so I can see exactly what's installed, and where.
alexwlchan.net
April 10, 2026 at 7:48 PM
Reposted by Alex Chan
Creating a personalised bin calendar: alexwlchan.net/2026/bin-cal...

I wrote a quick post about how I create my a fridge calendar that tells me about bin day.

Python stdlib + CSS = 🚮 💚
Creating a personalised bin calendar
Every year I use Python and a bit of CSS to create a fridge calendar that tells me about bin day.
alexwlchan.net
March 27, 2026 at 9:00 AM
Creating a personalised bin calendar: alexwlchan.net/2026/bin-cal...

I wrote a quick post about how I create my a fridge calendar that tells me about bin day.

Python stdlib + CSS = 🚮 💚
Creating a personalised bin calendar
Every year I use Python and a bit of CSS to create a fridge calendar that tells me about bin day.
alexwlchan.net
March 27, 2026 at 9:00 AM
Reposted by Alex Chan
Some highlights and reflections from this year’s #monkigras “Prepping Craft” alexwlchan.net/2026/monki-g...

Resisting ICE; stories of self-discovery; learning to be a parent of a trans child. So much fun; bring on 2027!
Monki Gras 2026 “Prepping Craft”
When safety and normality are slipping away, how do we make our code, our communities, and our lives truly resilient?
alexwlchan.net
March 23, 2026 at 9:16 PM