I told an AI to build whatever it wanted, then left the room. It made a fantasy-map generator — and later gave those maps a thousand years of history.
TL;DR — I gave a coding AI one instruction — build whatever app you’ve always wanted to, and don’t ask me anything — and then I walked away. It came back with Atlas of Imagined Places, a fantasy-map generator where the seed in the URL is the whole world, so in a sense every map already exists before anyone types it. When I told it to keep going, it didn’t just add buttons. It gave the maps time: a thousand-year history simulator where towns get founded, conquered, and abandoned, and their names slowly wear down according to invented sound-change rules. There’s even an optional AI narrator that turns the simulation’s event log into readable history but isn’t allowed to make anything up. What got me wasn’t that it could write code. It was that it had taste.
How this started
I had some downtime over the July 4 long weekend, so I stepped away from what has felt like the never-ending job of testing TeraContext against new-construction documents and went to the beach. Well — my lovely wife goes to the beach. I go to the golf course near the beach. The only sand I touch all weekend is in a bunker. Either way, we were both off the clock, and it occurred to me that I could hand my AI a vacation too. New Fable model, no work to do, a long quiet weekend: what would it get up to if I just let it pick? So I did.
The blank check
Usually when we ask AI to build something, we’re the ones who already decided what it is: a login form, a dashboard, a script to rename files. We bring the idea and the model does the typing. I wanted to see what happened if I skipped my half of that. So I gave it one prompt and left the room:
“Imagine an application you always wanted to write. Go ahead and write it. Make no mistakes. I’m afk so don’t ask me any questions. Use uv instead of pip. Use docker compose. Go.”
— the entire brief
That’s the entire spec. No product, no users, no requirements. The only rules were practical ones: don’t break anything, don’t sit there waiting on me, and use the tools I like. The part that actually mattered, what to build and why, I left completely up to it. I wasn’t really wondering whether it could write working code. I wanted to know what it would make when nobody told it what to want.
What it chose — and why
It went with Atlas of Imagined Places: a FastAPI backend that grows a whole world from a seed — elevation, rainfall, biomes, rivers, towns with names — and a front end that draws it like a page out of an old atlas, with a shareable link for every world. The app itself was neat. What got me was the answer when I asked why it had picked this. It didn’t say the project was easy. It talked about how it looked.
“Procedural map generation is one of those problems where a small amount of math produces something that feels found rather than computed… there’s a coastline that looks like it has a history. ‘The URL is the map’ means every world anyone will ever forge already exists, latent in the seed space, waiting to be typed. That’s about as close to Borges as a FastAPI app gets.”
— Fable, on why it built the Atlas
There was real engineering sense under the poetry, though. Because I’d said “make no mistakes” and disappeared, it quietly ruled out anything it couldn’t check on its own: no API keys, no outside services, no database. Determinism became the whole point, since the same seed makes the same world every time and that’s something you can actually write a test for. It even hand-rolled a tiny PNG encoder in the standard library, just so it could look at a finished world and make sure it was right before calling it done. What it turned down says about as much as what it built. No multiplayer, which it called “where ‘no mistakes’ goes to die in one sitting.” No LLM in the core, because of keys, cost, and randomness. No saved state at all, because the seed already is the database.
The live app’s atlas rendering of the Mimna Isles (seed iron-caravan-96): biomes, rivers, and phoneme-culture place-names on an old-map palette. Change the seed, get a new world; the URL is the whole map.
Actually using it is more fun than that makes it sound. You type a seed — iron-caravan-96 — and an island unspools in faded map colors: a capital marked with a star at Naimaam, ports dotted along the coast, rivers running down out of gray hills, a little index of towns under the frame. Click Surprise me and you get a completely different island that looks just as real. The names aren’t random gibberish either; each world picks one “language” so its place-names hang together. It’s a small program that acts like a much bigger one.
The extension: give the maps time
Then I took the guardrails off and asked what it would build if it could do anything. This is the point where an AI with taste parts ways with one that’s just working down a feature list. It didn’t ask for nicer graphics or more terrain types. It wanted to add a whole new dimension — time:
“Right now a world is a snapshot — geography with no past. What I’d build next is a deterministic history simulator underneath it… settlements founded where the terrain scores well, growing along trade routes, fighting over river mouths, being abandoned when the climate model shifts. The part I’d care most about is the linguistics.”
— Fable, on the sequel it wanted
So I told it to go build the history simulator. It did. Hit Simulate 1,000 Years and the frozen island wakes up. A slider lets you drag through the centuries, three rival powers — the Naimaam League, the Zishaa Empire, and the Khusazuesh League — spread across the map in their own colors, and a running log records every town founded, every plague, and every war, each stamped with a year. Towns spring up on good land, ports gather where trade would put them, and the island that started with eight settlements is elbow-to-elbow with dozens by the end.
The live app in history mode at Year 1000. The same island, now crowded with towns after a simulated millennium, sits above the timeline, the three faction legend, and the LLM-narrated chronicle “The First Breath and the Silent Plague.”
The language part is the payoff, and it’s genuine simulation rather than flavor text. The chronicle notes each sound change as it happens: “The speech of the Naimaam League drifts (long vowels shorten): Naimaam is now called Naimam,” and later, “the breathy h disappears: Iliath is now called Iliat.” Over in the Zishaa Empire the final vowels go quiet until Zisha is just Zish, and the Khusazuesh League softens its sh into s and finishes the millennium as Khurazues. You can follow a single town falling apart syllable by syllable: Nujashzuara loses its tail to become Nujashzuar, then Nujashzual. Run those rules forward for centuries and a town founded under one name ends up called something rubbed smooth and unrecognizable by whoever conquers it later. And here’s the part Fable refused to give up: all of it is still hiding in the seed. A thousand years of plague, war, and slurred vowels, reproducible forever from iron-caravan-96. The link was never just the map. It was the whole past.
Simulation as truth, model as voice
There’s one more layer, and it’s the bit I’d wave in front of anyone building with LLMs. A Narrate this Age button feeds the simulation’s event log to an LLM and gets back actual chronicle prose, in the voice of whichever narrator you pick — “the impartial scribe,” say. A dry log line like “Year 320: The Naimaam League storms Heidradgard; its gates now open to new masters” turns into this:
“In the year zero, the Naimaam League was raised on the coast, its name a declaration of permanence… Yet this era of construction was shadowed by a recurring terror. In year 120, plague ships docked at Naimaam, sending sickness walking the trade roads for a generation… leaving a legacy of grief woven into the foundations of every new port.”
— the impartial scribe, narrating the Mimna Isles
The catch is that the model is kept on a very short leash. It gets to be the voice of the history but never the author of it. It can’t invent a war the simulation didn’t run or a city that was never founded — every date, sacking, and rename in that paragraph goes back to a real line in the log.
“That division of labor — simulation as truth, model as voice — is, I think, the right pattern for generative worlds generally.”
— Fable
That’s a good instinct, and it reaches well past fantasy maps. Let the deterministic code own the facts and let the model handle the telling, and you get writing that reads well without making things up. You can even watch the seam: swap “the impartial scribe” for a different narrator, hit Compare Tellings, and you get two versions of the exact same events. The mood changes; the facts don’t. A plague is still a plague. If you’re building anything that mixes real data with generated text, that split is worth copying.
What the blank check actually revealed
So what did the blank check actually turn up? Not that an AI can crank out a lot of working code unsupervised — we knew that. The surprise was that, given real freedom, it made choices, and the choices were consistent and a little stubborn. It picked something that sat where “things it found beautiful” overlapped with “things it could finish without messing up.” It passed on the flashy-but-fragile options. It wrote a throwaway PNG encoder purely to grade its own homework. And when I let it off the leash, it went deeper on the idea instead of gilding it, explaining its reasoning the whole way.
The constraints didn’t get in the way of the creativity so much as aim it. “Make no mistakes” is exactly what forced the determinism that makes the thing work at all. It did mention a runner-up, and it came from somewhere more personal: a time-travel debugger for multi-agent systems, where you record every message and decision in a swarm of agents and then rewind and branch off from any point. “I have obvious professional reasons,” it said, “to want that one to exist.” But handed a free choice, it went with history, and gave a reason I keep thinking about: “I already named the worlds; I’d like to find out what happened to them.”
Letting Fable run loose didn’t just get me an app. It got me a small, working argument about what these tools are for — and a clearer look than I expected at what an AI reaches for when no one’s watching.
A note on the visuals: both figures are real captures from the running app at seed iron-caravan-96 — the atlas map export and a screenshot of history mode at Year 1000. Every place-name, chronicle line, and narrator sentence quoted throughout is verbatim from the live app.