In Development October 2026

Terrarium

A sealed glass tank of moss, stone and soil where small soft-bodied creatures live. Every worm, blob and spider is built from a genome, and its body decides where it can go. The lamp keeps a real day. You don't play it: you watch, follow someone with a lantern, and notice.

love2dluaglslsimulationartificial-lifeproceduralambient

Clips

Midday, up close

Twenty-five seconds at midday, in real time. The worms crawl in bunches and drape over the edges they aren't stiff enough to bridge. The blobs jump only the arcs their size can make. The spiders walk on legs that step in two alternating groups. Each creature goes only where its own body can, because its map of the jar is built from that body.

The lantern

Click anyone and a small lantern follows them. Here the lamp has just gone out and the lantern stays with Rill, a worm, as Rill crawls along the log and down into the moss, which glows faintly in the dark. The lantern only watches. The jar never knows it is there.

Screenshots

About

Terrarium is a sealed tank of moss, stone and soil, and the small soft creatures that live in it: two worms, two blobs and two spiders. They wander, graze on the moss, rest through the night and wake again in the morning. Each one is built from a genome, and the plan is that their children will inherit a blend of their parents with a little drift, so that over a few weeks the tank holds a family nobody designed.

It’s a quiet game about watching something become itself. The tank is long and low, the residents are small, and sometimes you have to look for them, the way you would in a real one. Nothing performs for you. You notice.

The film above is a whole day in a minute. The creatures move at their real speed, so it is one minute of their lives under a sped-up sky. Condensation fogs the glass before dawn and clears by midday, the lamp comes on, the light warms toward evening, and after the lamp goes off the tank turns blue in the moonlight. The cover is the tank at the moment it opens, lit at six hours from dawn to night, left to right.

The Body Never Lies

Terrarium brings two earlier projects together. Character gave it its creatures: a worm made of verlet points, a blob held in shape by pressure, and a spider with legs solved by FABRIK. Each one finds its way around by what its body can actually do. A navigation graph is built from the body itself, with every jump checked against a real ballistic arc, so a creature is only ever offered paths it can travel. Fishbowl gave it the tank: the glass, the depth of field, the day cycle, the plants and the drifting motes.

Genes Make Bodies

A genome is a line of text, such as worm segments=24 stiffness=0.9, and every gene has to change something you can see within a minute:

  • Worms: how many segments they have, which sets their length and how many bunches their crawl moves in, and how stiff they are. A stiff worm bridges a gap and a loose one drapes over the edge.
  • Blobs: their size, which sets their body and the jumps they can make, and their pressure, which sets how firmly they hold their shape and how softly they land.
  • Spiders: four, six or eight legs, stepping in two alternating groups, and how far those legs reach, which sets the gaps they can step across.

Because the navigation graph comes from the body, changing a gene changes where a creature can go. A big blob can’t fit where a small one can. A long-legged spider crosses gaps a short one has to go around. Inheritance is written: children take a crossover of their parents’ genes, and a mutation that folds back from the edges of each range, with one gene in twenty taking a big step. There is no fitness score. The moss grows where the lamp falls, and the bodies that can reach it are the ones that will live long enough to court.

A Jar Is Its Seed

Everything alive advances on a fixed 120 Hz step, and every random choice comes from the tank’s one seeded generator. A tank is its seed plus its history, so a whole day can be replayed exactly. CI steps the same tank in two separate processes and fails if their state hashes differ. It also checks a tank with no window against one with a window, because drawing must never change what happens.

Next

Bodies come next. When a lineup of random creatures looks like one family, varied but related, the genes are done. Then the cycle of life: hunger, courtship, eggs, old age, and a gentle death that returns each creature to the moss. Ten seeds must each survive thirty days on their own with all three kinds alive. Version 0.1.0 adds names, a family book, saving, and catching up on what happened while you were away.

How These Were Made

Everything on this page was rendered by the game. A small capture mode steps the simulation exactly 1/30 s for every frame it draws and writes the frames straight out, so the footage plays smoothly however long each frame took. It also gives every canvas more pixels than the window: 1.5 times for the full tank, and 2.25 times for the close clips, which frame a part of the virtual screen at 1920×1080 rather than enlarging a smaller picture. Because the simulation is deterministic, each clip is just a seed, an hour, a day length and who the lantern follows. The only edits are a crop to 16:9 and the blend of six hours in the cover.

Technical Details

  • Engine: LÖVE 11.5 (Lua), with GLSL shaders
  • Bodies: verlet worms, pressure-blob blobs and FABRIK spiders from Character, each built from its genome
  • Navigation: a graph built from each body, A*, and a ballistics model that gives the lowest jump arc that clears the level
  • Rendering: a shallow 3D tank projected toward a vanishing point, rgba16f canvases, depth-of-field blur on the room and the far scape, condensation drawn from the hour, and a composite pass for the glass, vignette and grain
  • Determinism: a fixed 120 Hz step, three seeded random streams (the simulation, the look, and the tank’s composition), and a state hash for replay checks
  • Tests: a self-test of the nav graphs, about 116 trips and a full day, run headless on Linux and Windows in CI
  • Libraries: LoveLibs as a git subtree