What textures_list.json Does
When Minecraft Bedrock loads a resource pack, it needs to know which textures exist so it can allocate memory, build texture atlases, and prepare entity or UI materials. If no index is provided, the engine falls back to walking the directory tree inside the textures folder. On slower storage devices—such as mobile phones, Nintendo Switch, or consoles—scanning hundreds of small folders adds noticeable lag to world loading.
By placing a textures_list.json file at RP/textures/textures_list.json, you give the engine a complete manifest up front. The game reads this single text file and immediately knows where every texture lives. In addition to speeding up initial load times, it allows the game to pre-cache entity and particle textures before they are spawned in the world, preventing the brief black-and-magenta checkerboard flash that sometimes happens when an entity appears for the first time.
Note that this file does not replace terrain_texture.json or item_texture.json. Those two files map short, friendly names to texture paths for blocks and items. By contrast, textures_list.json simply tells the engine that the underlying image files exist on disk.
File Location and Format
The file must be named textures_list.json and placed directly inside the textures folder of your resource pack (RP/textures/textures_list.json). Unlike almost every other JSON file in a Bedrock add-on, its root element is a JSON array rather than a JSON object, and it does not use a format_version key.
Each entry in the array is a string representing the path to a texture file, starting with textures/ and using forward slashes as directory separators. You must omit the file extension (.png, .tga, or .jpg) from every path.
[
"textures/blocks/custom_ore",
"textures/entity/goblin/goblin_base",
"textures/items/ruby_sword",
"textures/particle/magic_sparks",
"textures/ui/custom_hud_icon"
]Path Rules and Omissions
Because the engine relies on exact string matching when reading this array, small formatting mistakes will cause the game to miss your textures. All paths are relative to the root of the resource pack, not the textures folder where the JSON file itself sits. That is why every string starts with the prefix textures/.
If you are using Physically Based Rendering (PBR) features or flipbook animations, there are specific rules for which files belong in this list and which ones should be left out. The table below outlines how to handle different asset types inside the textures directory.
| Asset Type | Include in list? | Notes |
|---|---|---|
| Standard textures (.png, .tga, .jpg) | Yes | Write the path without the file extension. Always use forward slashes (/), never backslashes (\). |
| Flipbook atlas strips | Yes | Listed just like any normal block or item texture, without the extension. |
| UI nine-slice metadata (.json) | No | Do not list the companion .json files used for UI texture slicing; only list the image path itself. |
| Texture set definitions (.texture_set.json) | No | Never include the .texture_set.json file itself in the array. |
| MER and normal/heightmaps | Yes | The actual image files referenced by a texture set (such as _mer or _normal images) should be listed without extensions. |
| pack_icon.png | No | Lives at the root of the resource pack, outside the textures/ folder, and is handled separately. |
When You Need It vs. When You Do Not
During active development on a PC, you generally do not want a textures_list.json file in your working pack. When the file is present, Minecraft trusts it completely on certain platforms and build configurations. If you add a new block texture to your folder during testing but forget to append its path to textures_list.json, the game may act as if the image does not exist.
For this reason, seasoned creators leave textures_list.json out of their source folders while building and testing. Once the add-on is finished and ready to be packaged as a .mcpack or submitted for review, they generate the file as part of their final build step. If you are submitting content to the Minecraft Marketplace, including an accurate textures_list.json is mandatory and automated validation checks will reject packs that lack it or have mismatched entries.
Generating the List Automatically
Maintaining textures_list.json by hand in a pack with hundreds of custom items, blocks, and entity variants is tedious and error-prone. A single missing comma or a deleted image that remains in the list will trigger content log warnings.
You can automate this with a small Node.js script placed in your project root, or by using build tools designed for Bedrock development. Running a script right before zipping your pack ensures the list is always in sync with your actual files.
const fs = require('fs');
const path = require('path');
const packRoot = './RP';
const texturesDir = path.join(packRoot, 'textures');
const validExtensions = new Set(['.png', '.tga', '.jpg']);
const textureList = [];
function scanDirectory(currentDir) {
const entries = fs.readdirSync(currentDir, { withFileTypes: true });
for (const entry of entries) {
const fullPath = path.join(currentDir, entry.name);
if (entry.isDirectory()) {
scanDirectory(fullPath);
} else if (entry.isFile()) {
const ext = path.extname(entry.name).toLowerCase();
if (validExtensions.has(ext)) {
const relPath = path.relative(packRoot, fullPath);
const withoutExt = relPath.slice(0, -ext.length);
const posixPath = withoutExt.split(path.sep).join('/');
textureList.push(posixPath);
}
}
}
}
scanDirectory(texturesDir);
textureList.sort();
const outputPath = path.join(texturesDir, 'textures_list.json');
fs.writeFileSync(outputPath, JSON.stringify(textureList, null, 2) + '\n');
console.log(`Wrote ${textureList.length} entries to textures_list.json`);Which versions this applies to
Applies to all modern versions of Minecraft Bedrock Edition. This is a core resource pack feature and does not require any experimental toggles.
When it does not work
| What you see | Why | The fix |
|---|---|---|
| Newly added textures render as magenta-and-black checkerboards or invisible geometry, even though the PNG file is in the right folder and referenced properly in terrain_texture.json. | You already have a textures_list.json file in RP/textures/, and you did not add the new image path to it. When the list is present, the game does not scan the folder for unlisted files. | Either delete textures_list.json while you are still developing the pack, or regenerate the file so the new texture path is included. |
| Textures fail to load on Android, iOS, or consoles, or the Content Log reports unable to find texture, while the exact same pack works fine on Windows. | A script generated the file on a Windows machine and wrote backslashes (textures\blocks\example) or mismatched uppercase and lowercase letters. Windows file systems ignore case and accept backslashes, whereas mobile and console platforms are strictly case-sensitive and require forward slashes. | Replace all double backslashes with single forward slashes (/) in textures_list.json and verify that the casing of every folder and file name matches the disk exactly. |
| The Content Log shows a JSON parse error pointing to textures/textures_list.json on world load. | Hand-editing the list often leaves a trailing comma after the final string in the array, which is invalid in strict JSON parsers. | Remove the comma after the last item in the array, or use a script with JSON.stringify() to output valid JSON automatically. |
| Textures listed in the file are still reported as missing or fail to bind to entities. | The paths in textures_list.json include file extensions like .png or .tga, or they omit the leading textures/ folder prefix. | Strip .png, .tga, and .jpg from every string in the array, and make sure every entry starts with "textures/". |
Reference, straight from the game files
Read out of the game itself, so the ids match the version you are building for.
