
blockbench-vanilla-textures
Pull original ("vanilla") Minecraft textures from Mojang's bedrock-samples repository through the jsDelivr CDN and apply them to Blockbench models, resolving block IDs to per-face files, tinting grayscale grass/leaves/water, tiling large faces, handling flipbooks, and importing the vanilla PBR texture_set (MERS/normal). Use when the user asks for vanilla, default, original, real or Minecraft-accurate textures, names a Minecraft block or material for a model (brick wall, oak log, stone bricks, grass block, wool, glass), wants a model to match the base game, or needs a Bedrock texture name mapped to Java Edition. Works for Bedrock, Java and generic models.
Pull original ("vanilla") Minecraft textures from Mojang's bedrock-samples repository through the jsDelivr CDN and apply them to Blockbench models, resolving block IDs to per-face files, tinting grayscale grass/leaves/water, tiling large faces, handling flipbooks, and importing the vanilla PBR texture_set (MERS/normal). Use when the user asks for vanilla, default, original, real or Minecraft-accurate textures, names a Minecraft block or material for a model (brick wall, oak log, stone bricks, grass block, wool, glass), wants a model to match the base game, or needs a Bedrock texture name mapped to Java Edition. Works for Bedrock, Java and generic models.
Blockbench Vanilla Textures
Use Mojang's own texture files instead of painting or generating an imitation. Source: Mojang/bedrock-samples (resource_pack/textures/...), served by jsDelivr:
https://cdn.jsdelivr.net/gh/Mojang/bedrock-samples@<ref>/resource_pack/textures/blocks/brick.png
<ref> is main or a release tag such as v1.26.50.4. Pin a tag when results must be reproducible. The names are Bedrock names, but the pixel art matches Java Edition for almost every block, so the files also work for Java and generic models after renaming where needed.
Load blockbench-use before changing the project, and blockbench-texturing for UV details.
License: the files are © Mojang AB and covered by the Minecraft EULA. They are fine for Minecraft content, add-ons, resource packs and personal work. If the user plans to sell the model outside Minecraft or bundle the textures into a non-Minecraft asset pack, say so once and let them decide. Do not strip the attribution the manifest records.
1. Map the Request to Vanilla Blocks
Translate the subject into block IDs: a brick wall becomes brick_block, a log cabin oak_log plus oak_planks, a castle stone_bricks plus cobblestone. Ask only when a name is genuinely ambiguous ("stone" or "wood") and the choice changes the look. Otherwise pick the obvious block and state it. Block IDs resolve per-face textures, including log tops, grass tops and crafting-table fronts. Java IDs mostly work; the exceptions (bricks → brick_block, grass_block → grass, …) are in names, tints and animation.
2. Fetch
Run the bundled resolver (Node 18+ or Bun, no dependencies). Script paths are relative to this skill folder.
node scripts/vanilla_texture.mjs search brick # find IDs/keys
node scripts/vanilla_texture.mjs fetch brick_block oak_log grass --out <workspace>/textures/vanilla
node scripts/vanilla_texture.mjs fetch grass oak_leaves --carried --out <dir> # pre-tinted inventory art
node scripts/vanilla_texture.mjs fetch brick_block --pbr --out <dir> # + texture_set.json, MERS, normal
node scripts/vanilla_texture.mjs fetch entity/pig/pig --out <dir> # any path under textures/
node scripts/vanilla_texture.mjs search zombie --tree --out <dir> # entities/UI: one GitHub API call, cached
It prints and saves <out>/vanilla_manifest.json. Use these fields:
requests[].faces: Blockbench face → atlas key.requests[].atlas_keys[key].path: the file for each key.textures[]: the localfile(absolute path),width/height,format(pngortga),frames,ticks_per_frame,tint,variants, andtexture_setlayers.
Read the manifest instead of guessing file names.
A single known file needs no script:
curl -fsSLo brick.png https://cdn.jsdelivr.net/gh/Mojang/bedrock-samples@main/resource_pack/textures/blocks/brick.png
iwr https://cdn.jsdelivr.net/gh/Mojang/bedrock-samples@main/resource_pack/textures/blocks/brick.png -OutFile brick.png
Some colour textures exist only as .tga, including leaves, grass_side, cactus and ferns. A 404 on .png means you should try .tga, which the script does automatically. The jsDelivr package-listing API rejects this repository as too large, so discovery goes through blocks.json, terrain_texture.json, item_texture.json, or the GitHub tree (--tree).
Where to save: put files the model will keep in the user's asset workspace, for example textures/vanilla/, not in a temp folder. Blockbench remembers an imported file's path and can write the texture back to it when the project is saved. Never modify a downloaded file in place after importing it; write edits such as tints and tiles to new file names.
3. Prepare: Tint, Tile, Animate
Check each manifest entry before importing:
tintis set: the art is grayscale and Minecraft colors it by biome (grass top, leaves, vines, water). Either fetch with--carriedfor pre-tinted versions, or runpython scripts/tint_texture.py <in> <out> --color "#91BD59". Use--colormap <colormap/grass.png> --temperature T --downfall Dto match a biome. Pillow is required.grass_side.tga's alpha is a tint mask, not transparency. Its dirt pixels have alpha 0. Importblocks/grass_side_carriedinstead, or runtint_texture.py ... --overlay.- Large faces: vanilla scale is 16 px per block, which is 1 px per Blockbench unit. Do not stretch one 16×16 tile across a 48-unit face; it produces giant bricks. Either use one 16-unit element per block, or pre-tile the texture:
tint_texture.py brick.png brick_3x2.png --tile 3x2gives 48×32 px for a 48×32-unit face. Pre-tiling suits generic, Bedrock entity and glTF targets. Java block and item models need square 16×16 textures (a taller image is treated as a flipbook), so use one element per block there and keep the original file. frames> 1 means a vertical flipbook, such as water, lava or sea lantern. Map UVs to one frame and follow flipbook textures for playback and export metadata.
Tint colors, biome parameters and the full flipbook list are in names, tints and animation.
4. Import and Assign
- Import each file with
create_texture: name="brick", data="<absolute file path>". File paths require Blockbench desktop and load PNG and TGA. On Blockbench web, or when the file cannot be reached, pass adata:image/png;base64,...URL instead. Data URLs must be browser-decodable, so convert TGA to PNG first, for example with Pillow. Importing a path that is already loaded is refused; reuse that texture instead. For formats withper_texture_uv_size, passuv_width/uv_heightequal to the pixel size so UV coordinates are pixels. - One texture for a whole element: use
apply_texture: id=<element>, texture=<name>, applyTo="all". - Different textures per face (logs, grass, furnace, crafting table): use
set_cube_uvwithfaces: { up: { uv: [0,0,16,16], texture: "log_oak_top" }, north: { …, texture: "log_oak" }, … }, followingrequests[].faces. Useset_mesh_uvfor meshes.blocks.jsonnames the south face as the front for furnaces, pumpkins and similar blocks; rotate the element or swap faces so the front faces the viewer. - Box-UV formats (Bedrock entity, Java entity) put one texture per cube in a box layout, so separate 16×16 block tiles do not fit them directly. Switch the element to per-face UV where the format allows it, or pack the tiles into an atlas and map the faces to their rectangles.
- Transparent textures (glass, leaves, doors) need the target's cutout or blend settings. See the texturing skill.
Fetching inside Blockbench. jsDelivr sends Access-Control-Allow-Origin: *, so Blockbench can download a PNG itself when the agent has no shell, or its shell cannot reach Blockbench's file system. risky_eval awaits an expression, so wrap the code in an async IIFE that returns a data URL, then pass that URL to create_texture. Follow the repository's authorization rules for risky_eval.
(async () => {
const response = await fetch("https://cdn.jsdelivr.net/gh/Mojang/bedrock-samples@main/resource_pack/textures/blocks/brick.png");
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const blob = await response.blob();
return await new Promise(resolve => { const reader = new FileReader(); reader.onload = () => resolve(reader.result); reader.readAsDataURL(blob); });
})()
Vanilla block textures are a few hundred bytes, so the returned data URL is small. Prefer the file-path route for large entity sheets and for TGA files.
5. PBR (Optional)
Every vanilla block ships <name>.texture_set.json with <name>_mers.tga (metalness, emissive, roughness, subsurface), and some also ship _normal.tga or _heightmap.tga. Fetch with --pbr, keep the files together in the same folder, then call import_texture_set: path="<out>/blocks/brick.texture_set.json" on desktop. Follow PBR materials for assignment and export. Tinted color maps still need tinting; tint the color file and repoint the material's color channel to it.
6. Deliver for the Target Edition
| Target | What to do |
|---|---|
| Bedrock | Keep Bedrock names and paths, for example textures/blocks/brick. For custom blocks, the vanilla texture can be referenced by its terrain key instead of shipping a copy; see material instances |
| Java | Rename to the Java file name (brick.png → bricks.png, planks_oak → oak_planks) under assets/minecraft/textures/block/, or reference minecraft:block/bricks in the model JSON so the game's own texture is used. Add .png.mcmeta for flipbooks |
| Generic / glTF | Keep the pixel size and use nearest-neighbour filtering. Bake tints and tiling into the image, because no runtime will apply them |
7. Verify
- Run
list_texturesand confirm each texture's size and UV size. - Run
get_cube_uvorget_mesh_infoand confirm every face showstexture_status: "resolved"with the intended texture. - Capture a screenshot. Check brick or plank scale against a 16-unit reference, confirm tinted textures are not gray, check that transparency shows only where intended, and check that log tops sit on the ends.
Worked Example: Brick Wall
"Model a brick wall" (Generic Model; a 3×2-block wall, 4 units thick):
- Run
node scripts/vanilla_texture.mjs fetch brick_block --out ./textures/vanilla. The manifest showsblocks/brick.png, 16×16, no tint. - Run
python scripts/tint_texture.py ./textures/vanilla/blocks/brick.png ./textures/vanilla/brick_wall_3x2.png --tile 3x2to produce a 48×32 image. - Import it:
create_texture name="brick_wall_3x2" data="<abs>/textures/vanilla/brick_wall_3x2.png". Adduv_width=48, uv_height=32when the format uses per-texture UV size. - Place the cube:
from [0,0,0],to [48,32,4]. - Map every face 1 px per unit with
set_cube_uv, all usingbrick_wall_3x2:northandsouth:[0,0,48,32].upanddown:[0,0,48,4].eastandwest:[0,0,4,32].
- Run
get_cube_uvand confirm every face resolves. Capture a screenshot and check that one brick course matches a vanilla 16-unit block.
For a Java block model, build the same wall from six 16×16×4 elements. Map each one with the untouched brick texture: [0,0,16,16] on the large faces and [0,0,16,4] / [0,0,4,16] on the edges.



