How to Make a Custom Block in Minecraft Bedrock (Add-on Guide)
· Checked against Minecraft Bedrock 1.26.50Want to add your own block to Minecraft Bedrock? This guide walks you through every file you need: the JSON definition, the texture, the name, and how to pick it up in-game.
You will build a simple glowing "Ruby Block" that drops itself when mined. No experimental toggles are required. Everything here works on the current stable version (1.26.50).
This guide assumes you already have a basic add-on folder set up (a behavior pack and a resource pack with valid manifest.json files). If you are starting from scratch, read Add-on basics first.
Before you start
A custom block needs files in both packs, even though the block logic lives only in the behavior pack:
| Pack | File | What it does |
|---|---|---|
| Behavior pack | blocks/ruby_block.json | Defines the block: identifier, geometry, texture reference, hardness, light, loot. |
| Resource pack | textures/blocks/ruby_block.png | The 16×16 pixel-art image for the block face. |
| Resource pack | textures/terrain_texture.json | Registers the texture so the game can find it. |
| Resource pack | texts/en_US.lang | Gives the block its display name. |
Unlike custom entities, blocks do not need a resource-pack definition file. The behavior-pack JSON plus the texture files are all the game needs.
Put your work-in-progress packs in the development_behavior_packs and development_resource_packs folders inside com.mojang. Packs in the normal folders can get cached, so edits may not show until you restart the game.
The block file (behavior pack)
Create a new file at BP/blocks/ruby_block.json (the folder must be called blocks, plural). Here is the complete, minimal block definition:
{
"format_version": "1.26.50",
"minecraft:block": {
"description": {
"identifier": "myaddon:ruby_block",
"menu_category": {
"category": "construction"
}
},
"components": {
"minecraft:geometry": "minecraft:geometry.full_block",
"minecraft:material_instances": {
"*": {
"texture": "myaddon_ruby_block"
}
}
}
}
}Let us break down each part:
format_version: set to"1.26.50". This is the block-file format, not the game version. Do not confuse it with the manifest format version.identifier: your block's unique ID. Use the patternnamespace:name(lowercase letters, digits, underscores). Theminecraftnamespace is reserved, so pick your own short name likemyaddon.menu_category: controls which creative-inventory tab the block appears in. Valid values:construction,equipment,items,nature. Without this the block will not show in creative.minecraft:geometry:"minecraft:geometry.full_block"is the built-in 16×16×16 cube model. Since version 1.21.80 this is required for every custom block; omitting it causes a conflict with vanilla values.minecraft:material_instances: maps faces to textures. The key"*"means "all six faces." The value"myaddon_ruby_block"is a short name you will register interrain_texture.json(next section). It is not a file path.
The components object must exist even if it is empty. A block file without a components key will not register.
Add the texture (resource pack)
Two files in the resource pack make the block visible:
1. The PNG image
Create a 16×16 pixel PNG and save it as RP/textures/blocks/ruby_block.png. Any image editor works: Paint, Krita, GIMP, or an online pixel-art tool. For a standard cube block the image is 16 pixels wide and 16 pixels tall.
2. Register it in terrain_texture.json
Create (or edit) the file RP/textures/terrain_texture.json. The file name must be exactly terrain_texture.json: not terrain_textures.json or any other spelling.
{
"resource_pack_name": "myaddon_rp",
"texture_name": "atlas.terrain",
"padding": 8,
"num_mip_levels": 4,
"texture_data": {
"myaddon_ruby_block": {
"textures": "textures/blocks/ruby_block"
}
}
}myaddon_ruby_block(the key): this is the short name you used inmaterial_instances. It must match exactly.textures/blocks/ruby_block(the value): the path to the PNG without the.pngextension, relative to the resource-pack root.texture_name: must be"atlas.terrain"for block textures.
What about blocks.json? In older versions you needed a RP/blocks.json file to assign a sound to a block. Since 1.26.50 the minecraft:sound component in the behavior-pack block file handles this directly, so blocks.json is no longer needed for new add-ons. If you are adding a sound, use the component (see the "Make it glow, drop items" section below for the pattern).
Give it a name
Open RP/texts/en_US.lang and add one line:
tile.myaddon:ruby_block.name=Ruby BlockThe pattern is tile.identifier.name=Display Name. The display name is what players see in the creative inventory and in their hotbar.
If you skip this line, the block will show its raw identifier (myaddon:ruby_block) as the name. It still works, but it looks ugly.
Get the block in-game
There are two ways to pick up your new block:
- Creative inventory. Open the creative menu and look in the tab you set in
menu_category(we usedconstruction). Your Ruby Block should be there with its texture and name. - The /give command. Make sure cheats are enabled, then type:
/give @s myaddon:ruby_blockTo get five at once: /give @s myaddon:ruby_block 5.
If the block does not appear, check the Content Log (Settings → Creator → enable both content-log toggles). It will tell you exactly which file or key is wrong. Press Ctrl + H in-game to open the log history.
Make it glow, drop items, and more
The block file supports several extra components. Add them inside the "components" object alongside geometry and material_instances:
{
"format_version": "1.26.50",
"minecraft:block": {
"description": {
"identifier": "myaddon:ruby_block",
"menu_category": {
"category": "construction"
}
},
"components": {
"minecraft:geometry": "minecraft:geometry.full_block",
"minecraft:material_instances": {
"*": {
"texture": "myaddon_ruby_block"
}
},
"minecraft:destructible_by_mining": {
"seconds_to_destroy": 3
},
"minecraft:destructible_by_explosion": {
"explosion_resistance": 3
},
"minecraft:map_color": "#ff3355",
"minecraft:light_dampening": 0,
"minecraft:light_emission": 4,
"minecraft:loot": "loot_tables/blocks/ruby_block.json"
}
}
}Here is what each added component does:
minecraft:destructible_by_mining:seconds_to_destroysets how long it takes to break the block with an appropriate tool. Lower = harder.minecraft:destructible_by_explosion:explosion_resistancecontrols how well the block survives explosions. Higher = more resistant.minecraft:map_color: a hex colour (e.g."#ff3355") used when the block appears on a map.minecraft:light_dampening: how much the block blocks light.0means it lets all light through (useful for glass-like blocks). The default for opaque blocks is15.minecraft:light_emission: the light level the block gives off (0 to 15). Set it to4for a soft glow,14for near-full brightness (like a lantern).minecraft:loot: a path to a loot-table JSON file in the behavior pack (e.g.loot_tables/blocks/ruby_block.json). If you remove this component, the block drops itself by default.
For a simple "drop itself" block you do not need a loot table at all. Just omit the minecraft:loot line. The block will drop one copy of itself when broken.
If your block has a custom (non-cube) geometry and you see an unwanted shadow underneath it, add "minecraft:light_dampening": 0 to the components.
What changed recently (and why old tutorials may be wrong)
Block add-ons have changed a lot in the last year. If you are following an older tutorial, watch out for these:
- 1.21.80: Explicit
minecraft:geometrybecame required for all custom blocks. Tutorials from before this version that skip it will produce a "dirt block with a question mark" in-game. - 1.26.20: The old
tag:*components were removed. Use"minecraft:tags": ["minecraft:is_shears_item_destructible"]instead. Also,ambient_occlusionmust now be a float (e.g.0.5), not a boolean. - 1.26.30:
lava_flammableadded to the flammable component;culling_shapereleased. - 1.26.40:
minecraft:multi_blocktrait andminecraft:instrument_soundreleased from experimental. N-way and sixteen-way rotation no longer need the "Upcoming Creator Features" toggle. - 1.26.50:
minecraft:soundandminecraft:block_entityreleased from experimental. You can now set block sounds directly in the BP component instead of usingblocks.json. - Holiday Creator Features: This experimental toggle no longer exists. You do not need to enable any experiment to create basic custom blocks, items, or entities on the current stable version.
If a tutorial tells you to enable "Holiday Creator Features," it is outdated. Skip that step.
Common mistakes (and how to fix them)
- Black-and-magenta checkerboard texture. The short name in
material_instancesdoes not match the key interrain_texture.json, or the file path is wrong. Check both spellings character by character. - Dirt block with a "?" (the "unknown block"). The JSON is invalid, the identifier was changed after you already placed it, or you are missing
minecraft:geometry/minecraft:material_instances. - Transparent pixels render as solid. Add
"render_method": "alpha_test"inside the material instance:"*": { "texture": "myaddon_ruby_block", "render_method": "alpha_test" }. - Block has a shadow it should not. Add
"minecraft:light_dampening": 0. - Block not in the creative inventory. You forgot
menu_category, or the pack is not activated in the world settings. - Wrong file name for the texture JSON. It must be exactly
terrain_texture.jsoninRP/textures/. Notterrain_textures.json, notterrain_texture.json.txt. - Using old
tag:*components. These were removed in format 1.26.20. Use"minecraft:tags"(an array of tag strings) instead. - JSON syntax error. One missing comma or extra comma breaks the entire file silently. Paste your JSON into a validator (like jsonlint.com) to check. Note: Minecraft does accept
//comments in JSON, but online linters will flag them. That is fine; the game will still read the file. - Edits not showing. If your packs are in the normal
behavior_packs/resource_packsfolders, the game may be using a cached copy. Move them todevelopment_behavior_packs/development_resource_packs, then exit and re-enter the world.
The fastest way to diagnose any of these: turn on the Content Log (Settings → Creator, enable both toggles), reload the world, and read the errors. It will name the exact file and line that is wrong.
FAQ
Do I need an experimental toggle?
No. Basic custom blocks (geometry, material_instances, hardness, light, loot) work on the current stable version with no experiments enabled.
Can I override a vanilla block (like stone or dirt)?
No. Vanilla blocks are hard-coded into the game. You can only add new blocks with your own identifier.
Do I need a blocks.json file in the resource pack?
Not for basic blocks. Since 1.26.50 the minecraft:sound component in the behavior-pack file handles sounds directly. blocks.json is only a legacy option for older setups.
What size should my block texture be?
16×16 pixels for a standard cube block using minecraft:geometry.full_block. If you use a custom geometry from Blockbench, the texture size must match the texture_width and texture_height set in that model.
Can I make a block that is not a cube?
Yes. Build a custom model in Blockbench (Bedrock Block format), export the geometry JSON, and reference its geometry identifier in the minecraft:geometry component instead of "minecraft:geometry.full_block". The rest of the setup (texture, name, components) stays the same.
My block shows up but the texture is missing. What now?
Check three things: (1) the PNG is at the correct path in the resource pack, (2) the key in terrain_texture.json matches the short name in material_instances exactly, (3) the path value in terrain_texture.json points to the right folder and file name (without the .png extension).
Do I need to restart Minecraft after editing a file?
If your packs are in the development_* folders, exiting and re-entering the world is usually enough. If they are in the normal pack folders, a full restart of Minecraft is safer because of caching.
Related guides
- Add-on basics (packs, manifests, folders)
- How to Make a Custom Entity
- How to Make a Custom Item
- Free add-ons to download
- Video tutorials
Sources
- Bedrock Wiki: Intro to Blocks
- Bedrock Wiki: Block components
- Bedrock Wiki: Block troubleshooting
- Bedrock Wiki: Block format history
- Microsoft Learn: Create a Custom Die Block
- Microsoft Learn: 1.26.40 Update Notes
- Microsoft Learn: 1.21.80 Update Notes
- Mojang bedrock-samples (vanilla block files)
- Bedrock Wiki: Project setup guide
- Bedrock Wiki: Troubleshooting guide
Join the Discord for update announcements, help and sneak peeks.
Join Discord