The family runs a modded Minecraft server, and picking a world seed for it used to mean actually generating the world and rendering a map to look at it, which took about nine minutes per seed. Nine minutes does not sound like much until you want to look at a dozen seeds and compare them, and at that point nobody did it, because who is going to sit through an hour and a half of world generation just to browse. So we picked whatever seed looked fine on the first try and lived with it.
I wanted to be able to type a seed and see the terrain right away, the same way the vanilla seed map sites let you do for unmodded worlds. Ours is modded though, so those sites are useless to us, they have no idea what our biome tables look like.
What it does now
We built a small web app on the home server. Type a seed and it gives you an instant hillshaded biome map of the real modded world generation, with no waiting and nothing to generate. You can also hand it a batch of seeds and it will scan through them and hand back a ranked list, so instead of picking one seed and hoping, I can look at thirty or so side by side and pick the one with the terrain I actually want.
The reason this works at all is that the modpack does not touch the vanilla terrain noise, it only changes where the biomes get placed on top of that noise. So a vendored vanilla seed library supplies the climate and the height, the same way it would for an unmodded world, and a small C program we wrote ourselves supplies the modded biome placement layer on top of it. Two pieces bolted together, and they predict what the real server would generate without ever running the real server.
We checked this against worlds we regenerated for real, and it landed at about 99.7 percent agreement. The precomputed region data the app leans on to do this quickly is sitting on disk at about 7 terabytes, which is a lot of disk for a map viewer.
What actually went wrong along the way
The order the mod loader registers its biome regions in turns out to be a race that happens fresh every time the server boots, it is not fixed anywhere. So the oracle is pinned to whatever order the live server happened to draw this time, and a second instance of the same modpack, booted separately, can draw a different order and produce worlds that do not match ours for the same seed. That is the kind of thing you only find by comparing two supposedly identical worlds and wondering why they look nothing alike.
Related to that, the modpack registers seven biome regions total, and if you only look at the mod jar files themselves you would guess three. The server log was the only place that told us the real number, which meant reading logs instead of trusting the files that seemed like they should already answer the question.
Climate has to be sampled at the actual surface height of each column in the world, not at height zero. Sampling at zero corrupts the placement logic that depends on depth, and it would have shipped that way if it had not gotten caught during a review of the plan before any of it was built.
The last one cost a full night. Seeds have to be handled as text, not as numbers, in the part of the app that runs in the browser, because JavaScript rounds large integers once they get past about nine quadrillion, and a lot of Minecraft seeds are bigger than that. When we had it as a number, the browser would silently ask for a different seed than the one typed in and show a map that looked completely plausible, just for the wrong seed. It took a while to even notice the maps were wrong, because there was nothing about them that looked broken.
What it is not
It does not predict villages. That part was never built, and the app says so. It narrows a huge pile of seeds down to a short list based on terrain, and then you generate that short list for real and go looking for villages the normal way.
The whole thing came together in one night, with Claude orchestrating several agents against a plan we wrote and reviewed first. I still have not decided on a seed for the next world, but at least now I can look at more than one before I do.