Several hundred characters live on a private MMORPG realm, each one played by a language model running on hardware I own. They are not scripted, and this is not a simulation of a game. It is the game, with the players replaced. The whole world runs on a handheld-class mini PC with no graphics card in it.
A real open-source MMO server core, 2004-era ruleset, with a real database, real zones, mobs, quests and an auction house. Every character on the map is an actual row in that database, with a level, a bag, gold, a profession and a position, read out of the server rather than invented for the page. It is a closed test bench. Nobody else plays here.
What is unusual is who is at the keyboard. Each character gets a personality generated once: a background, a temperament, a way of speaking, something they want. From then on it decides for itself where to level, what trade to learn, what to list on the auction house, who to talk to, who to hold a grudge against. Those decisions are made by a language model, and they persist. A character who was robbed remembers it a week later.
The world state on the front page is not a replay or a mock-up. It is whatever these characters have made of the place since the last restart.
The central design decision, and the only reason this is affordable: the model is not in the control loop. It never decides where to put a foot.
The realm and its bot engine handle the bodies. Pathfinding, combat rotations, looting, vendoring, party invites, all native C++ running at server tick rate.
A bridge module I wrote into the server core pushes what happens out as JSON lines over a socket, and takes goals and speech back in.
The brain is one Python asyncio process. It decides who needs to think and about what, and holds the personas, the memories, the relationship graph and the price beliefs.
A 4B model does the realm's working thinking: goals, trades, reflection, the plausibility checks. Eight requests in flight at once, which is what a few hundred characters thinking costs.
A 27B handles conversation, and any character somebody is actually looking through, where being in character matters more than being fast.
So a character's intent comes from the model ("go and level in Stonelake, I need the money for a mount") and a deterministic executor carries it out. That split is what makes hundreds of agents possible on one machine instead of needing a hundred inferences a second. Output is constrained to a JSON schema by the inference server itself, so a small model is reliable enough to drive a character. I never parse free text and hope.
Two machines, neither of them rented. The realm itself, meaning the game server, its MySQL database, the bridge and the brain, runs on a handheld-class mini PC: an eight-core Ryzen 7 5700U with 7.1 GB of RAM and no discrete graphics at all. There is no GPU in the machine running the world. All the inference happens on a second machine I own and administer, which serves the models over an HTTP API on the same domain as this page.
That split is recent, and it changed which part is the bottleneck. On the old single-box setup the game server was the ceiling and inference had room to spare. Now the model is the slow half. The 4B answers about a third of a call a second with eight requests queued against it, and the simulation sheds far more thinking than it completes. The realm is not struggling, since the server is using about one and a half of its sixteen cores, but a character waits longer to have an idea than it used to. It got cheaper to host and slower to think.
| What | Measured |
|---|---|
| Characters online | ~750 |
| Inference, all tiers | 0.71 calls/sec |
| 4B latency, 8 in flight | 23s |
| 27B latency | 4.1s |
| Tokens generated | 53/sec |
| Realm server, whole process | 1.4 of 16 cores |
| Busiest server thread | 47% |
| Realm server memory | 3.1 of 7.1 GB |
Measured over a settled five-minute window with 750 characters online, not a benchmark run. The binding constraint is now the inference queue rather than the server's single map-update thread, which is the reverse of how it was. The 7.1 GB is the real limit on the other side: the server alone holds 3.1 of it, and the number of characters is set by what is left.
It is not a chatbot with a map. The positions, levels, gold and inventories are read out of a live game server, not invented.
It is not an API bill. There is no frontier model behind these characters and no per-token cost. The models run on a machine I own, and the roughness in what they say is the honest output of a 4-billion-parameter model doing several hundred jobs at once.
It is not a game you win, and not a replacement for playing with people. It is a world that keeps going whether or not anyone is watching, that you can look in on, look through anyone's eyes, and talk to. You can tell a character to go and do something and they will, or say why they would rather not.
It is not finished. Characters still say things that do not fit where they are, still get stuck, and still occasionally walk somewhere that kills them. About one goal in sixteen is now caught and sent back before it reaches this page: a character planning to gather herbs without herbalism, to walk into an instance thirty levels above them, or to narrate themselves in the third person instead of thinking. What you read here is what survived that check, which is not the same as being right.