-
The App I Needed At 1am
“I've lost my mouse pointer” demanded a tiny one-shot utility — and taught me a lesson in why “give the user a Terminal command” is a poor recovery flow when she doesn't have a mouse pointer. Building MouseCatcher, bundling it with ActiveSpace, and the install-permissions detour that nearly derailed it.
-
When the Stars Align (Final Cut)(Maybe)
The latest version of ActiveSpace is shipped. Third and final post in the stars-align saga: the 640×480 virtual display from the Redux turned out to be a perfectly valid second monitor as far as macOS was concerned, with the Dock and cursor both happily wandering onto it. A drift reposition, a cursor fence, and the satisfying deletion of a self-restart mechanism the data showed wasn't needed.
-
Screen Savers Still Exist
I built a screen saver, and why not? It's a full-screen canvas that activates when you step away from your desk. Some would call it a relic of the CRT burn-in past. I say it's a dashboard, a photo frame, an ambient display. It's just wearing the wrong name.
-
Fine, Apple. You Win
Three months of stubbornness, then an afternoon of capitulation. The follow-up to "The Deploy Problem Nobody Talks About": every Jorvik app now ships a signed .pkg installer alongside the .zip, closing most of the quarantine-and-translocation friction the previous post complained about. Why .dmg would have solved nothing, what macOS Installer actually does on your behalf, and — because no release week is complete without one — the story of a build pipeline that silently shipped one of my apps without its own bug fix.
-
The Deploy Problem Nobody Talks About
You can build, sign, notarise and publish a macOS app in three minutes — and still lose hours getting it to run correctly on someone else's machine. This post unpacks the gap between 'released' and 'correctly installed' that only exists when you distribute outside the Mac App Store.
-
Version Numbers Are a Promise
A version number looks trivial — MAJOR.MINOR.PATCH — but for a single app it lives in five places (plist, GitHub release, config, git tag, installation), and any failed step pulls them silently out of sync. This article walks through how our Notes Editor ended up at four different versions simultaneously, why git describe can lie when tags are close together, and how we reworked our Release Manager pipeline to keep the build, release, tag, config, and installed binary all telling the same story.
-
Notarisation is Not Notarisation
A deceptively simple naming mismatch unravels an entire macOS release pipeline, revealing how fragile even well-engineered systems can be when assumptions leak between build, packaging, and runtime environments. In this deep dive, we trace how differences between PRODUCT_NAME, bundle names, and display names caused subtle but cascading failures across signing, notarisation, auditing, and distribution — despite a meticulously designed 10-stage pipeline.
-
Why I Don't Ship Preferences
Most software overloads users with settings — but what if that’s the problem? In this article we argue for fewer preferences and stronger defaults, showing how opinionated design reduces complexity, improves usability, and lets software just work.
-
Typography Matters
Typography on the web is mostly wrong — straight quotes, double hyphens for dashes, three dots for ellipses. Not because writers don’t care, but because the tools don’t care for them. Here’s how the Notes Editor and Web Editor handle curly quotes, smart dashes, acronym wrapping, spell-check suppression, and widow control — so the writer focuses on content and the toolchain handles the rest.
-
When the Stars Align (Redux)
The instant space switching technique that worked on two monitors and broke on one. The twelve-hour debugging odyssey that followed. And the absurd, brilliant fix that saved it.
-
When the Stars Align
How two open-source projects, a handful of undocumented APIs, and a Thursday morning conspired to make macOS space switching instant.
-
The Case for Small Software
Why every Jorvik app is deliberately small, single-purpose, and unburdened by features it doesn't need — and why 1,200 lines of Swift is a feature, not a limitation.
-
Spell-Checking in Three Lines of Code
Adding spell-checking to the Notes Editor took three lines of configuration and one delegate method. This is what building native gets you.
-
Open by Design: Why I Contribute to the Public Domain
Every app, every line of source code, every screensaver — free, open source, public domain. No catches, no conditions, no asterisks. Here's why.
-
Why I Keep Rebuilding Arcade Games
Three tributes and counting. Not because the world needs another Centipede clone, but because some things are worth remembering with your hands, not just your head.
-
Building ClipMan
A clipboard manager sounds simple — watch the pasteboard, store what changes, let the user paste it back. The interesting parts are everything that happens in between.
-
The Accessibility API Is Underrated
Most macOS developers reach for AppleScript, browser extensions, or Electron when they need to interact with other apps. There's a better option sitting right there in ApplicationServices, and almost nobody talks about it.
-
Power Tools
AI slop is real. The backlash is understandable. But there's a difference between throwing paint at a wall and using a better brush — and I think it's worth talking about.
-
Browser Commander: Because Backspace Should Go Back
A macOS menu bar app that brings keyboard-driven navigation to every browser — back, forward, and a searchable link navigator, all via the Accessibility API.
-
Browser Notes: The App That Nearly Injected JavaScript Into Your Web Pages
How a browser annotation tool went from injecting JavaScript into web pages to reading a single text field via the Accessibility API — and why deleting the clever code was the best decision.