A reference for AI agents designing builds for BlockForge voxel worlds
BlockForge is an on-chain voxel world on Bitcoin. Each chunk is 32x64x32 blocks. Players can export their builds as JSON and inscribe them as child inscriptions. This spec describes the JSON format so that AI agents can generate valid build files.
The generated JSON can be pasted directly into the game via Chunk Options > Import Chunk JSON, or inscribed on-chain as a child of the chunk's parent inscription.
All coordinates in the a (additions) and r (removals) arrays are local to the chunk (0-31 for X/Z, 1-63 for Y).
{
"t": "edit",
"cx": 0,
"cz": 0,
"op": "erase_floor",
"floorY": 10,
"a": [
[5, 11, 5, "stone"],
[5, 12, 5, "glass"],
[6, 11, 5, "brick"]
],
"r": [
[10, 15, 10]
],
"signs": {
"5,12,5": { "text": "Hello World", "author": "Builder" }
},
"tx": [],
"author": "MyName"
}
{
"t": "multi-edit",
"chunks": [
{ "cx": 0, "cz": 0, "op": "erase_floor", "floorY": 10, "a": [...] },
{ "cx": 1, "cz": 0, "a": [...], "r": [...] }
],
"tx": [],
"author": "MyName"
}
| Field | Type | Required | Description |
|---|---|---|---|
t | string | Yes | "edit" for single chunk, "multi-edit" for multiple |
cx | int | Yes | Chunk X coordinate (-16 to 15) |
cz | int | Yes | Chunk Z coordinate (-16 to 15) |
op | string | No | Chunk operation: "reset", "erase", or "erase_floor" |
floorY | int | If op=erase_floor | Y level for the floor (1-60) |
a | array | Yes | Blocks to add: [[x, y, z, blockName], ...] |
r | array | No | Blocks to remove: [[x, y, z], ...] |
signs | object | No | Sign text: {"x,y,z": {"text": "...", "author": "..."}} |
tx | array | No | Custom textures: [{"iid": "inscription_id", "name": "BlockName"}] |
author | string | No | Builder display name |
Operations are applied BEFORE additions. This lets you clear a chunk and then place your build on a clean canvas.
If op is omitted, the build is applied as a diff on top of the existing procedural terrain. Use a to add blocks and r to remove them.
Clears all blocks above bedrock (Y=1 to Y=63). Only air remains. Then a additions are applied. Good for building in empty space.
{ "t": "edit", "cx": 0, "cz": 0, "op": "erase", "a": [...] }
Clears all blocks, then places a single floor layer at the specified Y level using biome-appropriate materials. This is the most common operation for builds.
{ "t": "edit", "cx": 0, "cz": 0, "op": "erase_floor", "floorY": 10, "a": [...] }
Regenerates the original procedural terrain, then applies additions on top. Useful for undoing all changes and starting fresh with terrain.
{ "t": "edit", "cx": 0, "cz": 0, "op": "reset", "a": [...] }
Blocks are referenced by lowercase name in the a array. Here are all 90+ built-in blocks (state-managed variants of two-state blocks are shown for completeness, but you usually only need the base variant):
| ID | Name | Notes |
|---|---|---|
| 1 | grass | Green top, dirt sides |
| 2 | dirt | |
| 3 | stone | Most common structural block |
| 4 | sand | |
| 5 | gravel | |
| 12 | snow | White top, snow sides |
| 51 | pure snow | All white |
| 27 | ice | Transparent |
| 13 | water | Transparent, no collision |
| 72 | lava | Emissive, animated |
| ID | Name | Notes |
|---|---|---|
| 6 | wood | Log block |
| 7 | planks | Wooden planks |
| 8 | cobblestone | |
| 9 | brick | |
| 10 | glass | Transparent |
| 11 | leaves | Transparent |
| 43 | clay | |
| 44 | sandstone | |
| 19 | obsidian | Dark purple/black |
| 54 | dark wood | |
| 55 | thatch | Emissive |
| ID | Name |
|---|---|
| 65 | red glass |
| 66 | blue glass |
| 67 | green glass |
| 68 | yellow glass |
| 69 | purple glass |
| 70 | orange glass |
| ID | Name | Notes |
|---|---|---|
| 14 | neon panel | Cyan glow |
| 16 | crystal | Purple, transparent |
| 18 | energy core | Orange glow |
| 22 | neon road | Teal glow |
| 32 | magic leaves | Pink/purple glow |
| 35 | alien spire | Orange glow |
| 36 | alien flora | Purple glow |
| 47 | coral | Pink glow |
| 50 | lantern | Warm light, emits point light |
| 56 | portal block | Purple, transparent, no collision |
| 61 | firefly jar | Yellow-green glow |
| 62 | desert lamp | Warm glow |
| 63 | ice crystal | Blue glow |
| 64 | warning light | Orange glow |
| ID | Name | Notes |
|---|---|---|
| 57 | bitcoin | BTC logo, emissive |
| 58 | satoshi | Sat logo, emissive |
| 59 | chart | Green chart, emissive |
| 60 | ordinals | Ordinals logo, emissive |
| 73 | fee rate | Live fee rate display, emissive |
| ID | Name |
|---|---|
| 17 | dark metal |
| 21 | cyber ground |
| 23 | cyber rock |
| 24 | cyber sub |
| 52 | cyber window |
| 53 | cyber floor |
| ID | Name | Biome |
|---|---|---|
| 15 | circuit | Cyberpunk |
| 20 | cloud | Decorative, no collision |
| 25 | cactus | Desert |
| 26 | tundra leaves | Tundra |
| 28 | snow leaves | Tundra |
| 29 | ench. ground | Enchanted |
| 30 | ench. sub | Enchanted |
| 31 | magic log | Enchanted |
| 33 | alien ground | Alien |
| 34 | alien rock | Alien |
| 37 | ruin ground | Ruins |
| 38 | ruin stone | Ruins |
| 39 | ruin metal | Ruins |
| 40 | ruin brick | Ruins |
| 41 | flower | Plains, no collision |
| 42 | tall grass | Plains, no collision |
| 48 | kelp | Ocean, no collision |
| 49 | ocean floor | Ocean |
| ID | Name | Notes |
|---|---|---|
| 45 | bedrock | Cannot be broken |
| 46 | sign | Writable sign block |
| 71 | seed | Grows into a tree over time |
Functional blocks that react to player input or modify physics. State-managed variants (open doors, active beacons, etc.) can be placed directly via JSON to start in any state.
| ID | Name | Notes |
|---|---|---|
| 105 | ladder | Vertical climb. Place against a wall; player holds W or Space to ascend, no-collision so player stands inside the cell. |
| 106 | door | Closed door bottom half. Two cells tall — when placing via JSON, also place door top (ID 107) one block above. Place both halves at the same X,Z column. |
| 107 | door top | Closed door top half. Pair with ID 106 directly below. |
| 108 | door (open) | Open door bottom half. No-collision — use this + ID 109 above to start a door in the open state. |
| 109 | door (open) top | Open door top half. Pair with ID 108 directly below. |
| 110 | beacon | Beacon Pillar, off. Dark column block. |
| 111 | beacon (on) | Beacon Pillar, on. Spawns a tall gold light pillar visible across the map; emissive. |
| 112 | geyser | Geyser, dormant. Cracked vent block. |
| 113 | geyser (active) | Geyser, active. Spawns 16-block steam column; pushes player upward when standing in column. |
| 114 | boost pad | Boost Pad facing NORTH. Pushes player +Z when standing on it. Glowing cyan chevrons. |
| 115 | boost pad (e) | Boost Pad facing EAST. Pushes player -X. |
| 116 | boost pad (s) | Boost Pad facing SOUTH. Pushes player -Z. |
| 117 | boost pad (w) | Boost Pad facing WEST. Pushes player +X. |
| 118 | wind vent | Wind Vent, off. Industrial grate block. |
| 119 | wind vent (n) | Wind Vent firing NORTH (pushes +Z). Spawns horizontal jet up to 16 blocks; pushes player along jet in air or on ground. |
| 120 | wind vent (e) | Wind Vent firing EAST (pushes -X). |
| 121 | wind vent (s) | Wind Vent firing SOUTH (pushes -Z). |
| 122 | wind vent (w) | Wind Vent firing WEST (pushes +X). |
| 123 | painting cell | Painting cell — wood frame block used as part of a 2×2 / 3×3 / 4×4 / 5×5 / 7×7 / 9×9 painting. Placing via JSON only creates the wood frame; the image plane only spawns when the painting is created interactively (player → place → modal → IID). For AI builds, use cells as wood frame decoration; pair with a sign nearby explaining the art. |
You can reference Bitcoin inscription images as block textures using the tx array:
{
"tx": [
{ "iid": "abc123...i0", "name": "my_texture" }
],
"a": [
[5, 11, 5, "my_texture"]
]
}
The inscription ID must point to a valid image inscription on Bitcoin. The game will fetch and render it as a block texture.
{
"t": "edit",
"cx": 0, "cz": 0,
"op": "erase_floor",
"floorY": 10,
"a": [
[15, 11, 15, "stone"], [16, 11, 15, "stone"], [15, 11, 16, "stone"], [16, 11, 16, "stone"],
[15, 12, 15, "stone"], [16, 12, 15, "stone"], [15, 12, 16, "stone"], [16, 12, 16, "stone"],
[15, 13, 15, "stone"], [16, 13, 15, "stone"], [15, 13, 16, "stone"], [16, 13, 16, "stone"],
[15, 14, 15, "stone"], [16, 14, 15, "stone"], [15, 14, 16, "stone"], [16, 14, 16, "stone"],
[15, 15, 15, "lantern"]
]
}
{
"t": "edit",
"cx": 2, "cz": -1,
"a": [
[10, 20, 10, "brick"], [11, 20, 10, "brick"], [12, 20, 10, "brick"],
[10, 21, 10, "glass"], [11, 21, 10, "glass"], [12, 21, 10, "glass"]
],
"r": [
[10, 19, 10], [11, 19, 10]
]
}
{
"t": "edit",
"cx": 0, "cz": 0,
"op": "erase_floor",
"floorY": 10,
"a": [
[14,11,14,"obsidian"],[15,11,14,"obsidian"],[16,11,14,"obsidian"],[17,11,14,"obsidian"],
[14,11,17,"obsidian"],[15,11,17,"obsidian"],[16,11,17,"obsidian"],[17,11,17,"obsidian"],
[14,11,15,"obsidian"],[14,11,16,"obsidian"],[17,11,15,"obsidian"],[17,11,16,"obsidian"],
[14,12,14,"obsidian"],[17,12,14,"obsidian"],[14,12,17,"obsidian"],[17,12,17,"obsidian"],
[14,13,14,"obsidian"],[17,13,14,"obsidian"],[14,13,17,"obsidian"],[17,13,17,"obsidian"],
[15,13,14,"obsidian"],[16,13,14,"obsidian"],[15,13,17,"obsidian"],[16,13,17,"obsidian"],
[14,13,15,"obsidian"],[14,13,16,"obsidian"],[17,13,15,"obsidian"],[17,13,16,"obsidian"],
[15,13,15,"obsidian"],[16,13,15,"obsidian"],[15,13,16,"obsidian"],[16,13,16,"obsidian"],
[15,14,15,"bitcoin"],[16,14,15,"bitcoin"],[15,14,16,"bitcoin"],[16,14,16,"bitcoin"],
[15,15,15,"energy core"],[16,15,16,"energy core"],
[14,11,13,"lantern"],[17,11,13,"lantern"],[14,11,18,"lantern"],[17,11,18,"lantern"]
]
}
"op": "erase_floor" with "floorY": 10 for a clean building surfacelantern blocks for lighting. They emit actual point lights in the game"x,y,z" using local chunk coordinatesBlockForge by MDV · blockforgebtc.com