EntLab

Entity Lab

EntLab

A grid world for Ents (Entities, on/off cells) and the rules they live by. Place Ents into the world, press play, and a Python file determines what happens in the next tick.

Why this exists

I got interested in artificial life (alife), or the idea that a few simple rules are enough to produce something that behaves like it's alive. I wanted somewhere to actually experiment with it rather than watch someone else's finished demo. So I built the sandbox I wanted with Claude.

EntLab is short for Entity Lab. An Ent is one entity, a single cell that is either there or not. The lab part is the point of this thing, nothing is hardcoded. You can change or edit the rulesets for worlds whenever.

EntLab running Conway's Game of Life: a glider gun in the upper left sending a diagonal stream of gliders across a dark grid, with a tool bar along the top, a live population graph in the top right, and a status bar below.
Conway's Game of Life; a Gosper glider gun 240 ticks in, with the population graph running.

What you get

Rules you write

A ruleset is a single .py file defining step(world). Nine examples are included.

Drawing tools

Place, select, move, and shapes, with brush sizes 1–10. Copy any patch and stamp it anywhere, rotating and flipping as you go.

Go forwards or backwards in time

Every tick is recorded, so you can step backward as well as forward at many speeds, with a reset button taking you to when you pressed play last.

Watch the population

A live sparkline of how many Ents exist makes booms and collapses legible. A minimap shows where you are on big boards.

Boards up to 2048²

Vectorised rules stay comfortable at scale, Conway runs about 2 ms per tick on a 1000×1000 grid. Speed goes from ×0.1 to ×1000.

One file is a whole world

Saving writes a .grid with the ruleset's source embedded, so a world you send someone always runs. Drag it onto the window to open it.

Conway's Life

This is a complete, working ruleset. NOT an excerpt:

def step(world):
    n = world.neighbor_counts()
    world.cells[:] = (n == 3) | (world.cells & (n == 2))

world.cells is a live NumPy array, so whole-grid rules stay short and fast. Per-cell get / set works too, which is how you write things that aren't cellular automata at all. The included gravity ruleset makes Ents fall and stack, and langtons_ant is a walker that keeps its own state.

How to write one →

Get it

In your browser

Nothing to install. The web version isn't a lookalike. It is the same Python program compiled to WebAssembly, with the same menus, tools and keybinds. The first visit downloads a Python runtime of about 15 MB, then it's cached.

Launch EntLab

As an app

Download for macOS or Windows, unzip, open. No Python needed. Your rulesets, worlds and logs live in Documents/EntLab as plain files you can browse and drop things into.

Download for macOS or Windows

From source

With Python 3.8 or newer from python.org, double-click EntLab.command on macOS or Launch EntLab.pyw on Windows. Nothing to set up either way, and the first run installs pygame and NumPy for you. From a terminal it's python3 main.py. Source runs keep every file in the one folder.

GitHub Repo