I built The Island of Crete by directing a team of AI coding agents (Muse, Cursor and Anthropic’s Claude Code). I set the vision, made the calls and played every build; the agents wrote the code, the tests and the documentation, each in its own copy of the project, and every change went through automated tests and code review before it could go live. From the first draft on October 8 to November 5, that took 22 days of work spread over four weeks; on the other 7 days nobody worked on it. This post is the story of how it was built, in pictures: how the game grew, how it is put together, and how its levels are made, proved and shared.
From a quick chase to a puzzle game
Crete started out crude. The very first draft, on October 8, drew the island in plain text characters: # for walls, E for the exit, @ for you and C for the creature. Within the hour it had switched to emoji, and the first version we kept, on October 9, was an emoji grid on a text page: you moved once, a creature moved twice, and a status panel listed your health and items. It also borrowed its theme from a TV show, which we have since dropped (it’s blurred in the pictures below). A week later the same chase had moved into a proper game frame, with a status bar and a move pad, but it was still emoji on a dark grid.
That one rule, two steps for every one of yours, was the seed of everything that followed. That same day, October 16, we redesigned the game around the myth of Theseus and the Minotaur and the classic tile puzzle: one move at a time, nothing moves until you do, and the Minotaur always closes the gap if he can. The first build of the new design, a day later, was still rough: eight trial levels on a flat board, with emoji standing in for the tools.
Today it has a hundred hand-built levels in ten chapters. Each chapter brings in one new piece, teaches it in three short levels, then mixes it with everything before in seven harder ones. The story is told on chapter cards and hidden pages, quoting the old sources word for word from public-domain translations: Plutarch, Ovid, Apollodorus, Catullus and others.
The First Week
From an emoji grid on a text page to the first drawn board. The borrowed TV theme of the first two is blurred.
Two looks, one game
The first drawn version used sprites rendered in Blender, every one built from a scene written in code, with no outside art. That became Classic. Then came Modern, a 3D board you can turn, tilt and zoom, built from shapes and textures generated in code. Its first version, honestly, was a mess: brown, murky and hard to read. Playtesting on a phone pushed it, in a few days, to grey stone and pale sand, then to crisp edges with no blur, so every piece can be named at a glance on a small screen.
One Level, Two Weeks
The same Chapter 1 level, ten moves in, as the look changed from October 20 to today: read left to right, top to bottom.
You can swap looks mid-move with the Map button and nothing about your game changes. Classic never loads a 3D engine at all, so it stays light on any computer; Modern is downloaded only when you choose it, and the game falls back to Classic if a device can’t draw 3D. Both share one camera: a compass to turn and tilt, a tap to reset.
Many small touches came from watching people play. The exit, the Aegean Portal, stays dark until you hold every relic, then light rises up its arch and fills its pool. Bars slide over the Daedalus Gate behind you, and doors sink into the floor as you walk through. The title card is a night scene of the Labyrinth’s entrance, also built and rendered in code.
The Title Card, Then and Now
The first title card on October 17, and today's night scene of the Labyrinth's entrance.
Inside the game
Under the pictures, the game is a few separate parts that never wait on each other. The screens and menus are small Preact components written in TypeScript. Beneath them sits the rules engine, which knows nothing about the page: every piece is data, and a turn is a pure step from one state to the next, so Undo is simply going back a state.
The heavy thinking happens in background workers, off the page, so the board never freezes: one for the exact solver and the editor’s checks, and one that builds your next Endless levels while you play. The game installs like an app, plays offline, and keeps its results, runs and progress on your device. Code shared by all our games lives in a small kit that is bundled into each game when it is built, so every game stands alone.
Even the music is made this way. The title theme was composed for the game as a score in code and rendered with free orchestral samples: harp, cellos, horn and organ. It streams rather than loading whole, loops with no audible seam, and plays on every screen without restarting; the sound effects are synthesised live in the page.
A solver at the heart of it
Every puzzle game has to answer one question: can this level be won? Crete has an exact solver built in. It searches every situation the level can reach (where Theseus and the Minotaur stand, what’s been picked up, which doors are open, where each hazard is) using A* search with a careful estimate of the moves left, and it packs each situation into a few numbers so it can hold millions of them. It proves a level winnable, finds its fewest moves, or proves it can’t be won.
That solver powers everything players see: the “Best” move count on every level, Ariadne’s thread when you’re stuck, the editor’s Check button, and the Endless generator.
Rules every level must keep
Early on, a level could be winnable and still be no fun: the beast walled off from the start, or a door and key you could simply walk past. So every level, whether hand-made or generated, has to pass a gate:
- The beast must matter. Ignoring the Minotaur and walking straight to the exit has to lose, and he has to stay a live threat for much of the route.
- No forced catches. You never have to walk into him to win, because no player could know to do that.
- Every piece has a purpose. Take any piece out, and the level must get longer, change, or become unwinnable. No decoys.
- A steady climb. Each level is harder than the one before by a set margin. There are no cliffs.
- Original layouts. No level is a rotated or mirrored copy of another; a test compares every pair.
Measuring "hard" the way people feel it
At first, “difficulty” meant how hard the solver had to work. Playtesting showed that’s not what people feel. In Endless, I could put the wooden cow down at once and simply walk past the beast. So we tested it. We wrote simple “habit” players: one that just walks, one that drops the cow on move one, one that raises the mirror whenever he’s close, a careful one that dodges, nine in all. About 29% of the Endless levels of the time fell to one of those habits, and the solver’s effort didn’t predict which.
That matches the research. Jarušek and Pelánek, studying thousands of human Sokoban solves, found that how much work a computer does to solve a puzzle explains little of how hard people find it. Robert Abbott’s notes on his Theseus and the Minotaur mazes say the same in plain words: what makes a maze hard is its false paths.
So no level at any setting can be beaten by a habit, and difficulty is scored by things people actually feel: how far the beast forces you off the best path, moves that look wrong but are right, waits, and traps that look safe but can’t be won.
Levels by hand and by machine
The campaign’s levels are drawn by hand in the game’s own level editor, and the automated tests hold every one of them to the gate on every change. Endless is made by machine: a seeded generator carves corridor mazes in six different styles, places pieces on their passages, and keeps only the drafts that pass the gate. It comes in Easy, Medium and Hard, each climbing level by level to a plateau, and a run never shows you a maze that looks like one of your last twelve.
Anyone can build levels too. The editor’s Check runs the same solver and the same gate, shows the fewest moves and the Endless rating, and lists in plain words anything that keeps a level out of Endless. A finished level is shared as a link: the whole level travels inside the link itself, with the solver’s proof that it can be won.
A shared bank of levels
A good Endless level can take a couple of minutes to find on a phone. So the game keeps a shared bank: players who choose to help send up the levels their devices make, and every player can draw fresh levels from it at once. The hard part is trust: a person must never be able to sneak in a level drawn by hand, say a maze whose walls spell a word.
The answer is the recipe. Generation is deterministic, so each level carries the seed, settings and generator version that made it. A new level waits, unserved, until two other devices, one of them on a different network, are handed only the recipe and make exactly the same level, byte for byte. Nothing in a recipe can place a wall, so only levels the generator really made reach players. Only devices whose players said yes do this checking. The game asks once, the first time you start a new game or Endless, whether to Help Build Endless Levels; it stays off until you say yes, and you can change it any time in the menu. Even then it works only while the game sits idle, never during play or on a low battery.
With few players, a scheduled cloud runner of ours keeps things moving: every six hours it checks the levels waiting in line, then makes new ones where the bank is thinnest, Hard and big boards first. The bank service itself is small on purpose: it only stores and serves levels; all the solving happens on players’ devices and the runner.
Inside the level bank
The bank service keeps one store per difficulty, and every change to a store happens one at a time, under a lock: the new copy is written in full beside the old one, then swapped in, so nothing ever reads half a file. Each store has two parts. The waiting list holds up to 300 levels that no player is served, each kept with its recipe, and drops any still waiting after three days. The served pool holds up to 1,500.
Every arriving level is fingerprinted by its layout, turned and flipped too, so a copy is refused at the door and takes no room. When a new level takes a difficulty past its cap, one served level retires, picked at random but weighted by its age and how often it has been played, so the bank turns over steadily without losing its oldest levels all at once. Two reports from players on different networks retire a level too, and when the generator changes, a whole old version can be retired. Every layout that leaves goes on a retired list that is kept for good, so no level ever comes back.
Making levels at scale
Levels come from three places, all running the same generator and the same gate. On a player’s device it’s opt-in: with Help Build Endless Levels on, a background worker makes and checks levels while the game sits idle, never during play or on a low battery, and sends up each level it makes. With it off, the default, the device sends nothing and checks nothing; it plays levels from the bank first and makes its own only when the bank has none that fits. Either way it keeps up to 150 of its own levels, so it always has something to play offline. The scheduled cloud runner works for about 47 minutes every six hours: it checks the waiting list first, then spends the rest making levels, sharing its time Hard 50%, Medium 30% and Easy 20% among the difficulties with room, and making whatever kind each is shortest of, such as big boards. For a big fill, one command on a workstation makes a set number of new levels per difficulty, under a memory cap that decides how many workers run. It either posts each level as it’s made, or saves them to a folder to look over and upload later.
Duplicates and retired layouts are skipped and never counted; another level is made in their place. Every run ends with its numbers, levels per hour and seconds per level for each difficulty, so we can see where the time goes and tune it.
How a level reaches you
Most players get their levels from the bank. Your device keeps a small cache for each difficulty, up to 40 levels, and tops it up when it runs low. Anyone can send levels to the bank, so the device takes none on trust: before playing one, it replays the level’s stored winning line on its own engine and runs the gate’s quick checks, a moment’s work rather than a full search. A level that fails is skipped (and, if you help build levels, reported). With no connection, or nothing that fits, it plays one of its own or makes a new one.
How changes reach players
More than a thousand automated tests run on every change: the rules, the solver, the generator, the share links and the bank. Some pin the solver’s exact answers on all 100 campaign levels and every level in the built-in Endless banks, bit for bit, so a change meant only to make the solver faster can’t quietly change a single answer.
Before anything ships, the whole site runs as a staging copy in containers, and browser tests play the game on phone and desktop screen sizes, in both looks. Only then is a change reviewed and merged, and merging deploys it to production automatically.
Small decisions that added up
- Retracing is undo. If you step back to exactly where you were, with nothing else changed, those moves are taken back, so you’re not punished for exploring.
- Hidden walls are fair. A fake wall opens as you walk through it. An invisible wall shows a faint pane of glass while you stand beside it, and bumping it reveals it for a turn. Levels with hidden walls are tuned a little easier, because the player can’t see what the solver knows.
- Quiet by design. No pop-ups mid-move; the first time you meet a piece you get one card, after that just a brief banner. This game is about subtlety and a lack of distractions.
- Phones first. Most of my testing was on a phone. The move pad, the camera gestures and the layout were all reworked from real play on a small screen.
The result runs on phones, tablets, Windows, Mac and Linux, in the browser or installed like an app, online or off.
All ten chapters, Endless, Demo and the level editor are in the playable demo post, or play full screen.
Want something like this built for you, or a website, AI or machine learning work? Get in touch with Happy STL.




























Leave a Reply