The only constant is change

June 27, 2026

studiobuild-in-publicpivot

The only constant is change

"The only constant is change" is the most over-quoted thing a person can say while changing everything, so, naturally, here I am saying it. I spent the last 10 days or so rebuilding one game and repricing another — a slightly absurd look for a studio whose entire pitch is we won't change on you. (Relax. The principles didn't budge. Everything propping them up did.)

Two of my games changed shape. One wants to be on more phones. One wants to be on more than a phone. Both come down to the same unglamorous goal: get the thing in front of the people who'd actually enjoy it. I am not above making a buck, but I am doing this because I like to make games, and what makes me happy is having people play them.

LineBy wants more hands

LineBy — the tile-swap quote puzzle — is chasing reach from two directions at once.

First, it went freemium. Every day I post a fresh puzzle to Instagram, and for a while my pitch was, essentially, here's something lovely — now go pay to touch it. World-class way to get scrolled past. So the daily puzzle is free now, forever — see it on Instagram, open the app, play it, no wallet required. What a one-time purchase buys is the whole library: the original 315 hand-built quotes, the custom puzzle builder, and the daily archive — and that last part is the new twist. The catalogue isn't a fixed box of 315 anymore; every day's puzzle joins it. Buy it once — never a subscription — and you own a thing that grows on its own while you sleep. It's the most subscription-shaped sentence I will ever write about a one-time purchase, and I have decided to enjoy that.

A puzzle game is the easy case for reach — it's small, it's mostly content, and the question is just whether it's in front of you. Some games aren't so lucky.

Some games need more than a phone

Worldwright is the harder case. It's a rise-and-fall civilization builder — you nurse a society through one age into the next, and every era starts from nothing. The kind of game where you want to see the whole board: a lot of pixels, a mouse to hover with, a keyboard for the shortcuts your hands learn by week two.

I started it as a native iOS app, SwiftUI and SceneKit. It looks lovely on a phone — and it shouldn't be stuck there. A strategy game that lives or dies on how much you can take in at a glance deserves more than a five-inch screen when you've got a bigger one to hand.

So I made the call and rebuilt the whole thing in Unity. Nothing says I deeply respect my own time like deleting several weeks of perfectly good SwiftUI because the screen was an inch too short. Same game, new engine — which will let you run it on desktop and Android too, not just the iPhone it started on, with a far bigger window to think inside when you want one. The phone stays; it just stops being the only option. It's still in development, so better to swap the foundation now, before anyone depends on it, than to ship it boxed-in and apologise later.

The one useful thing: the rewrite cost me the shell, not the game

"I rebuilt it in another engine" sounds like I threw the game out and started over. I didn't — and the reason is a discipline I keep banging on about: the rules of Worldwright never lived in the iOS app.

They live in a separate package, WorldwrightSim, that has exactly zero idea anything is being drawn. No SceneKit, no SwiftUI, no notion of a screen at all. It's a pure simulation: hand it a world and a decision, it hands you back the next world. The board's only job is to display that world and send it intents — "place a granary at tile 14,7" — and it never, ever owns the rules.

// The whole sim is shaped like this — no rendering, no platform, just rules:
func step(_ world: World, _ action: Action) -> World
// SceneKit drew the result. Unity draws the result now. The function never noticed.

Because the logic never touched the rendering, swapping SceneKit for Unity meant rewriting the shell — the part that draws boards and catches taps — and carrying the rules across almost untouched (Swift to C#, same deterministic tick). The engine change was a paint job on a house whose plumbing I didn't have to move.

This is the dividend of the pure-core habit I wrote about earlier: separate the rules from the pixels and you can change your mind about the pixels — even change engines — without renegotiating the game. I didn't build it that way to enable a port. I built it that way because it's how I keep the logic testable and the saves trivial. The port came free.

What didn't change

Here's the punchline to a thousand words about change: the part that matters didn't — no ads, no tracking, ever. LineBy stays a one-time purchase, not a subscription — what you buy is yours, even as the catalogue keeps growing under it. A game collects only what it needs to run, never to sell. The em-dashes survived too, obviously; I've made peace with the fact that neither I nor the machine I write with will ever quit them. Change the screen, change the engine, change the price of the front door — just don't change who you are while you do it. Which is the whole point of a post that spent this long pretending everything was different.

More soon — RSS if you'd like to hear about the next time I change my mind in public.