Wiki 9Minecraft Wiki 9Minecraft

Add-on Project Setup and Folder Structure

How to configure your workspace, locate com.mojang, and build valid manifest files.

6Sections
2Code examples
4Known errors

Every Minecraft Bedrock add-on starts with a specific folder structure and a pair of manifest files that tell the game your packs exist. Setting up this environment properly lets you edit JSON and textures directly inside the game's development folders, meaning you can test changes simply by reloading your world. Reach for this guide whenever you are starting a new project from scratch or migrating an existing workspace to a new machine.

The Split Architecture: Behavior vs Resource Packs

Bedrock add-ons are almost always split into two separate packs that work together: a Behavior Pack (commonly abbreviated as BP) and a Resource Pack (RP). The Behavior Pack handles the server-side logic of your creation. It defines how entities move and attack, what loot tables blocks drop, how custom items function, and what recipes exist. If a player joins a multiplayer world, the server runs the Behavior Pack logic.

The Resource Pack handles everything the client sees and hears. It holds textures, 3D geometry models, animations, sound definitions, particles, and localization files. Even if you are only adding a single simple block, you will usually create both packs: the Behavior Pack defines the block's collision, friction, and destructibility, while the Resource Pack assigns its texture and display name.

In documentation and professional workspaces, you will see file paths prefixed with BP/ and RP/ to indicate which pack a file belongs to. The folder names inside these packs are strict. The game looks for exact pluralized folder names like entities, blocks, items, loot_tables, and textures. A typo in a top-level folder name will cause the game to silently ignore everything inside it.

Subfolder NamePack TypeWhat it holds
blocks/BPServer-side block definitions, components, and permutations.
entities/BPEntity behavior, component groups, events, and AI goals.
items/BPCustom item logic, food values, durability, and weapon stats.
loot_tables/BPJSON files dictating what drops from blocks, entities, or chests.
recipes/BPCrafting table, furnace, stonecutter, and brewing recipes.
scripts/BPJavaScript files executed by the @minecraft/server Script API.
entity/RPClient entity definitions linking identifiers to textures and models (note the singular name).
models/RPCustom geometry files, usually placed inside models/entity/ or models/blocks/.
textures/RPPNG/TGA image files and terrain_texture.json or item_texture.json.
texts/RPLanguage files like en_US.lang for translating identifiers into readable names.

Locating the com.mojang Directory

When building an add-on, you should not zip and import your files every time you make an edit. Instead, you place your unzipped project folders inside the game's dedicated development directories. Minecraft reads from these folders every time you load a world, allowing rapid iteration.

These folders live inside a master directory named com.mojang. Inside com.mojang, you will find two folders specifically meant for creators: development_behavior_packs and development_resource_packs. Anything placed inside these two folders becomes immediately available in the world creation menu without needing to be imported.

On Windows 10 and 11, the location of com.mojang changed when the game migrated to the GDK app model. For current versions of Minecraft Bedrock on Windows, press Win + R and enter %APPDATA%\Minecraft Bedrock\Users\Shared\games\com.mojang to jump straight to the shared directory. If you are working on an older installation or a system that has not migrated, the folder is located inside the UWP app data path at %LOCALAPPDATA%\Packages\Microsoft.MinecraftUWP_8wekyb3d8bbwe\LocalState\games\com.mojang. On Android devices, it resides under Android/data/com.mojang.minecraftpe/files/games/com.mojang, though modern Android versions require a file manager with scoped storage permissions or a USB connection to view it.

Creating the Behavior Pack Manifest

For Minecraft to recognize a folder inside development_behavior_packs as an actual pack, the root of that folder must contain a file named manifest.json. This file gives the pack its name, version, minimum supported game version, and unique identifiers.

Every manifest requires at least two Version 4 UUIDs (Universally Unique Identifiers): one inside the header block, and one inside the modules block. Never copy UUIDs from tutorials or reuse them across different projects. You must generate fresh UUIDs for every single header and module you create, using your code editor's extension or a standard UUID generator tool. If two packs share a UUID, Minecraft will treat them as duplicates and refuse to load one of them.

The min_engine_version array tells the game which baseline behavior rules to apply to your pack. Setting this to a recent stable version ensures your pack has access to modern components and fixes.

BP/manifest.json
{
  "format_version": 2,
  "header": {
    "name": "My Custom Add-on BP",
    "description": "Behavior pack for custom content",
    "uuid": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "version": [1, 0, 0],
    "min_engine_version": [1, 20, 80]
  },
  "modules": [
    {
      "description": "Behavior Data Module",
      "type": "data",
      "uuid": "550e8400-e29b-41d4-a716-446655440000",
      "version": [1, 0, 0]
    }
  ],
  "dependencies": [
    {
      "uuid": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
      "version": [1, 0, 0]
    }
  ]
}

Creating the Resource Pack Manifest and Linking Packs

Your Resource Pack also needs a manifest.json at its root inside development_resource_packs. It looks nearly identical to the Behavior Pack manifest, with one critical difference: the module type must be set to resources instead of data.

Look closely at the dependencies array in the Behavior Pack manifest from the previous section, and compare it to the header UUID of the Resource Pack below. By placing the Resource Pack's header UUID inside the Behavior Pack's dependencies block, you link the two packs together. When a player activates your Behavior Pack on a world, Minecraft will automatically find and activate the matching Resource Pack. This prevents players from loading your custom blocks or entities without their required textures and models.

RP/manifest.json
{
  "format_version": 2,
  "header": {
    "name": "My Custom Add-on RP",
    "description": "Resource pack for custom content",
    "uuid": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
    "version": [1, 0, 0],
    "min_engine_version": [1, 20, 80]
  },
  "modules": [
    {
      "description": "Resource Assets Module",
      "type": "resources",
      "uuid": "123e4567-e89b-12d3-a456-426614174000",
      "version": [1, 0, 0]
    }
  ]
}

Enabling the Content Log for Debugging

Never develop an add-on blind. Minecraft Bedrock has a built-in diagnostic tool called the Content Log that catches JSON syntax errors, missing texture references, invalid component names, and script crashes the moment they happen.

Before creating your test world, open the main Minecraft Settings menu and navigate to the Creator tab. Turn on both Enable Content Log File and Enable Content Log GUI. When you load into a world with these settings active, any mistake in your pack will immediately print an error banner on the top of your screen, and you can press the assigned shortcut key to view the full error history.

Along with the Content Log, you should use a dedicated code editor such as Visual Studio Code. Place both your BP folder and RP folder into a single multi-root workspace so you can search across both packs at once. Adding a square PNG image named pack_icon.png to the root of each pack alongside manifest.json is also good practice, as it gives your pack a recognizable thumbnail in the game's settings menu.

Packaging for Distribution

Once your add-on works inside the development folders and you are ready to share it or test it on another device, you package it using Minecraft's custom archive extensions. These extensions are standard ZIP archives with renamed file endings that trigger Minecraft to import the files automatically when opened.

To package a single Behavior Pack or Resource Pack, select the contents of your pack folder—specifically manifest.json, pack_icon.png, and your subfolders—and compress them into a standard .zip file. Do not zip the outer folder itself; the manifest.json file must sit at the very top level inside the archive. Rename the resulting .zip file extension to .mcpack.

If your project uses both a Behavior Pack and a Resource Pack, create a .mcpack for each one, then compress both .mcpack files together into a new .zip archive. Rename that outer archive's extension to .mcaddon. When a player opens the .mcaddon file, Minecraft will extract and install both packs into its internal storage and link them automatically.

Which versions this applies to

Manifest format_version 2 is stable and applies to all modern Bedrock versions from 1.13.0 through 1.21+. No experimental toggles are required for basic project setup, though min_engine_version should be set to at least [1, 20, 80] for modern component support.

When it does not work

What you seeWhyThe fix
The pack does not appear in the Available Packs list in game, with no error message shown.The manifest.json file is either missing, placed inside a nested subfolder instead of the pack's root directory, or saved with a hidden .txt extension (such as manifest.json.txt) because file extensions are hidden in your operating system.Enable file name extensions in your system's file explorer, verify the file is named exactly manifest.json, and ensure it sits directly inside development_behavior_packs/your_pack_name/manifest.json.
Content Log shows: "Duplicate pack UUID detected" or only one of your two packs shows up in the menu.You copied and pasted the manifest.json from your Behavior Pack to your Resource Pack (or from an existing project) without generating new UUIDs, or you used the same UUID for both the header and the modules block.Generate four completely unique Version 4 UUIDs: two for the Behavior Pack (header and module) and two for the Resource Pack (header and module).
Content Log shows: "Failed to parse manifest.json" or complains about an unexpected token.There is a JSON syntax error in the manifest, most commonly a trailing comma after the last item in an object or array, or missing quotation marks around a string.Open manifest.json in a code editor with JSON validation, remove any trailing commas at the end of lists, and ensure all brackets and braces match.
Double-clicking your exported .mcpack gives an "Import Failed: Unknown pack name" error.You zipped the parent folder containing your pack rather than zipping the files inside the folder, creating an extra directory layer before manifest.json.Open your pack folder, select manifest.json and all subfolders directly, and compress those selected items into the zip archive before renaming to .mcpack.

Reference, straight from the game files

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