Anatomy of a Bedrock Identifier
In Bedrock Edition, an identifier is a string split into two parts by a colon: the namespace on the left, and the asset name on the right (for example, `my_pack:copper_coin`). Both parts must be written in strictly lowercase letters. You can use numbers and underscores, and in some contexts hyphens or periods are tolerated, but sticking to `a-z`, `0-9`, and `_` is the safest practice across all engine systems.
The namespace acts as an ownership tag. When the game loads multiple behavior and resource packs into a single world, it merges their contents into one registry. If two different packs define an item simply called `ruby`, the pack higher in the load order will overwrite the lower one, causing bugs in the overridden pack. If one pack uses `magic_mod:ruby` and the other uses `gemcraft:ruby`, both items exist in the game simultaneously without conflict.
| Example Identifier | Validity | Notes |
|---|---|---|
| sky_isles:cloud_brick | Valid | Uses lowercase letters and underscores with a custom namespace. |
| SkyIsles:CloudBrick | Invalid | Contains uppercase letters, which will fail schema validation or fail to match textures. |
| minecraft:cloud_brick | Invalid (for new content) | Uses the reserved vanilla namespace for a custom object. |
| s:cloud_brick | Risky | Single-letter namespaces are valid in some systems but often collide with other packs. |
Choosing Your Namespace
Before writing your first JSON file, decide on a namespace strategy. There are two common patterns among add-on developers: choosing a studio prefix (derived from your creator name or team) or choosing a project prefix (derived from the specific add-on's name). For most standalone packs, combining both or using a distinct project abbreviation works best.
Keep your namespace between three and twelve characters. Avoid generic words like `custom`, `addon`, `mod`, `test`, or `new`. If you use `custom:sword` in a published pack, the odds of another creator choosing that exact same identifier are extremely high. Instead, pick something distinct to your project, such as `arcania:silver_sword` or `joes_tinkering:silver_sword`.
Reserved Namespaces
The `minecraft` and `minecon` namespaces are strictly reserved for vanilla game content. In older versions of Bedrock, the engine allowed creators to register totally new items and blocks under the `minecraft:` prefix, which caused widespread breaks whenever official game updates introduced features with overlapping names.
In modern format versions (specifically `1.16.100` and later for items and blocks), the Content Log will throw a hard parsing error if you try to define a brand-new asset using `minecraft:`. The only time you should ever put `minecraft:` in the description identifier of a behavior pack file is when you are intentionally overriding and modifying an existing vanilla entity, item, or recipe—such as changing the behavior of `minecraft:creeper` or altering the output of a vanilla crafting recipe.
Note that while your custom asset's identifier must use your own namespace, the components inside that file will still use the `minecraft:` namespace, because those components are built-in engine features.
{
"format_version": "1.20.80",
"minecraft:block": {
"description": {
"identifier": "underworld:basalt_pillar",
"states": {
"underworld:is_cracked": [
false,
true
]
}
},
"components": {
"minecraft:destructible_by_mining": {
"seconds_to_destroy": 2.0
},
"minecraft:destructible_by_explosion": {
"explosion_resistance": 6.0
}
}
}
}Where Namespaces Are Required
Namespaces are not just for top-level block, item, and entity identifiers. As the Bedrock add-on format has matured, the engine has enforced namespace prefixes on smaller sub-features to prevent collisions inside shared registries.
Custom block states, custom entity properties, block and item tags, recipe identifiers, loot table conditions, particle effects, and custom geometries all use namespaces. Even within the Scripting API, custom component names registered in JavaScript must be prefixed with your namespace.
| Feature Type | Example | Requirement Level |
|---|---|---|
| Blocks, Items, Entities | underworld:basalt_pillar | Mandatory. Must not be `minecraft` for new assets. |
| Block States & Entity Properties | underworld:is_cracked | Mandatory. Un-namespaced states fail to parse in current versions. |
| Custom Geometries | geometry.underworld.gargoyle | Uses dot notation instead of a colon, starting with `geometry.`. |
| Item & Block Tags | underworld:is_magical_metal | Recommended. Avoids triggering vanilla tag checks accidentally. |
| Localization Keys | tile.underworld:basalt_pillar.name | Generated automatically by the game from your identifier. |
Connecting Behavior and Resource Packs
Your namespace is the bridge that links an object's server-side logic in the Behavior Pack (BP) to its client-side visuals in the Resource Pack (RP). The file names and folder paths do not link these files together; only the string inside `identifier` does.
When you create an entity in your Behavior Pack with the identifier `underworld:imp`, the Resource Pack looks for a client entity definition with that exact same `underworld:imp` identifier to know which model, texture, animation, and render controller to display. If there is even a single character mismatch in the namespace between the two packs, the entity will function in the world (taking damage, moving, making sounds if defined in BP) but will be completely invisible to the player.
{
"format_version": "1.10.0",
"minecraft:client_entity": {
"description": {
"identifier": "underworld:imp",
"materials": {
"default": "entity_alphatest"
},
"textures": {
"default": "textures/entity/imp"
},
"geometry": {
"default": "geometry.underworld.imp"
},
"render_controllers": [
"controller.render.default"
]
}
}
}Which versions this applies to
Applies to all modern Bedrock versions. Strict enforcement rejecting the 'minecraft' namespace on custom items, blocks, and block states applies to format_version 1.16.100 and higher. No experimental toggles are required.
When it does not work
| What you see | Why | The fix |
|---|---|---|
| Content Log error: "Invalid identifier 'minecraft:my_custom_item'. Namespace cannot be 'minecraft'." | You used the reserved `minecraft:` namespace while using a modern `format_version` for a new item or block. | Change the identifier prefix to your own custom namespace, such as `my_pack:my_custom_item`, and update your `en_US.lang` file and recipe references to match. |
| Custom block loads into the game, but its custom block state throws a parsing error and the block loses all components. | You wrote a custom block state name without a namespace (e.g., `"is_lit": [true, false]`). | Add your custom namespace and a colon to the state name inside the `description.states` object (e.g., `"underworld:is_lit": [true, false]`) and in all permutations or Molang queries that check it. |
| Item or block name displays on screen as `tile.underworld:basalt_pillar.name` or `item.underworld:ruby.name` instead of a clean title. | The localization key in `RP/texts/en_US.lang` is missing the namespace, or the namespace is spelled differently than in the JSON file. | Open `RP/texts/en_US.lang` and ensure the left side of the equals sign includes the exact namespace and colon, such as `tile.underworld:basalt_pillar.name=Basalt Pillar`. |
Reference, straight from the game files
Read out of the game itself, so the ids match the version you are building for.
