Blog

Articles, notes, and links. Software, AI, calligraphy, politics — in that rough order.

Building on CloudflareArticle7 min read

An introduction to Cloudflare's ecosystem

How Cloudflare's networking, security, compute, and storage services fit together, with Unblock Syria as a working example and a look at the five-dollar Workers plan.

Tutorial20 min read

Drawing link previews that work in Arabic

One Open Graph image per route, built two ways: HarfBuzz and resvg at build time, satori per request. Then the part that breaks in Arabic — word order, letter joining, and measuring text the font draws differently than it measures.

Note3 min read

Syria is off the list

Syria went on the American terrorism list in 1979 and came off it on Monday. I wrote the careful version for Unblock Syria. This is the one where I'm happy, and still angry.

Article26 min read

Why AI gets Arabic calligraphy wrong

Arabic handwriting: 0.8% word error. Classical calligraphy: 45%. I went looking for the missing training data behind that gap and found the opposite — rules written down in the tenth century, and encoded in software in the 1980s.

Article21 min read

Binding libVLC directly from Swift 6

Four and a half months, twenty-five patches carried against VLC's own source, and one feature I still cannot ship. What it takes to own a C engine instead of consuming one.

Article5 min read

Namespace your Swift extensions

Add a member to a type you do not own and it lands in that type's namespace, not yours. SwifterSwift hit this past five hundred extensions. Here is the wrapper that fixes it, and why you have to choose it before your first release.

Tutorial5 min read

Enforce SSH instead of HTTPS for Git operations

Generate a key, register it, tell SSH which one to use — then have Git rewrite every HTTPS remote to SSH, including the ones inside other people's submodules and lockfiles.

Note2 min read

A typealias can take a type parameter

Name a completion signature once and spell it Handler<Post> at every call site. Readable, and a single place to change the error type. Documentation the compiler spell-checks, and nothing more.

Note2 min read

When to use a safe collection subscript

Should an out-of-bounds index crash, or come back nil? It turns on whether you produced the index or someone else did — plus one performance trap on collections that are not arrays.

Topics