With Minecraft Bedrock 1.21.0+, custom block authoring transitioned into a declarative component system. The legacy block pipeline has been replaced by modular components in the Behavior Pack paired with texture definitions in the Resource Pack.
1. Behavior Pack Component Declaration
Every custom block JSON requires a namespace identifier and core components defining friction, geometry, material instances, and collision bounds.
{
"format_version": "1.21.0",
"minecraft:block": {
"description": {
"identifier": "custom:industrial_workbench",
"menu_category": {
"category": "items",
"group": "itemGroup.name.workbench"
}
},
"components": {
"minecraft:geometry": "geometry.industrial_workbench",
"minecraft:material_instances": {
"*": {
"texture": "industrial_workbench",
"render_method": "opaque"
}
},
"minecraft:collision_box": true,
"minecraft:selection_box": true,
"minecraft:destructible_by_mining": {
"seconds_to_destroy": 1.5
}
}
}
}
2. Resource Pack Mappings
For the engine to display the block model and texture, register the identifier inside blocks.json and declare the texture path inside textures/terrain_texture.json:
// terrain_texture.json
{
"resource_pack_name": "digital_tools_shed_rp",
"texture_name": "atlas.terrain",
"texture_data": {
"industrial_workbench": {
"textures": "textures/blocks/industrial_workbench"
}
}
}
3. Molang State Permutations
Dynamic block properties (such as activation states, rotation directions, or visual variants) are managed using permutations and minecraft:custom_components:
"permutations": [
{
"condition": "q.block_state('custom:powered') == 1",
"components": {
"minecraft:light_emission": 14,
"minecraft:material_instances": {
"*": {
"texture": "industrial_workbench_active",
"render_method": "blend"
}
}
}
}
]
Generate Bedrock Manifests & UUIDs
Use our generator to create valid manifest.json files with matching UUID v4 pairs and module headers for your Behavior and Resource packs.
⚠️ 5 Fatal Traps & Engineering Pitfalls
Critical implementation hazards and architecture failure modes discovered in production environments:
Attempting to use legacy format versions like 1.16.100 for modern custom blocks breaks custom_components, collision boxes, and creative inventory grouping in Bedrock 1.21.0+.
Declaring minecraft:geometry without a corresponding minecraft:material_instances component triggers compilation errors and renders blocks as missing black/purple checkerboards.
Placing sound properties inside the description object in 1.26+ block schemas causes silent loader rejection. Sound mappings belong in blocks.json via the resource pack.
Bedrock geometry identifiers are case-sensitive. A mismatch between geometry.industrial_workbench in the model and the BP block definition will cause invisible blocks.
Permutations override base components completely for specified keys. Forgetting to re-declare collision_box or material_instances in permutations can cause collision clipping.