The Far Carry
How it was made
The AI disclosure on the store page is ticked for Code and Text & Dialog. That covers an enormous amount of ground, and a tick box cannot say which. This page says which.
No assets
There are no AI-generated art assets, because there are no art assets
Every visual in the game — the courses, the golfers, the ships, the item cards, the boss battle, even the icon and the store banner — is drawn by code as you play, as vectors and canvas drawing. Nothing came out of Midjourney or Stable Diffusion. There is not an image file in the project to have generated.
The sound is the same. There is not an audio file either: every note and every effect is synthesized in your browser as it plays. The music for each world is a piece of code, not a track.
This is a house rule rather than a technical necessity — see the studio page — but it is why the whole game arrives as one file and runs offline with nothing to fetch.
Who did what
The honest split
I wrote none of it — including the code that draws every visual and synthesizes every sound. If you are looking at a pixel or hearing a note, a machine wrote the function that produced it.
Dialogue, item and card text, and most of the story writing itself.
The game modes, the golf feel, the worlds, the story, the characters and the plot. I specified how it should look and sound; the AI implemented that.
It made countless decisions I never specified, and a fair few came back better than what I had asked for. I kept those.
The method
Specify, play, reject, repeat
I would describe what I wanted, play what came back, and send it back — sometimes four or five times — because it still did not feel right. Very little of this game is a first draft.
One play-test note — that the ball's bounce was not visible — survived six separate fixes, every one of which measured green. They were all measuring the model rather than the picture. It came right when the instrument changed, not when the numbers did.
If an idea is sound, say so and go. If it isn't, push back. A cheerful “yep!” followed by a half-working result is the worst outcome.
— the first rule in the project's own instructions to the AI
That loop is the interesting part and it needs more room than a page like this. It gets written up properly in the devlogs.
How it stays honest
The rules the build enforces on itself
A codebase written this fast, by something that does not remember yesterday, needs the promises to be machine-checked rather than remembered. So they are.
“Collects nothing” is a test
The build fails if a network call, a beacon, a cookie or an analytics dependency turns up in the game's source — and fails again if a storage key exists that the privacy document does not list, or the document lists one the code no longer writes.
Fairness is proved, not tuned
A penalty hazard may not sit in the corridor from the tee to the green. The generator checks its own output and throws the course away if it does, so an unfair hole cannot reach you.
The whole game plays itself, headlessly
The simulation is pure and deterministic from a seed, so 2,690 tests across 223 files can play entire runs and assert on the outcome. A seed and a build number reproduce any bug exactly.
The graphic is the physics
The aim cone, the ball flight and the putt read are drawn from the same functions the simulation samples. A ball drawn clearing a tree is one the game let through. They cannot drift, because there is only one of each.
The repository is public, so all of that is readable rather than merely claimed.
Built with
No engine
The Far Carry is hand-written TypeScript running in your browser. The play view is Canvas2D, the hole maps are SVG, and every sound is Web Audio, synthesized as it plays. It is built with Vite, tested with Vitest and headless Chromium, and wrapped with Capacitor for Android.
The whole game ships as a single inlined index.html. No engine runtime, no
asset bundle, no font files, no audio files — which is why it loads the way it does.
It bundles a small amount of open-source code (Vite and Capacitor, both MIT). Their notices ship in the repository.