Mac developer, writer, toolmaker
I build Mac apps for writers and thinkers, and write about how programmers learn and think: Swift and AppKit, the Zettelkasten method, Emacs, and lately AI-assisted work.
Latest
Reaching mastery has no clearly defined finish line, and in software crafting in particular, it is a ‘wicked’ environment because the rules and tools change under you all the time while everyone disagrees about what the goal is.
Hazel 6 is discounted 35% for the 20th birthday of this amazing little Mac helper!
Lettera: A Refined Markdown Document Editor
Shiny Frog's new Markdown editor for macOS goes into beta today. It's like Bear, but for any file or folder on your computer. I've been lucky enough to help build it.
Retelling Stories with Commit Diffs in My Head
Successful code changes where I don’t feel a lot of friction may boil down to being able to retell a story of small changes here and there in my head.
Swift Blog Carnival Roundup: Tiny Languages
Recap of the very first Swift Blog Carnival on the topic of Tiny Languages: six posts on task runners, DSLs, parsers, symbolic math, and grammar tools.
More blog posts in the archive
Learn
Twelve years of notes on how programmers get better: deliberate practice, useful friction, and writing to find out what you don't understand yet. A reading path across the archive, oldest idea first.
-
Imitate, improvise, innovate. The three stages still hold when imitation becomes free
-
Why the hard parts are the parts that teach
-
Which friction is toil, and which friction is the workout
-
Comparing Use of AI vs Learning to Code Has Nothing to Do With Knowledge
Finished work and understanding are different outputs
-
Getting Over Frustratingly New Topics (Swift Concurrency) with a Zettelkasten
Swift Concurrency as the worked example: vocabulary, confusion, hypotheses, corrections
-
Zettelkasten for Programmers: Documenting Confusing with Swift.SendableMetatype
Start a note with the sentence you cannot explain yet
-
Retelling Stories with Commit Diffs in My Head
If you can't narrate the change, you don't own it yet
-
Counter Drift and Entropy with Kaizen
Code changes faster than your model of it. Small, regular repairs
-
What’s a Zettelkasten Good for in the Age of Affordable LLM’s?
The method underneath all of this, and why generation doesn't replace it
-
There is no finish line, and no substitute for going through the process
Think
-
A commented table of contents of my most important articles.
-
Concepts I keep coming back to, one page each.
-
I deal with text. Everything I figured out about Apple's text system so far.
-
Ultimate FastSpring Guide for Selling macOS Apps
I sell my macOS apps in my own store. Resources and tips to get you started.
Build
Books
All booksSenior macOS/iOS engineer in Bielefeld, Germany. CV, portfolio, and how to work with me.

