← Writing
Build note · Claude Apps

Don’t subscribe to it. Build it.

Terra Incognita is my own version of a commercial geography game. It costs nothing a month to run — and the surprising part is how little of it was actually hard.

Terra Incognita gameplay: a photograph of Ha Long Bay beside a dark world map waiting for a pin
A photo of somewhere real, a map, and a clock. That’s the whole product.

There is a whole category of software you pay a monthly fee for that is, underneath, four or five well-understood parts wired together. Once an agent can write the wiring, the interesting question stops being could I build this and becomes why am I renting it.

So I took one apart. Terra Incognita is a where-in-the-world guessing game: you get a photo of a real place — or a drop into Street View — and you put a pin on the world map. Closer pin, more points. Play solo, take the weekly expedition, or open a live room and let a group guess the same places at once from whatever device is in their hand.

5,000
Points/round
$0
Hosting a month
164
Real places
74
Tests

Written as a product it sounds big. Written as a parts list it isn’t.

Every one of these is a solved problem with an obvious implementation:

A map you can click that gives you coordinates. A set of photos whose real coordinates you know. The distance between two points on a sphere. A round loop with a timer. Shared state so a group sees the same round at the same moment. Somewhere to keep the scores.

That’s it. That is the entire product. The commercial version is better than mine in ways that matter — more imagery, more polish, more people already playing — but it is not made of different parts.

Most of the parts are free

The world map is country outlines from open GeoJSON, converted once into inline SVG paths. No map provider, no tiles, no key — it is just shapes in the page, which is also why the game loads instantly. The photos come from Wikimedia Commons. The distance between your pin and the truth is the haversine formula, about a dozen lines. Live rooms are a Redis key with a four-hour expiry; the all-time leaderboard is one Postgres table. Both sit on free tiers, as does the hosting.

Exactly one dependency is metered: Google Street View, for the mode that drops you somewhere random on Earth. Everything else — all 164 hand-picked locations, the live rooms, the weekly board — runs at no monthly cost. Turn the Street View mode off and the running cost of the whole thing is zero.

The hard part isn’t the features

This is where the build-an-app-in-an-afternoon posts usually stop, and it’s the half that decides whether you have a product or a demo.

Scoring can’t live in the browser. The client knows where you clicked; it must not know how far off you were until the server says so, or the leaderboard is fiction. So the same location list is embedded in the page for rendering and held on the server for scoring — which creates an invisible contract between two files: they are indexed by position, so reorder one and every score silently becomes wrong. No error, no crash. That rule is written in capitals at the top of the repo instructions, because nothing in the language enforces it.

And the tests are the gate, not a chore. 55 unit tests and 19 end-to-end browser tests, and the deploy only runs if both suites pass — automatic deploys are switched off on purpose, so a red suite cannot ship. When code arrives faster than you can read it, tests stop being a quality ritual and become the only honest signal you have left.

What it actually replaced

The game is the fun example. The one that pays for itself is my painting gallery: it was a Squarespace store, and I rebuilt it as a custom stack on the same free hosting. Same shop, same domain, same catalogue — $45 a month to $0.

Building it is the easy part. Maintaining it is forever. That’s the trade, and it’s the only part of this worth thinking hard about.

When not to do this

Three cases where rolling your own is a hobby rather than a saving, and I’d rather say them out loud than pretend otherwise.

When you’re paying for the content, not the software. A geography game’s real asset is worldwide imagery and the people already playing it. I can copy the mechanics; I can’t copy either of those, and I’m not pretending Terra Incognita competes.

When it’s a system of record. Anything holding money, payroll, or customer data carries obligations that have nothing to do with whether you can write the feature.

When the subscription is cheap relative to your attention. Every thing you build is a thing you now maintain — keys rotate, dependencies drift, a free tier changes its terms. That cost is small but permanent, and it is paid by you.

What’s left after those three exclusions is still a surprisingly large pile. Most of the small tools you pay monthly for are a form, a table, and a rule.

Same as oil paint, really. Anyone can cover a canvas. Sweating the craft is the whole job — the difference is that the canvas just got a lot cheaper.

Go and lose to your colleagues

Open a live room, send the code round the office, and find out who can genuinely put a pin within 50km of Ha Long Bay. The leaderboard is permanent.