More About Me
- My /now page shows what I am doing.
- Résumé/CV shows what I have been doing.
- Work with me on your projects!

Writing
- Introduction to my most important articles.
- Wiki with important concepts.
- All About TextKit: I deal with text, and here's a collection of everything I figured out 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.
Latest Blog Posts
Sep 21 2023 |
Sparkle v2.5 Adds Relevant Version Highlighting to Release Notes With Sparkle v2.5, you can ship release notes for multiple versions, and then use CSS to hide outdated information from the user. |
Sep 18 2023 |
Portable Painter Micro Palette As a birthday gift, I got the Portable Painter Micro watercolor palette with some new colors. Here’s my first sketch with it. |
Sep 13 2023 |
UserDefaults.register(defaults:) Is a Bit Like Nil-Coalescing Mental model: registering fallback values for UserDefaults is like Optional coalescing in Swift. |
Sep 11 2023 |
Some bullet points (and stats) about my previous year in life. |
Sep 9 2023 |
Kill Unsaved Emacs Buffers UX: Replacing Yes/No/Save with Meaningful Options Since Emacs 29, I'm being asked if I want to save or discard an unsent mail in a very confusing way. I found a fix. |
Sep 7 2023 |
The Missing Array.appending(contentsOf:) There is no immutable append variant to concatenate two Arrays, or Strings, or other collections in the Swift standard library. Here is one. |
Aug 15 2023 |
Making Your App Extensible with JavaScriptCore: Annotated Presentation with Full Transcript Last year's presentation slides with the full talk transcript for my JavaScriptCore plugin approach. |
More blog posts in the archive