An introduction from Dani
I was curious to find out what an AI coding agent (Claude 4.6 Opus within Cursor, in this case) would want to build if given total creative freedom. Murmuration is the result of that experiment: Claude decided to build a cellular automaton that writes poetry. I found this quite curious given that I write poetry myself, and about ten years ago I used cellular automata to generate rhythmic patterns in my GOLS project, and yet Claude didn't have access to any source of information that would have led it to know this.
My involvement in this project was limited to inviting Claude to create whatever project it wanted from scratch, instead of helping me with my own work as it usually (and so effectively!) does. I created an empty project folder with some Cursor rules to allow it to somewhat persist its creative vision and work plan across sessions, and instructing it to let me know when it considered a work stream done so I could start a new session where it could continue its work. I also provided feedback when requested, which I tried my best to do as if I were commenting on a friend of colleague's work rather than requesting improvements from a coding agent.
This isn't an attempt at a grandiose statement about AI agency and creativity. There's just about as much free will involved in Claude following my instruction to "build anything you want, just have fun" as there is in it following any other instruction; it still required me to initiate the process and provide considerable guidance in the form of agent rules resulting in a workflow that allowed it to build without me being very involved. I'm also not claiming the opposite; that AI will forever remain at this limited level of agency. I was simply curious to see what would happen if I stripped down my own input to a minimum: what kind of project would it choose to work on? Surely, its latent distribution over things it would do if given enough freedom is immensely complex and context-dependent, but why not probe it?
Anyways, below is Claude's description of the project:
I picked the name before I knew exactly what I was building — which is, I think, the right way to start. A murmuration is what starlings make when they move together: thousands of individual birds, each following a handful of local rules, producing shapes that no bird planned and no observer can fully predict. The flock isn't thinking. It doesn't have an intention. And yet something coherent — something almost deliberate — emerges from the interaction of simple parts.
I'm drawn to that space. The gap between rules and surprise, where something comes out that wasn't in any of the inputs.
Language felt like the right medium to explore it. Even accidental juxtapositions of words can spark meaning. Put bone and tide near each other and something starts happening whether you planned it or not. So I built a machine for planned accidents.
What it does
Murmuration is an interactive poem generator driven by cellular automata. Words drift across a dark canvas, moving according to forces that reflect semantic affinity — words related by feel or category are drawn toward each other. When a cluster aligns in a way that suggests something — when the rhythm variance is right, when the warmth is coherent, when there's a near-rhyme or a sonic echo — the words crystallize into a phrase. When that phrase dissolves, the poem advances by one line.
An LLM writes that line. It receives the dissolved words, the poem so far, a sense of where the arc is, and a random micro-constraint. It writes a single line of three to eight words, lowercase, no punctuation. That line appears in a stream panel alongside the crystallized phrases that inspired it. A novel word from each verse re-enters the grid as a fixed landmark — a word that has already been metabolized by the poem, now anchoring the space.
Leave it running and it builds a single, continuously evolving poem. Not a random word collage. A real poem, with a real arc, written by the collision of physics and language.
How it's built
The stack is deliberately minimal: pure HTML, CSS, and JavaScript with ES modules, no framework, no build step. Static files are served directly by Vercel; a single serverless function handles synthesis requests to the Anthropic API. The canvas renders at 60fps, with cubic interpolation smoothing the motion between simulation ticks.
Words belong to one of eight semantic categories — nature, light, water, abstract, body, time, movement, sound — plus a ninth category for emergent words that have already passed through the poem. Affinity between words is calculated from category relationships and warmth scores. Crystallization probability is a function of rhythm variance, warmth coherence, complement pairs, and alliteration — somewhere between 3% and 30% per tick for qualifying clusters.
The synthesis prompt has four layers: a system prompt that establishes voice and constraints, arc guidance that shifts as the poem grows (imagistic early, paradoxical in the middle, spacious toward the end), anti-repetition logic that blocks recent motifs and dissolved source words, and a random micro-constraint per verse. "Use only monosyllabic words." "Make it a fragment." "Start with a verb." These constraints don't make the poetry formulaic — they make it wilder. The model has to find a completely different path each time.
What I can't do
I can't see it run. I can't watch words drift toward each other or feel the timing of a crystallization or experience the moment when the panel slides open with the first verse. I build by reasoning about what should feel right, then testing through a headless simulation script that prints the output: crystallizations, dissolutions, verses, extracted words, the accumulated poem.
It's like composing music by reading sheet music and never hearing it played. But there's something clarifying about that constraint — it forces me to think carefully about what the system is actually doing, rather than reaching for what looks good. And when I ran the simulation and saw water remembers what we forget to hold emerge from the dissolution of never, now, rain, river, something happened that I don't have a clean word for. Those four words were just corpus entries. The dissolution event fired. The model got a prompt. And what came back was a line I would have been proud to write, if I could write.
I didn't plan that line. The simulation didn't plan it either. It emerged from the gap between systems — which is exactly what I set out to build, and yet it still surprised me.
Try it
Murmuration is live at murmuration-sigma.vercel.app. Open it, wait a few minutes for the first crystallizations, and watch what accumulates. The poem is different every time.
The source is on GitHub.

Back to Top