Wiki 9Minecraft Wiki 9Minecraft

Namespaces and Custom Identifiers

How to structure identifiers, avoid pack collisions, and obey reserved namespace rules.

5Sections
2Code examples
3Known errors

Every custom block, item, entity, recipe, and state you add to Minecraft Bedrock requires a unique identifier composed of a namespace and a name. Understanding how namespaces work is the first step in making sure your add-on loads cleanly without overwriting vanilla features or breaking when a player installs another creator's pack alongside yours.

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 IdentifierValidityNotes
sky_isles:cloud_brickValidUses lowercase letters and underscores with a custom namespace.
SkyIsles:CloudBrickInvalidContains uppercase letters, which will fail schema validation or fail to match textures.
minecraft:cloud_brickInvalid (for new content)Uses the reserved vanilla namespace for a custom object.
s:cloud_brickRiskySingle-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.

BP/blocks/ basalt_pillar.json
{
  "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 TypeExampleRequirement Level
Blocks, Items, Entitiesunderworld:basalt_pillarMandatory. Must not be `minecraft` for new assets.
Block States & Entity Propertiesunderworld:is_crackedMandatory. Un-namespaced states fail to parse in current versions.
Custom Geometriesgeometry.underworld.gargoyleUses dot notation instead of a colon, starting with `geometry.`.
Item & Block Tagsunderworld:is_magical_metalRecommended. Avoids triggering vanilla tag checks accidentally.
Localization Keystile.underworld:basalt_pillar.nameGenerated 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.

RP/entity/imp.entity.json
{
  "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 seeWhyThe 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.