-
The Gatekeeper and The Nurse
Yesterday's dark-mode project left me with a contrast measuring script wired into nothing. So I hooked it up to the build script and my estate dashboard. The website now benefits from both a guard and a health check: helping keep it as accessible as it can be.
-
The Dark Mode That Found Five Older Bugs
Adding a dark mode to this site took about an hour, because I had built the stylesheet on colour tokens months before I had any use for them. Wanting it to switch automatically was the interesting part: the operating system already does the clever bit, and the specification has closed off the obvious workaround for the platforms that do not. Then the new palette exposed the old one, which had been failing accessibility contrast in five places since launch, along with an icon I got wrong four times and a build script that had been quietly lying to a hundred pages.
-
I Love Open Source Software Development
I released MenuTidy, QuitProtect and RainbowApple when I thought they were finished. Then people I had never met arrived on GitHub with bug reports, feature requests, translations and code — including one pull request I closed that still led me to a serious fault of my own. All three apps are better for it, and this is a thank-you to the open source community for lending me the one thing I cannot contribute to my own projects: another pair of eyes.
-
Changelog: Browsers, Rainbows, and an Honest Token
Six releases across four apps since the last changelog — a note that writes its own first line, a thread pool quietly starving in the background, five browsers a README had been promising for months, a rainbow that learned to ride the menu bar, and an error panel that stopped blaming your credentials for the weather.
-
Announcing Kairos: launchd Without the XML
macOS already ships an excellent scheduler. It survives reboots, handles missed runs, and needs no third-party daemon squatting in your menu bar — and the price of admission is hand-authored XML and a manual page that thinks Sunday is both 0 and 7. Kairos is the front end launchd never got.
-
Announcing Save Cannes: Your Films Are the Screensaver
There used to be a screensaver called Save Hollywood that played your own films when the Mac went idle, and it was quietly one of the best things on the platform until macOS broke it. Save Cannes is my tribute act — rebuilt from scratch, free, and honest about the one thing a modern screensaver can no longer be.
-
Changelog: Citadel 1.0.1
Two fixes, both found by pointing the engine at something it was never built for. Creatures were dissolving into any hot surface behind them — not just fire, but an amber door lamp would do it. And more than sixteen fireballs at once killed the game outright, which a room full of exploding drums can absolutely arrange.
-
Changelog: one fix, twenty-one apps
If you use more than one or two of these apps, your Mac has spent the week updating them. Most of it is a single fix to the shared settings pane, which for as long as it has existed opened at a fixed size with a scroll bar however much room the display had. Plus permission rows that stopped lying, a band of about twenty points beside the notch that macOS does not admit exists, and real features in Lookout, QuitProtect and ASCII Saver.
-
Changelog: Lookout 1.1.0
Lookout watches GitHub so I don’t have to. It sat silent for three days while three pull requests waited on one of my own repositories — not because it was broken, but because of one word in a search query. It also had a countdown that had displayed ‘in 0 sec’ since the day it shipped.
-
Changelog: ASCII Saver 2.0.1
The camera stayed on after the displays went dark. Thirty-one minutes of it, on my own machine, with the screen black and the green light on. The fix was four lines. Convincing myself it was actually running took considerably longer, and that part is the more useful story.
-
Changelog: QuitProtect 2.0.9, 2.1.0 and 2.2.0
Three releases in a day, prompted by the first substantial contribution anyone has ever sent me. QuitProtect now speaks Simplified Chinese, has an optional overlay telling you what to do next, and no longer claims to be protecting you when it isn’t. That last one was mine, and I only found it because I was reading someone else’s code.
-
Changelog: RainbowApple 2.0.11 and 2.0.12
Two releases in twenty minutes, for two bugs that had been sitting in plain sight. The rainbow logo was vanishing whenever certain apps took focus — not a drawing bug but a measuring one. And the six colours had been in the wrong places since the very first build, because I’d striped the wrong rectangle.
-
Changelog: ASCII Saver 2.0
ASCII Saver has stopped being a screensaver. It’s an ordinary app now, which sounds like a downgrade and isn’t — it’s the only way the thing could ever hold its own camera permission. Out go a second process, a shared-memory frame buffer and a settings file in /tmp; in come automatic updates, a real Settings window, and two caveats you should read before you upgrade.
-
We Are Now On Homebrew
Every public Jorvik app, game and screen saver is now installable from the terminal in one line. Which matters less for the one line than for what it lets you do: put your whole machine in a text file, and rebuild it from scratch without clicking anything.
-
Announcing Citadel: My Latest Native Mac Game
My second native game is out. Six weeks, forty-eight floors, one flamethrower, and a rule that quietly reorganises everything else: killing the thing that holds a floor is only half the job. Here's what Citadel is, what makes it strange, and every promise I broke to finish it.
-
Changelog: MenuTidy and ActiveSpace
A clutch of small, careful updates to two of my menu-bar tools. MenuTidy learned to tidy itself and made its peace with macOS Tahoe; ActiveSpace's space-aware app switcher finally makes it obvious which app you're about to land on.
-
When a Broken Link Is Not a Broken Link
I built a small dashboard to keep an eye on this website, and one morning it told me one of my own posts had a dead link — to Shadertoy, in the very post where I’d gushed about Shadertoy. Except the link works perfectly. Shadertoy just won’t talk to robots, and my robot took it personally. Here’s the small, careful feature I built so a tool can tell the difference between ‘broken’ and ‘I’ve checked, and it’s fine.’
-
The Volume Knob Was Winning
I’ve spent thirty years building a music library — pub bands, street buskers, support-act CDs that never reached a single streaming service, an almost-complete collection of a band who deleted themselves from history. All of it recorded at wildly different volumes, all of it a chore to actually listen to, because one hand was forever on the dial. So I built a small app that learns how loud each track really is and quietly evens them out — no audio driver, nothing to install. This is also the project the dancer was hiding in.
-
Nobody Dances Like That
A little app I’ve been building sprouted a music visualiser, and I decided it needed a dancer in the spotlight. So I drew one — head, arms, a swirling skirt — and she looked wrong in a way I couldn’t explain. Here’s how a black blob, a smoke machine, and a hard lesson about the human form taught me to make something feel alive by refusing to say what it is.
-
The Furniture Was a Lie
I filled my next game's rooms with bunks, lockers, oil drums and dead terminals to make the place feel lived-in. It looked wonderful. There was just one problem: you could walk straight through all of it. Here's how I made the set-dressing solid — without costing a single frame.