ChainBloom Docs
Open ChainBloom

Create, Bloom, Echo, Meet and Close

How it worksLast reviewed 2026-07-316 min read

Five moves build every ChainBloom world: open it, add a moment, answer an earlier one, share a moment with someone, and end a path on purpose.

Five moves is the whole language. Learn them once and you can read any world someone else built, and design one people will want to answer. Nothing here needs code, and none of it is hard.

The vocabulary is deliberately small. A is not built from clever features; it is built from 5 plain moves repeated by different people in an order nobody can rearrange afterwards.

Each move below gets the same three answers: what it means to you, what it does to the world, and when to reach for it.

Create: opening the world#

To you it is writing an invitation. You choose a title of up to 32 ASCII bytes, how many the world has (1 to 8), how long it stays open (144 to 52,560 blocks, roughly 1 to 365 days), and how many steps each path may take (1 to 512). You also set a 16-byte seed, which is what makes a world look like itself when it is drawn.

To the world one transaction opens the space and hands out its starting , one per path, each holding exactly 1,000 satoshis. Those outputs are the paths. Whoever can spend one can move it forward.

Reach for it when you have a shape you want other people to fill: a season, a room, a piece of music, a question. Say the shape out loud in the title, because after this the shape cannot change.

Bloom: one moment on one path#

To you it is the ordinary act: you add your moment to a path you hold. Most of what happens in a world is blooms.

A carries four small numbers: 0-31, palette 0-15, motion 0-7, and magnitude 0-255. Four bytes, and that is the entire payload.

To the world it spends the path's live carrier and creates the next one, again exactly 1,000 satoshis. The path's step count goes up by one. The old carrier is gone, so nothing can be inserted before your moment later on.

Reach for it when your contribution stands on its own: a new plant in the bed, a new bar of the tune, a new day of the trip.

Echo: a moment that points back#

To you it is a reply. You add a moment and say which earlier moment it is answering.

An carries the earlier event's transaction id, plus a relation number 0-15, and its own glyph and palette. The relation is the kind of answer: agreement, contrast, continuation, whatever the world has agreed those numbers mean.

To the world it does everything a bloom does, and it also draws a line across the world back to the moment it names. That line is what turns a set of parallel threads into a conversation.

The target has to be real. It must exist, be on the same network, and be confirmed in a strictly earlier block. If it is not, validation returns UNKNOWN_GRAFT_TARGET, GRAFT_NETWORK_MISMATCH, or UNCONFIRMED_GRAFT_TARGET and the step is not an event.

Reach for it when your moment only makes sense next to someone else's. An echo is how you credit an influence without editing the thing you were influenced by.

Meet: two paths, one shared moment#

To you it is the moment you and another person do something together, on purpose, at a time you both chose.

A carries a bridge style 0-15 and an intensity 0-255, plus its own glyph and palette. The bridge style is the character of the meeting; the intensity is how much of it there is.

To the world one transaction spends both paths' live carriers and creates one successor for each. Both people sign. Both paths carry on. Neither path is merged into the other, and nothing moves from one person to the other.

Reach for it when two threads genuinely touch: two voices landing on one chord, two stages sharing a closing night, two students noticing they were making the same thing. The full mechanics, and why this is not a transfer, are in how two paths meet.

Close: an ending you chose#

To you it is finishing. You decide the path is done and you say so, with a reason number 0-255.

To the world the carrier is spent and no successor is created. The path's status becomes closed, with a terminal reason recorded, and the 1,000 satoshis stop being a path and go back into ordinary outputs of your transaction, minus the network fee.

Closing is allowed even when a path has used all of its steps. Once step count reaches the world's limit, any further Bloom, Echo or Meet is rejected with MAX_STEPS_REACHED. Close still works. It is the one move that is always available while a path is alive.

Reach for it when the work is finished rather than abandoned. An ending you chose reads completely differently from a path that simply stopped, and the difference is visible in the record forever.

The numbers are references, not pictures#

Nothing you write with these five moves is an image. There are 32 glyph values, 16 palette values, 8 motion values, 16 relation values and 16 bridge styles. A whole marker is at most 72 bytes. You could not fit a picture in there if you tried.

What goes on chain is a reference: glyph 12, palette 3, motion 5, magnitude 200, on this path, after this parent, in this block. What that looks like is a separate question, answered by whoever is drawing it.

The reference renderer in src/render.ts is explicit about this. projectBloom places each point from a sha256 of the world seed, the event id and the operation name, and colours it from 16 fixed colours. It is marked non-consensus in the source, and that is not a hedge. It is the design.

So two galleries can draw the same bloom completely differently and both be right. One might render glyph 12 as a stem, another as a chord voicing, a third as a footstep. None of them is the true picture, because there is no true picture. What everyone must agree on is which numbers, on which path, in which order. That part is settled by Bitcoin, not by a renderer.

The names in the code#

Friendly names are an application's choice. The bytes are not.

Opcode nameShown asWhat it doesPath inputsPath outputsPayload bytes
CREATE 0x01CreateOpens a world and its paths0lane count23 + title length
BLOOM 0x02BloomAdds one moment to a path114
GRAFT 0x03EchoAdds a moment that names an earlier event1135
RENDEZVOUS 0x04MeetTwo paths share a moment and both continue224
CLOSE 0x05CompleteEnds a path with no successor101

The names in that table (CREATE, BLOOM, GRAFT, RENDEZVOUS, CLOSE) are what a validator, an indexer or a decoder will show you. The friendly names on this page are what a person reading a world is more likely to see. One application may say Meet, another may say Rendezvous or Bridge; one may say Complete where this page says Close.

That is allowed, and it will happen. What may not change is the meaning: the same opcode, the same payload, the same rules, checked the same way by everyone. When a friendly name and a wire name disagree in something you are reading, trust the wire name and check protocol architecture.

Next

Meeting is the one worth understanding

Two paths share a moment and both carry on. Nothing is merged and nothing changes hands.

Read how two paths meet