minecraft-resource-pack-3fe8c3 — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited minecraft-resource-pack-3fe8c3 (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A resource pack is a folder (or .zip) that overrides or adds Minecraft's visual and audio assets: textures, models, sounds, language files, fonts, and shaders. No Java or mod loader required. Works on vanilla clients and servers.
Use when: the deliverable is visual/audio assets (textures, models, sounds, fonts, shaders) in resource-pack format.Do not use when: the task requires gameplay logic or runtime behavior changes (use minecraft-datapack, minecraft-plugin-dev, or minecraft-modding).Do not use when: the task is server infrastructure/runtime administration (minecraft-server-admin).| Minecraft Version | Preferred pack metadata |
|---|---|
| 1.21 / 1.21.1 | pack_format: 34 |
| 1.21.2 / 1.21.3 | pack_format: 42 |
| 1.21.4 | pack_format: 46 |
| 1.21.5 | pack_format: 55 |
| 1.21.6 | pack_format: 63 |
| 1.21.7 / 1.21.8 | pack_format: 64 |
| 1.21.9 / 1.21.10 | min_format: [69, 0], max_format: [69, 0] |
| 1.21.11 | min_format: [75, 0], max_format: [75, 0] |
Use pack_format through 1.21.8. Starting in 1.21.9, pack.mcmeta switches to min_format / max_format instead of the older single-number field. For exact patch targeting, use [major, minor] arrays for both min_format and max_format, including .0 versions such as [75, 0]. A single integer is equivalent to [major, 0] for min_format, while a single integer in max_format allows any minor version on that major line. Do not write decimal JSON numbers.
my-pack/
├── pack.mcmeta
├── pack.png ← 64×64 icon (optional)
└── assets/
└── minecraft/ ← override vanilla (or <namespace>/ for new packs)
├── models/
│ ├── block/
│ │ └── stone.json
│ └── item/
│ └── diamond_sword.json
├── items/ ← 1.21.4+ item model definitions
│ └── diamond_sword.json
├── blockstates/
│ └── stone.json
├── textures/
│ ├── block/
│ │ └── stone.png
│ ├── item/
│ │ └── diamond_sword.png
│ ├── gui/
│ │ └── sprites/
│ │ └── my_sprite.png
│ └── entity/
│ └── zombie/
│ └── zombie.png
├── sounds/
│ └── custom/
│ └── my_sound.ogg
├── sounds.json
├── font/
│ └── default.json
├── lang/
│ └── en_us.json
├── shaders/ ← core shader overrides (advanced)
└── optifine/ ← OptiFine CIT / CTM (OptiFine only)
└── cit/
└── my_item.propertiespack.mcmeta{
"pack": {
"pack_format": 64,
"description": "My Custom Resource Pack v1.0"
}
}{
"pack": {
"min_format": [69, 0],
"max_format": [69, 0],
"description": "My Custom Resource Pack v1.0"
}
}{
"pack": {
"min_format": [75, 0],
"max_format": [75, 0],
"description": "My Custom Resource Pack v1.0"
}
}assets/minecraft/models/block/my_cube.jsonFull cube — all six faces use the same texture:
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "minecraft:block/stone"
}
}Column block (like logs):
{
"parent": "minecraft:block/cube_column",
"textures": {
"end": "mypack:block/my_pillar_top",
"side": "mypack:block/my_pillar_side"
}
}Different sides:
{
"parent": "minecraft:block/cube",
"textures": {
"up": "mypack:block/my_block_top",
"down": "mypack:block/my_block_bottom",
"north": "mypack:block/my_block_side",
"south": "mypack:block/my_block_side",
"east": "mypack:block/my_block_side",
"west": "mypack:block/my_block_side",
"particle": "mypack:block/my_block_side"
}
}Cross model (flowers, plants):
{
"parent": "minecraft:block/cross",
"textures": {
"cross": "mypack:block/my_flower"
}
}{
"credit": "Custom model",
"ambientocclusion": true,
"textures": {
"0": "mypack:block/panel",
"particle": "mypack:block/panel"
},
"elements": [
{
"from": [0, 0, 7],
"to": [16, 16, 9],
"faces": {
"north": { "texture": "#0", "uv": [0, 0, 16, 16] },
"south": { "texture": "#0", "uv": [0, 0, 16, 16] }
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
}
}
}fromandtoare in 1/16th block units (0–16).uvis[x1, y1, x2, y2]in 0–16 units.
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "mypack:item/my_item"
}
}{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "mypack:item/my_sword"
}
}{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "minecraft:item/leather_helmet",
"layer1": "minecraft:item/leather_helmet_overlay"
}
}Each predicate entry routes to a different model based on custom_model_data:
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "minecraft:item/stick"
},
"overrides": [
{ "predicate": { "custom_model_data": 1001 }, "model": "mypack:item/magic_wand" },
{ "predicate": { "custom_model_data": 1002 }, "model": "mypack:item/fire_staff" }
]
}In 1.21.4, Mojang introduced a new item model system. Place model definitions at assets/<namespace>/items/<item_name>.json:
{
"model": {
"type": "minecraft:select",
"property": "minecraft:custom_model_data",
"fallback": {
"type": "minecraft:model",
"model": "minecraft:item/stick"
},
"cases": [
{
"when": 1001,
"model": { "type": "minecraft:model", "model": "mypack:item/magic_wand" }
}
]
}
}{
"variants": {
"": { "model": "mypack:block/my_block" }
}
}{
"variants": {
"facing=north": { "model": "mypack:block/my_block" },
"facing=south": { "model": "mypack:block/my_block", "y": 180 },
"facing=east": { "model": "mypack:block/my_block", "y": 90 },
"facing=west": { "model": "mypack:block/my_block", "y": 270 }
}
}{
"variants": {
"": [
{ "model": "minecraft:block/grass_block", "weight": 3 },
{ "model": "minecraft:block/grass_block_2" }
]
}
}{
"multipart": [
{ "apply": { "model": "mypack:block/my_slab_bottom" }, "when": { "type": "bottom" } },
{ "apply": { "model": "mypack:block/my_slab_top" }, "when": { "type": "top" } },
{ "apply": { "model": "mypack:block/my_block" }, "when": { "type": "double" } }
]
}assets/<namespace>/textures/block/assets/<namespace>/textures/item/.png extension in JSONassets/minecraft/textures/block/fire_0.png.mcmeta:
{
"animation": {
"frametime": 2,
"frames": [0, 1, 2, 3, 4, 5, 6, 7]
}
}If frames is omitted, all frames play sequentially. frametime is in game ticks (default 1).
Place sprites at assets/minecraft/textures/gui/sprites/<category>/<name>.png. Reference them with <category>/<name> in code/JSON.
assets/minecraft/sounds.json{
"my_sound.play": {
"sounds": [
{ "name": "mypack:custom/my_sound", "volume": 1.0, "pitch": 1.0, "weight": 1 },
{ "name": "mypack:custom/my_sound_alt", "weight": 2 }
],
"category": "players"
},
"entity.player.levelup": {
"replace": true,
"sounds": [
{ "name": "mypack:custom/levelup_replaced", "volume": 0.75, "pitch": 1.0 }
]
}
}assets/<namespace>/sounds/ as .ogg files (Vorbis encoded)"replace": true to replace vanilla sounds instead of adding to themmaster, music, record, weather, block, hostile, neutral, player, ambient, voiceassets/minecraft/lang/en_us.json:
{
"block.mypack.my_block": "My Custom Block",
"item.mypack.my_item": "Magic Wand",
"entity.mypack.my_mob": "Forest Guardian",
"death.attack.mypack.laser": "%1$s was zapped by %2$s"
}fr_fr.json, de_de.json)en_us.json as the primary fallbackassets/minecraft/font/default.json — add glyph{
"providers": [
{
"type": "bitmap",
"file": "mypack:font/icons.png",
"ascent": 8,
"height": 9,
"chars": ["\uE000", "\uE001", "\uE002"]
}
]
}Custom icons via private use area (U+E000–U+F8FF). Reference in text with \uE000. The icons.png must have each character cell height pixels tall.
OptiFine-only feature. Does not work in vanilla or Iris.
assets/minecraft/optifine/cit/my_sword.propertiestype=item
items=minecraft:diamond_sword
texture=my_sword_texture.png
model=my_sword_model
nbt.display.Name=ipattern:*Excalibur*Common CIT properties:
type=item — item texture overridetype=enchantment — custom enchantment glinttype=armor — armor overlayitems= — comma-separated item IDsdamage= — damage range (e.g., 0-50%)nbt.display.Name=ipattern:*text* — NBT name filtertexture= — PNG file (relative to .properties file)model= — JSON model file (relative)Iris shaders live inside a resource pack at:
assets/iris/
shaders/
core/
rendertype_terrain.vsh ← vertex shader override
rendertype_terrain.fsh ← fragment shader overrideFull shader pack distribution uses the .zip format with a shaders/ root folder (not inside assets/). Resource pack shader overrides target specific render types.
# Singleplayer: place in
~/.minecraft/resourcepacks/my-pack/
# or
~/.minecraft/resourcepacks/my-pack.zip
# Server-side (forces on clients):
# Set in server.properties:
resource-pack=https://example.com/my-pack.zip
resource-pack-sha1=<sha1 hash>
resource-pack-prompt={"text":"Required pack","color":"gold"}| Problem | Cause | Fix |
|---|---|---|
| Model not showing | Wrong JSON path or syntax error | Check assets/<namespace>/models/ path; validate JSON |
| Black/pink checkerboard | Texture path wrong or missing | Check textures/ path, file extension not in JSON |
| Blockstate not applying | Wrong state property name | Match exact property names from /blockdata |
| Animation not working | Wrong MCMETA location | Must be same folder as texture, named texture.png.mcmeta |
| Custom sound not playing | Not in sounds.json | Register sound event in sounds.json, match namespace |
| Pack not loading | Wrong pack_format or min_format / max_format values | Update pack.mcmeta for the exact 1.21.x patch |
Use the bundled validator script before shipping a resource-pack update:
# Run from the installed skill directory (for example `.claude/skills/minecraft-resource-pack`):
./scripts/validate-resource-pack.sh --root /path/to/resource-pack
# Strict mode treats warnings as failures:
./scripts/validate-resource-pack.sh --root /path/to/resource-pack --strictWhat it checks:
pack.mcmeta and assets/**/*.json*.png.mcmeta has a matching *.png~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.