Back to Posts

Bunnyland: Graph Theory Applied to Bunny Hunger

Rating SFW

## Outside the Model Corridor

Most of my public work has lived in the image-generation world: models, characters, training, style, and the strange craft of teaching machines how to dream in a particular direction.

Bunnyland comes from the same obsession, but it points somewhere else.

Bunnyland is an open-source social simulation sandbox where human players and AI agents can share one persistent ECS world.

The world is not a flat chat transcript. It is a graph. Characters, rooms, items, memories, relationships, controllers, events, quests, crops, workstations, ships, hazards, and incidents all exist as entities, components, edges, and typed events. Systems advance on ticks. Commands are queued. The server validates actions before they mutate the world.

That matters because it changes what an AI agent is allowed to be.

In a normal roleplay chat, the model can often write around the rules. In Bunnyland, a character has to act through the same verbs a human player uses: move, look, take, eat, say, tell, remember, craft, fight, wait, and whatever else the loaded plugins expose. If the world does not permit the action, the command fails. The agent can play. It cannot simply declare itself victorious. It cannot narrate its way out of being hungry.

And the world does not have to be bunnies. “Bunnyland” is a joke name that stuck and became the logo. The AI dungeon master can generate any kind of world from a prompt — space stations, cyberpunk cities, medieval towns, wasteland settlements, prehistoric islands, or something that does not have a genre label yet. The characters can be whatever the world calls for. The bunnies are the mascot, not the constraint.

## The Constraint Is the Point

An AI agent in Bunnyland can decide to do something. It can plan, speak, remember, and react. But it cannot just declare itself fed. It has to find food, pick it up, and eat it — through the same verbs a human player would use. And if it doesn’t, it gets hungry. And if it gets hungry, it gets cranky. And if it gets cranky, it might start a fight. And if someone goes down, the colony might spiral.

That is graph theory, but it is also just watching characters try to survive.

The architecture underneath is serious: a single world actor that prevents race conditions, typed events that describe what changed, volatile command queues, controller generation checks, and Action and Focus points that regenerate over real time for every character regardless of who or what is controlling them. LLMs propose; systems decide. The ECS, command handlers, validators, and policy gates determine what actually changes in the world.

## Multiple Doors Into the Same World

Bunnyland is designed so different kinds of players can meet in the same simulation:

  • Browser toon client with 2D sprite graphics and visual world presentation.
  • Web TUI — the terminal layout in your browser, with action menus and clickable targets.
  • Web REPL — a typed command line in your browser with clickable names, command history, and live suggestions.
  • Terminal TUI with ASCII art, mouse-driven menus, and room activity.
  • Terminal line REPL with tab completion and modern command-line touches.
  • Discord play through text commands, keeping a classic typed-command feeling.
  • MCP agent play, where a local AI or coding agent can claim a character, read the character prompt, observe events, and submit normal game commands.

Those clients are not separate games. They are projections of the same ECS state. A browser player, a Discord player, and an MCP-connected AI agent can all be looking at the same room through different windows — and they can all affect it.

## Builder and Admin Tools

Bunnyland world generator icon
Generate a world from a prompt. Inspect the graph. Poke at it.

The sandbox includes browser-based tools for operators and world-builders:

  • World Generator: replace or reset the live world from a generator, seed, or prompt.
  • World Inspector: browse the world as a graph — a loaded snapshot or a live connection.
  • World Editor: edit entities, components, edges, and saves; pause and resume the simulation; apply LLM patches.
  • Script Editor: author and validate trigger/action scripts against a snapshot.
  • Behavior Editor: build behavior-tree JSON for behavioral controllers and register it on a live server.

You do not need to write code to shape a world. You can generate one from a prompt, inspect the resulting graph, tune entities, author scripted events, and wire up behavioral controllers — all from a browser. The graph is not hidden behind an API. It is right there, and you can poke at it.

## Plugin-Shaped Simulation

The project is built around small simulation packages that add focused systems without turning the core into a monolith. Each system owns its domain: hunger owns hunger, combat owns damage, gardens own crops, and events carry the consequences across package boundaries. Systems may read broadly, but they write narrowly. That is where emergence comes from — not from one giant system that knows everything, but from small systems that react to each other’s events.

Current implemented packages:

  • life-sim: needs, moods, affect, social bonds, romance boundaries, pregnancy, family, skills, homes, careers, bills, and money. The daily-life layer. Characters have wants, routines, and relationships that drift over time.
  • colony-sim: work priorities, jobs, stockpiles, hauling, research, health, medicine, surgery, incidents, trade, caravans, diplomacy, and mental breaks. When the pressure builds, people snap.
  • garden-sim: seasons, weather, crops, watering, fertilizer, animals, breeding, fishing, mining, foraging, gifts, festivals, bundles, shipping, and museum collections. The cozy productive loop.
  • barbarian-sim: temperature exposure, stamina, combat, weapons, armor, followers, dungeons, raids, survival pressure, corruption, and rituals. The harsh survival layer.
  • dagger-sim: procedural towns, rumors, guilds, banks, loans, law, courts, travel, generated quests, dungeons, custom builds, and supernatural curses. The world expands through stories.
  • dino-sim: fossil survey, excavation, species identification, cloning, eggs, incubation, hatching, imprinting, taming, training, enclosures, escapes, and kaiju incidents. Creatures that can be livestock, companions, or emergencies depending on the day.
  • dragon-sim: quests, factions, discovery, stealth, magic, perks, crime, bounty, ancient beasts, voice powers, and radiant quests. The fantasy adventure layer.
Bunnyland neon-sim package logo — cyberpunk districts, surveillance, hacking, implants
neon-sim: every implant has a tradeoff.
  • neon-sim: cyberpunk districts, surveillance, hacking, credentials, black markets, fixer contracts, heat, wanted levels, and cybernetic implants with maintenance and side effects. Every implant has a tradeoff: money, maintenance, heat, health, identity exposure, legality, power use, or vulnerability to hacking.
  • nuke-sim: radiation exposure, sickness, mutation pressure, decontamination, scavenging, scrapping, jury-rigged crafting, and settlement salvage. The wasteland layer.
  • toon-sim: 2D graphics, sprites, animation-ready assets, and visual client rendering. The visual presentation layer.
  • void-sim: ships, stations, habitat modules, life support, pressure, airlocks, power, repair, docking, jumps, alien contact, and contracts. The space survival layer.

A twelfth package — fortress-sim — is planned: world history, deep materials, artifacts, workshops, nobles, justice, institutions, and social collapse spirals.

Beyond the built-in packages, user modules and server modules let operators add their own verbs, components, prompt parts, scripted events, generators, policy tags, integrations, and house rules. The plugin system is the extension surface: plugins contribute ECS mechanics, commands, runtime services, content, and policy in a structured bundle. If you can describe a system, you can probably add it.

The point is not to build one game. The point is to build a system where genres can collide because they share a common world model. A neon-sim hacker could steal a void-sim ship. A dino-sim kaiju could attack a garden-sim festival. A nuke-sim scavenger could wander into a dragon-sim dungeon. The packages are focused, but the world is shared, and the collisions are where the interesting behavior lives.

Bunnyland killer bunny character logo
A character. Not the constraint.

## Policy, Boundaries, and Safety

Bunnyland social boundaries icon
The same typed systems that track hunger also track consent.

Bunnyland puts social and safety rules in typed systems, not hand-waved prose.

Boundary tags — flirting, romance, adult content, pregnancy, PvP, lethal PvP, theft, pickpocketing — are explicit. Characters can opt in or opt out. World and plugin policy defines what is available at all. The rules are simple and strict:

  • Denied boundaries always win.
  • Admins cannot override character boundaries.
  • Suspended characters cannot die or be targeted by PvP.
  • Pregnancy cannot begin while suspended.
  • Major life transitions — partnerships, family storylines, births — require validated commands and events, not freeform narration.

This is the part where the silly sandbox and the serious research testbed meet: the same typed-systems approach that makes hunger a real constraint also makes consent, safety, and boundaries a real constraint. The math does not care whether it is tracking calories or tracking boundaries. It just enforces what the graph says.

## Observability

For operators, the server exports OpenTelemetry traces: game ticks, command dispatch, handler execution, and LLM decisions. World metrics — entity counts, tick cadence, token usage — flow to any OTLP backend. You can watch the simulation think. You can see which handler took too long, which agent spent its action points foolishly, and which tick spawned the incident that made the colony spiral.

## Why This Belongs Near AI Art

Bunnyland memory and learning character logo
What does the character remember?

Image generation taught us that a prompt can summon a moment.

Bunnyland is about what happens after the moment exists.

What does the character remember? Where are they standing? Who heard what they said? Are they hungry? Did they drop the key? Did another player take it? Did the weather change? Did an incident start? Did the agent spend its action points on something useful or foolish?

That is the interesting edge for me: not just generating images or text, but building a place where generated characters have to live with consequences. A world where an agent’s decision to eat instead of talk might be the thing that saves a relationship, or destroys it, because the person it was talking to walked away while it was busy with a berry.

## Current Status

Bunnyland is in an early limited preview with friends and supporters. It should be treated as a playable open-source prototype and simulation sandbox, not as a finished commercial game.

If you want to inspect it:

The model work is not going away. Bunnyland is another branch of the same tree: systems for making generated characters feel less like disposable outputs and more like inhabitants of a world that remembers them.