Wiki 9Minecraft Wiki 9Minecraft

Pack Folder Structure Reference

Standard directory layouts and file locations for Behavior Packs and Resource Packs.

5Sections
2Code examples
4Known errors

Minecraft Bedrock add-ons are split into Behavior Packs (server-side logic and data) and Resource Packs (client-side visuals, audio, and UI). The game engine locates files by scanning specific, hardcoded root directories inside each pack rather than reading a central index. Knowing which folder holds which asset type is essential whenever you set up a new project or troubleshoot missing content.

Root Files and Manifest

Every valid pack must have a manifest.json file sitting directly in its root folder. If you zip your pack with an extra wrapper folder around the root, Minecraft will fail to detect the manifest during import or directory scanning. Alongside the manifest, you can place a square PNG image named pack_icon.png, which displays in the world settings and storage menus.

The manifest defines the pack's identity via unique UUIDs and tells the engine what kind of files to expect inside through the module type. A Behavior Pack uses the data module type (and optionally script for the Script API), while a Resource Pack uses the resources module type.

BP/manifest.json
{
  "format_version": 2,
  "header": {
    "name": "Example Behavior Pack",
    "description": "Server logic and definitions",
    "uuid": "00000000-0000-4000-8000-000000000001",
    "version": [1, 0, 0],
    "min_engine_version": [1, 20, 80]
  },
  "modules": [
    {
      "type": "data",
      "uuid": "00000000-0000-4000-8000-000000000002",
      "version": [1, 0, 0]
    }
  ]
}

Behavior Pack Directories

Behavior Packs control how the world operates. For most directories in a Behavior Pack, the engine recursively scans all subfolders and ignores the actual filenames, caring only about the identifier declared inside the JSON. For example, you can organize BP/entities/ into subfolders like BP/entities/hostile/ and BP/entities/passive/ without changing how the game loads them.

There are two strict exceptions to this rule: functions and structures. In both BP/functions/ and BP/structures/, the relative folder path and the file name directly determine the identifier you type in commands or structure blocks. A file at BP/functions/arena/reset.mcfunction is called in-game as function arena/reset.

Folder PathWhat it doesNotes
BP/animation_controllers/State machines that run commands or Molang expressions.Filename ignored; grouped by internal identifier.
BP/animations/Timeline-based command and Molang execution. Often called Behavior Animations.
BP/biomes/Custom biome generation and surface rules.Custom biomes have changed across versions; check current engine requirements.
BP/blocks/Custom block components, permutations, and properties.Filename ignored; uses identifier inside minecraft:block.
BP/entities/Server-side entity behaviors, AI goals, and attributes.Filename ignored; uses identifier inside minecraft:entity.
BP/features/World generation placement logic (ores, trees, structures).File name must match the feature identifier in older format versions.
BP/feature_rules/Conditions dictating where and when features generate.Links biomes to features.
BP/functions/Lists of slash commands (.mcfunction) and tick.json.Path and filename define the command name.
BP/items/Custom item components, food values, and durability.Filename ignored; uses identifier inside minecraft:item.
BP/loot_tables/Drop tables for mobs, blocks, and chests.Referenced by relative file path from the pack root.
BP/recipes/Crafting table, furnace, stonecutter, and brewing recipes.Filename ignored; every recipe needs a unique internal identifier.
BP/scripts/JavaScript files for the @minecraft/server Script API.Entry file path must match the entry field in manifest.json.
BP/spawn_rules/Conditions for natural mob spawning in the world.Filename ignored; links to an entity identifier.
BP/structures/Saved .mcstructure files for generation or /structure.Subfolder under BP/structures/ becomes the namespace.
BP/trading/Villager and custom entity trade tables.Referenced by relative file path inside minecraft:economy_trade_table.

Resource Pack Directories

Resource Packs handle everything the player sees and hears. While directories like RP/entity/, RP/models/, and RP/render_controllers/ allow you to organize JSON files into arbitrary subfolders because they rely on internal identifiers, asset folders like RP/textures/ and RP/sounds/ rely strictly on file paths.

Furthermore, several critical registry files must sit at exact, hardcoded paths and are not inside their own dedicated folders. For instance, blocks.json and biomes_client.json sit in the root of the Resource Pack, and sound_definitions.json must sit inside RP/sounds/.

Folder / File PathWhat it doesNotes
RP/animation_controllers/State machines controlling visual skeletal animations, particles, and sounds.Uses internal identifiers.
RP/animations/Keyframe bone animations for entities and attachables.Uses internal identifiers.
RP/attachables/Visual definitions for worn armor and held 3D items.Links an item identifier to geometry, textures, and animations.
RP/entity/Client entity definitions (.entity.json).Notice the folder is singular (entity), unlike BP/entities/.
RP/fogs/Custom fog distance and color settings.Referenced by fog identifier in biomes_client.json or /fog.
RP/materials/Render material definitions (.material).Advanced rendering rules; merged by filename.
RP/models/entity/3D geometry files (.geo.json) for entities, blocks, and items.Modern format versions scan all of RP/models/ for minecraft:geometry.
RP/particles/Custom particle emitters and visual behavior.Filename ignored; uses identifier inside particle_effect.
RP/render_controllers/Logic picking which geometry, material, and texture to display.Uses internal identifiers.
RP/sounds/Audio files (.ogg, .wav, .fsb) and sound_definitions.json.Audio paths are referenced without their file extension.
RP/texts/Localization files (.lang) and languages.json.Translates raw identifiers like item.custom:sword.name.
RP/textures/All PNG and TGA image assets, plus texture definition registries.Contains terrain_texture.json, item_texture.json, and flipbook_textures.json.
RP/ui/JSON UI screen modifications and _ui_defs.json.Uses exact screen names to merge with vanilla UI.
RP/blocks.jsonRoot file mapping block identifiers to sounds and terrain textures.Legacy registry; still useful for vanilla block overrides.
RP/biomes_client.jsonRoot file controlling water color, fog, and foliage tint per biome.Sits directly in RP/ root.

Texture Shortnames and Registry Files

In a Resource Pack, blocks and items rarely point directly to a PNG file path in their main definition files. Instead, they use a shortname (an alias) mapped in RP/textures/terrain_texture.json (for blocks) or RP/textures/item_texture.json (for items). This layer of indirection lets the engine stitch all block and item textures into large texture atlases during pack loading.

When writing paths inside these JSON registries—or inside client entity definitions—you must always start from the root of the Resource Pack (textures/...) and omit the .png or .tga file extension. The engine automatically resolves the file format and checks for texture variations.

RP/textures/terrain_texture.json
{
  "resource_pack_name": "example_rp",
  "texture_name": "atlas.terrain",
  "padding": 8,
  "num_mip_levels": 4,
  "texture_data": {
    "example_custom_ore": {
      "textures": "textures/blocks/custom_ore"
    }
  }
}

Local Development Folders

Inside Minecraft's com.mojang application directory, you will find two pairs of pack folders: behavior_packs / resource_packs, and development_behavior_packs / development_resource_packs. When you double-click a .mcpack or .mcaddon file, Minecraft extracts the contents into the standard behavior_packs and resource_packs folders.

While building an add-on, you should place your working folders inside development_behavior_packs and development_resource_packs instead. When a world uses a pack from the development directories, it links to the pack by UUID rather than copying the entire folder into the world's own db directory. This allows you to edit JSON files, scripts, and textures on your drive and see the changes immediately after reloading the world or running /reload.

Which versions this applies to

Applies to all modern Bedrock Edition versions (1.16.0 through 1.21+). The base folder layout is stable and requires no experimental toggles, though specific features inside folders (like beta Script API modules in BP/scripts/) have their own version and toggle requirements.

When it does not work

What you seeWhyThe fix
Client entity models, textures, and spawn eggs are completely invisible in-game, with no content log errors.You named the client entity folder RP/entities/ (plural) to match BP/entities/. The Resource Pack strictly expects the singular folder name RP/entity/.Rename the folder in your Resource Pack from RP/entities/ to RP/entity/.
Importing a .mcpack or .mcaddon fails with 'Failed to import: Not a valid zip archive' or 'Missing manifest.json'.You zipped the parent folder containing your pack rather than zipping the contents directly, placing manifest.json at MyPack/manifest.json inside the archive instead of at the root.Select manifest.json, pack_icon.png, and the asset folders directly, then compress those together so manifest.json is at the top level of the archive.
Custom blocks or items show the magenta-and-black missing texture checkerboard, and the content log warns that a texture could not be found.You included the .png file extension in your JSON path (for example, 'textures/items/ruby.png'), or you put a direct file path into minecraft:icon instead of a shortname defined in RP/textures/item_texture.json.Remove the .png extension from the path string in your JSON files, and verify that the shortname is registered inside terrain_texture.json or item_texture.json.
Running /structure load my_namespace:house says the structure does not exist, even though house.mcstructure is inside BP/structures/.Unlike JSON definitions, .mcstructure files do not have an internal identifier field. They get their namespace from a subfolder inside BP/structures/.Create a subfolder matching your namespace and move the file to BP/structures/my_namespace/house.mcstructure.

Reference, straight from the game files

Read out of the game itself, so the ids match the version you are building for.