BLOCKFORGE BUILD SPEC

A reference for AI agents designing builds for BlockForge voxel worlds

OVERVIEW

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.

COORDINATE SYSTEM

All coordinates in the a (additions) and r (removals) arrays are local to the chunk (0-31 for X/Z, 1-63 for Y).

Y=0 is bedrock and cannot be overwritten. Start placing blocks at Y=1 or higher.

JSON FORMAT

Single Chunk Edit

{
  "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"
}

Multi-Chunk Edit (Mega Chunks)

{
  "t": "multi-edit",
  "chunks": [
    { "cx": 0, "cz": 0, "op": "erase_floor", "floorY": 10, "a": [...] },
    { "cx": 1, "cz": 0, "a": [...], "r": [...] }
  ],
  "tx": [],
  "author": "MyName"
}

FIELD REFERENCE

FieldTypeRequiredDescription
tstringYes"edit" for single chunk, "multi-edit" for multiple
cxintYesChunk X coordinate (-16 to 15)
czintYesChunk Z coordinate (-16 to 15)
opstringNoChunk operation: "reset", "erase", or "erase_floor"
floorYintIf op=erase_floorY level for the floor (1-60)
aarrayYesBlocks to add: [[x, y, z, blockName], ...]
rarrayNoBlocks to remove: [[x, y, z], ...]
signsobjectNoSign text: {"x,y,z": {"text": "...", "author": "..."}}
txarrayNoCustom textures: [{"iid": "inscription_id", "name": "BlockName"}]
gcasesarrayNoGLB Display Case models: [{"x","y","z","iid","size","spin"}]. See Decorations.
paintingsarrayNoPainting images mounted on painting cells: [{"x","y","z","iid","size","facing"}]. See Decorations.
authorstringNoBuilder display name

CHUNK OPERATIONS

Operations are applied BEFORE additions. This lets you clear a chunk and then place your build on a clean canvas.

No operation (diff mode)

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.

erase

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": [...] }

erase_floor

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": [...] }

reset

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": [...] }

BLOCK TYPES

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):

Terrain & Natural

IDNameNotes
1grassGreen top, dirt sides
2dirt
3stoneMost common structural block
4sand
5gravel
12snowWhite top, snow sides
51pure snowAll white
27iceTransparent
13waterTransparent, no collision
72lavaEmissive, animated

Building Materials

IDNameNotes
6woodLog block
7planksWooden planks
8cobblestone
9brick
10glassTransparent
11leavesTransparent
43clay
44sandstone
19obsidianDark purple/black
54dark wood
55thatchEmissive

Stained Glass

IDName
65red glass
66blue glass
67green glass
68yellow glass
69purple glass
70orange glass

Emissive / Glowing

IDNameNotes
14neon panelCyan glow
16crystalPurple, transparent
18energy coreOrange glow
22neon roadTeal glow
32magic leavesPink/purple glow
35alien spireOrange glow
36alien floraPurple glow
47coralPink glow
50lanternWarm light, emits point light
56portal blockPurple, transparent, no collision
61firefly jarYellow-green glow
62desert lampWarm glow
63ice crystalBlue glow
64warning lightOrange glow

Bitcoin-Themed

IDNameNotes
57bitcoinBTC logo, emissive
58satoshiSat logo, emissive
59chartGreen chart, emissive
60ordinalsOrdinals logo, emissive
73fee rateLive fee rate display, emissive

Cyberpunk Biome

IDName
17dark metal
21cyber ground
23cyber rock
24cyber sub
52cyber window
53cyber floor

Other Biome Blocks

IDNameBiome
15circuitCyberpunk
20cloudDecorative, no collision
25cactusDesert
26tundra leavesTundra
28snow leavesTundra
29ench. groundEnchanted
30ench. subEnchanted
31magic logEnchanted
33alien groundAlien
34alien rockAlien
37ruin groundRuins
38ruin stoneRuins
39ruin metalRuins
40ruin brickRuins
41flowerPlains, no collision
42tall grassPlains, no collision
48kelpOcean, no collision
49ocean floorOcean

Special

IDNameNotes
45bedrockCannot be broken
46signWritable sign block
71seedGrows into a tree over time

Interactive (v1.9)

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.

IDNameNotes
105ladderVertical climb. Place against a wall; player holds W or Space to ascend, no-collision so player stands inside the cell.
106doorClosed 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.
107door topClosed door top half. Pair with ID 106 directly below.
108door (open)Open door bottom half. No-collision — use this + ID 109 above to start a door in the open state.
109door (open) topOpen door top half. Pair with ID 108 directly below.
110beaconBeacon Pillar, off. Dark column block.
111beacon (on)Beacon Pillar, on. Spawns a tall gold light pillar visible across the map; emissive.
112geyserGeyser, dormant. Cracked vent block.
113geyser (active)Geyser, active. Spawns 16-block steam column; pushes player upward when standing in column.
114boost padBoost Pad facing NORTH. Pushes player +Z when standing on it. Glowing cyan chevrons.
115boost pad (e)Boost Pad facing EAST. Pushes player -X.
116boost pad (s)Boost Pad facing SOUTH. Pushes player -Z.
117boost pad (w)Boost Pad facing WEST. Pushes player +X.
118wind ventWind Vent, off. Industrial grate block.
119wind vent (n)Wind Vent firing NORTH (pushes +Z). Spawns horizontal jet up to 16 blocks; pushes player along jet in air or on ground.
120wind vent (e)Wind Vent firing EAST (pushes -X).
121wind vent (s)Wind Vent firing SOUTH (pushes -Z).
122wind vent (w)Wind Vent firing WEST (pushes +X).
123painting cellPainting cell — wood frame block used as part of a 2×2 / 3×3 / 4×4 / 5×5 painting. Place the frame cells in a across the area, then add a matching entry to the top-level paintings array to mount the image across them (see Decorations). Cells without a paintings entry stay empty wood frames.
125glb caseGLB Display Case (emissive holographic frame). Renders a GLB/glTF 3D model inside a bounded case. The block alone is just the case; the model comes from a matching top-level gcases entry (see Decorations).
126frost fernPale icy fern. Transparent cross-shape plant, no collision; sways in the wind. Tundra decor.
127giant clamRidged ocean-floor shell with a glowing pearl and iridescent mantle. Emissive.
128toadstoolRed, white-spotted mushroom. Transparent cross-shape plant, no collision.
129ember pileSmoldering coal/ash mound. Emissive — bright embers glow, ash stays dark.

CUSTOM TEXTURES

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.

Custom textures require network access to fetch the inscription image. They work when the game is loaded from blockforgebtc.com or ordinals.com, but not from a local file.

DECORATIONS (GLB MODELS & PAINTINGS)

Two optional top-level arrays attach rich media to a build. Their coordinates are local to the chunk (0-31 X/Z, 1-63 Y), the same convention as a. Both are captured when a chunk is exported/inscribed, so a build round-trips with its models and paintings intact.

gcases — GLB Display Cases

Each entry mounts an on-chain 3D model (a GLB or glTF model/* inscription) inside a bounded display case. Also place a glb case block (ID 125) at the same coordinate in a — that block is the physical anchor.

{
  "a": [ [15, 11, 15, "glb case"] ],
  "gcases": [
    { "x": 15, "y": 11, "z": 15, "iid": "abc...i0", "size": 5, "spin": 0 }
  ]
}
FieldNotes
x,y,zLocal coords of the case block (must match a glb case entry in a).
iidInscription ID of a GLB or glTF model/* inscription.
sizeCase edge length in blocks: 1, 3, 5, or 7. The model auto-fits inside.
spin0 = static, 1 = slow auto-rotate.
Models are budget-checked on load (≤150k triangles, ≤250k vertices, ≤5 MB, self-contained) and auto-scaled to fit the case. Oversized or external-referencing models are skipped. For flat images use a painting; for HTML/interactive art use a Display Pedestal (ID 104).

paintings — image murals

Each entry mounts an image inscription across a grid of painting cell blocks (ID 123). Place the cells in a across the wall area, then add one paintings entry anchored at the correct cell.

{
  "a": [ /* painting cell blocks filling a 3x3 area on a wall */ ],
  "paintings": [
    { "x": 15, "y": 12, "z": 5, "iid": "abc...i0", "size": 3, "facing": [0, 1] }
  ]
}
FieldNotes
x,y,zLocal coords of the anchor cell: bottom-middle for odd sizes (3, 5), bottom-left for even sizes (2, 4).
iidInscription ID of an image inscription (PNG, GIF, etc). HTML inscriptions are rejected.
sizePainting grid edge: 2, 3, 4, or 5. (Larger interactive sizes are not restored from JSON.)
facing[dx, dz] cardinal direction the image faces toward the viewer: [0,1] = +Z, [0,-1] = -Z, [1,0] = +X, [-1,0] = -X.
Both gcases and paintings fetch their inscription over the network (works on blockforgebtc.com / ordinals.com, not from a local file), same as custom textures.

EXAMPLES

Simple Tower on Cleared Ground

{
  "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"]
  ]
}

Add Blocks to Existing Terrain (No Clear)

{
  "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]
  ]
}

Bitcoin Shrine

{
  "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"]
  ]
}

TIPS FOR AI AGENTS

Testing: Open BlockForge, go to Chunk Options, and click "Import Chunk JSON" to paste and preview your build in-game before inscribing.

BlockForge by MDV · blockforgebtc.com