Primordium started as a simple question: what would happen if I dropped a few kinds of little creatures into a world and just let them go? I have a simulator where predators hunt, prey scatter, creatures with tiny neural-network brains learn to behave in ways I never programmed, and species split into new named sub-species with their own family trees.
With some curiosity and a lot of back-and-forth with Claude, I had it built in less than a day.
I didn’t write the code. I described what I wanted, tested what came back, and described what was wrong. Here’s how that actually went.
The setup
Primordium is written in Python with pygame, which handles the window, drawing, and input. I built it with Claude Code, an AI coding tool that works directly in your project folder: it can read the files, write new ones, and run the program to check its own work. That last part matters a lot for a simulation, because a lot of bugs only show up after the thing has been running for a few minutes.
The project ended up split into about a dozen files, each with one job: the main loop, the cells, species definitions, the world, how creatures interact, genetics, brains, scent trails, and a species generator. I didn’t plan that structure myself. But asking for it early (“keep each system in its own file”) paid off every time I came back to add something, because the AI could find and change one piece without breaking everything else.
Building it one layer at a time
The biggest lesson: don’t ask for the whole thing at once. I wrote out a plan first, then added one layer per session and made sure it worked before moving on.
Species with personalities. Each species has slider-style traits like aggression, speed, and lifespan. Skitter is small and fast. Brute is the predator.
Genetics and evolution. Offspring inherit their parents’ traits with small random mutations, so over time the populations drift toward whatever survives.
Neural brains. The Mindling species doesn’t follow hand-written rules. It has a small neural network that decides what to do, and those networks evolve too. This is where the sim started surprising me.
Scent trails and custom instincts. Creatures leave scent that others can follow, and there’s a hook for writing a species’ behavior as custom code. Scout uses that hook.
Organs. Mutations can add physical structures: eyes, armor, fins, grasping claws, camouflage, and extra brain lobes. Each one changes what the creature can do.
Speciation. When a population drifts far enough, it splits into a new named sub-species (for example, “Skitter pinnata”). Pressing P opens a family-tree view showing how everything branched.
Getting everything up and running was relatively easy. When I noticed a bug, I wrote it down and reported it to Claude in the next prompt.
The part that still amazes me: an AI that watches the sim
My favorite feature is the Analyst. At the end of a run, the sim sends a summary of what happened to Claude through the Anthropic API, and Claude writes field notes interpreting the emergent behavior, as if a biologist had been watching. The notes get saved to a file, so I have a running journal of every run.
It turns a screen full of moving dots into a story. It’s also a great example of something vibecoders don’t think about enough: your project can call an AI too, not just be built by one.
A trick that saved me: headless test runs
Some features, like speciation, only show up after thousands of simulated generations. Watching for that in real time is miserable. So I had the AI add a headless mode: the sim runs without drawing anything, as fast as the computer can go, and reports what happened. That’s how I confirmed speciation actually worked instead of trusting the AI’s word for it.
If you take one thing from this post, take that: make the AI prove it works. Ask for a test, a log, or a fast-forward mode, and look at the result yourself.
Want to try something like this?
Start much smaller than you think. “Dots that wander around and eat food” is a complete first session. Then add reproduction, then mutation, then predators. Every layer is a small, testable request, and each one makes the world more interesting.




Leave a comment