56,966 blogs · [ { "id": "01a0e325-1b4f-71dc-9e63-eda4ecaf0445", "title": "Parametrised tests in Rust with named parameters", "url": "https://alexwlchan.net/2026/table-driven-rust/", "published_at": "2026-09-26T08:43:00+00:00" }, { "id": "01a0d51c-dd2d-73b2-b2fe-895c004a7265", "title": "Abusing ID3 chapters to turn videos into glanceable podcasts", "url": "https://alexwlchan.net/2026/glancecast/", "published_at": "2026-09-15T11:04:15+00:00" }, { "id": "01a08724-dd13-73c8-8c0e-30ebb5951f44", "title": "What is WS11 1DB?", "url": "https://alexwlchan.net/notes/2026/stripe-post-code/", "published_at": "2026-09-08T21:13:17+00:00" }, { "id": "01a08724-dd13-73c8-8c0e-30ebb61df887", "title": "Blocking referrers with Caddy", "url": "https://alexwlchan.net/notes/2026/blocking-hacker-news/", "published_at": "2026-09-02T21:27:35+00:00" }, { "id": "01a08724-dd13-73c8-8c0e-30ebb662acd5", "title": "How to type a Spanish question mark (¿) on a Mac", "url": "https://alexwlchan.net/notes/2026/spanish-question-mark/", "published_at": "2026-08-31T08:54:13+00:00" }, { "id": "01a08724-dd13-73c8-8c0e-30ebb688e13c", "title": "Non-overlapping type comparisons and Python type checkers", "url": "https://alexwlchan.net/notes/2026/non-overlapping-types/", "published_at": "2026-08-27T18:27:27+00:00" }, { "id": "01a08724-dd13-73c8-8c0e-30ebb6d40cfd", "title": "Why does t.Setenv panic after t.Parallel?", "url": "https://alexwlchan.net/notes/2026/serial-tests-in-go/", "published_at": "2026-08-23T20:23:53+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a2940d18cdf", "title": "Why can’t you combine .tar.gz files with cat?", "url": "https://alexwlchan.net/2026/cat-confusion/", "published_at": "2026-08-20T09:49:28+00:00" }, { "id": "01a08724-dd13-73c8-8c0e-30ebb7475ae1", "title": "Use Path.glob() and Path.rglob() for typed versions of glob.glob()", "url": "https://alexwlchan.net/notes/2026/path-glob/", "published_at": "2026-08-17T20:49:17+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a294108db36", "title": "How Tailscale tracked down a 16-year-old SQLite bug →", "url": "https://tailscale.com/blog/sqlite-wal-reset-bug", "published_at": "2026-08-13T16:14:06+00:00" }, { "id": "01a08724-dd13-73c8-8c0e-30ebb776277e", "title": "Curious clocks and colourful eyes", "url": "https://alexwlchan.net/notes/2026/clocks-and-eyes/", "published_at": "2026-08-10T23:02:05+00:00" }, { "id": "01a08724-dd13-73c8-8c0e-30ebb83222be", "title": "Track which templates are used by Jinja2", "url": "https://alexwlchan.net/notes/2026/jinja2-dependency-tracking/", "published_at": "2026-08-10T02:07:37+00:00" }, { "id": "01a08724-dd13-73c8-8c0e-30ebb87db956", "title": "Archeologists distinguish between “sherds” and “shards”", "url": "https://alexwlchan.net/notes/2026/pottery-sherds/", "published_at": "2026-08-01T08:28:34+00:00" }, { "id": "01a08724-dd14-7070-9726-07a5b767d936", "title": "A single command to test all my changed Go packages", "url": "https://alexwlchan.net/notes/2026/go-changed-tests/", "published_at": "2026-07-21T07:49:38+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a2941ac6ce1", "title": "Preventing line breaks in <code> elements", "url": "https://alexwlchan.net/2026/non-breaking-code/", "published_at": "2026-07-18T08:00:04+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a2941c0fa39", "title": "Fixing a bug with byte order marks", "url": "https://alexwlchan.net/2026/byte-order-marks/", "published_at": "2026-07-18T07:11:26+00:00" }, { "id": "01a08724-dd14-7070-9726-07a5b7bb30e5", "title": "Disable the new message animations in WhatsApp", "url": "https://alexwlchan.net/notes/2026/disable-whatsapp-message-animations/", "published_at": "2026-07-15T07:06:27+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a29425b6244", "title": "A Git hook to prevent committing directly to main", "url": "https://alexwlchan.net/2026/no-main-hook/", "published_at": "2026-07-13T20:44:05+00:00" }, { "id": "01a08724-dd14-7070-9726-07a5b848225b", "title": "Finding high-churn folders that bother Backblaze", "url": "https://alexwlchan.net/notes/2026/backblaze-churn/", "published_at": "2026-07-07T19:50:49+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a2942c79c70", "title": "Describing all my photos", "url": "https://alexwlchan.net/2026/describing-my-photos/", "published_at": "2026-07-05T18:01:19+00:00" }, { "id": "01a08724-dd14-7070-9726-07a5b90c462a", "title": "Always-on SSH agent forwarding with my Git pushes", "url": "https://alexwlchan.net/notes/2026/ssh-config/", "published_at": "2026-07-04T22:39:17+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a2943bf8eb8", "title": "I don’t want to repeat repeat myself", "url": "https://alexwlchan.net/2026/repeating-myself/", "published_at": "2026-07-03T15:52:05+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a29444fa912", "title": "Rebuilding the computer room", "url": "https://alexwlchan.net/2026/computer-room/", "published_at": "2026-06-29T08:28:13+00:00" }, { "id": "01a08724-dd14-7070-9726-07a5b9e06e8a", "title": "Managing the caption of a photo with AppleScript (but not PhotoKit)", "url": "https://alexwlchan.net/notes/2026/photo-caption/", "published_at": "2026-06-28T22:26:15+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a29453f0af2", "title": "What can wonky APIs tell us about the web?", "url": "https://alexwlchan.net/2026/wonky-web-apis/", "published_at": "2026-06-21T14:29:21+00:00" }, { "id": "01a08724-dd14-7070-9726-07a5ba905bab", "title": "Goodhart’s and Campbell’s Law are different", "url": "https://alexwlchan.net/notes/2026/campbell-and-goodharts-law/", "published_at": "2026-06-14T06:52:31+00:00" }, { "id": "01a08724-dd14-7070-9726-07a5bb14d84e", "title": "Notes from The Cornishman No. 176 (Spring 2026)", "url": "https://alexwlchan.net/notes/2026/cornishman-176/", "published_at": "2026-06-07T12:44:59+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a29461be4f8", "title": "Using the Screen Capture API to record a browser window", "url": "https://alexwlchan.net/2026/record-browser-video/", "published_at": "2026-06-07T08:03:45+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a294630a189", "title": "Using Pytester to test my Playwright fixtures", "url": "https://alexwlchan.net/2026/pytester/", "published_at": "2026-06-05T08:14:37+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a29466501ce", "title": "Rendering a chat thread in CSS and JavaScript", "url": "https://alexwlchan.net/2026/css-chat/", "published_at": "2026-05-29T07:51:28+00:00" }, { "id": "01a08724-dd14-7070-9726-07a5bbbaecf7", "title": "GitUp can’t diff text files larger than 8MB", "url": "https://alexwlchan.net/notes/2026/gitup-diff-8mb/", "published_at": "2026-05-26T23:27:03+00:00" }, { "id": "01a08724-dd14-7070-9726-07a5bca85423", "title": "Format “human-readable” JSON with FracturedJSON →", "url": "https://github.com/j-brooke/FracturedJson/wiki", "published_at": "2026-05-15T07:56:07+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a2946b13a6e", "title": "Waiting for website changes in the browser", "url": "https://alexwlchan.net/2026/livereload-in-browser/", "published_at": "2026-05-14T07:51:01+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a2947173515", "title": "Watching for file changes on macOS", "url": "https://alexwlchan.net/2026/watch-files-on-macos/", "published_at": "2026-05-11T06:41:24+00:00" }, { "id": "01a08724-dd14-7070-9726-07a5bd7cc8f2", "title": "Testing the width of a page on a mobile device using Playwright", "url": "https://alexwlchan.net/notes/2026/test-width-of-page/", "published_at": "2026-05-06T18:27:20+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a29475f25d1", "title": "Using Playwright to test my static sites", "url": "https://alexwlchan.net/2026/playwright/", "published_at": "2026-05-02T06:08:53+00:00" }, { "id": "01a08724-dd14-7070-9726-07a5bdcc2182", "title": "Disable AirPods charging notifications", "url": "https://alexwlchan.net/notes/2026/disable-airpods-charging-notifications/", "published_at": "2026-05-02T05:45:10+00:00" }, { "id": "01a08724-dd14-7070-9726-07a5be929dad", "title": "Start a Caddy server in a subprocess during a Python session", "url": "https://alexwlchan.net/notes/2026/caddy-in-pytest/", "published_at": "2026-04-30T08:04:38+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a29480cad35", "title": "Building a basic cache with SQLite", "url": "https://alexwlchan.net/2026/sqlite-cache/", "published_at": "2026-04-29T08:24:49+00:00" }, { "id": "01a08724-dd14-7070-9726-07a5bec0b41b", "title": "Filter a list of JSON object based on a list of tags", "url": "https://alexwlchan.net/notes/2026/jq-filter-by-array/", "published_at": "2026-04-28T21:52:44+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a294903270f", "title": "HTTP GET requests with the Python standard library", "url": "https://alexwlchan.net/2026/python-http-with-the-stdlib/", "published_at": "2026-04-24T14:14:03+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a2949569993", "title": "Auditing my local Python packages", "url": "https://alexwlchan.net/2026/python-package-audit/", "published_at": "2026-04-10T17:00:35+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a2949e6ba09", "title": "Quietly quantum-resistant blogging", "url": "https://alexwlchan.net/2026/post-quantum-blog/", "published_at": "2026-04-09T08:28:09+00:00" }, { "id": "01a08724-dd14-7070-9726-07a5bf30f3f6", "title": "HOME_GET_ME_HOME is a Citymapper Shortcuts action", "url": "https://alexwlchan.net/notes/2026/home-get-me-home/", "published_at": "2026-04-07T20:55:47+00:00" }, { "id": "01a08724-dd14-7070-9726-07a5bfa76e46", "title": "The FileExistsError exception exposes a filename attribute", "url": "https://alexwlchan.net/notes/2026/fileexistserror-filename-attribute/", "published_at": "2026-04-07T20:50:30+00:00" }, { "id": "01a08724-dd14-7070-9726-07a5c067c3ca", "title": "The red-lined bubble snail", "url": "https://alexwlchan.net/notes/2026/red-lined-bubble-snail/", "published_at": "2026-03-28T10:59:16+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a294a09a625", "title": "Creating a personalised bin calendar", "url": "https://alexwlchan.net/2026/bin-calendar/", "published_at": "2026-03-26T17:33:58+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a294a21a184", "title": "Monki Gras 2026 “Prepping Craft”", "url": "https://alexwlchan.net/2026/monki-gras-2026/", "published_at": "2026-03-23T20:46:15+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a294b0e3135", "title": "The selfish case for public libraries", "url": "https://alexwlchan.net/2026/selfish-case-for-libraries/", "published_at": "2026-03-19T07:07:21+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a294b2c29b0", "title": "Dreaming of a ten-year computer", "url": "https://alexwlchan.net/2026/ten-year-computer/", "published_at": "2026-03-12T14:25:03+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a294b462463", "title": "Gumdrop, a silly app for messing with my webcam", "url": "https://alexwlchan.net/2026/gumdrop/", "published_at": "2026-03-05T08:58:35+00:00" }, { "id": "01a07d5d-5757-73b1-b7c2-9a294c14f275", "title": "The bare minimum for syncing Git repos", "url": "https://alexwlchan.net/2026/bare-git/", "published_at": "2026-02-17T08:08:40+00:00" }, { "id": "01a0d4db-ce55-7319-9b05-745fdadd024e", "title": "Making a PDF that’s larger than Germany", "url": "https://alexwlchan.net/2024/big-pdf/", "published_at": "2024-02-01T17:27:57+00:00" } ] posts Claim your blog
Back to Alex Chan
Blog · corpus.blog/blogs/alexwlchan.net/posts

Alex Chan

alexwlchan.net

2026

2024