Advertisement

skins.json Explained: Minecraft Bedrock Skin Pack Files

FoxyNoTail

Written by FoxyNoTail, official Minecraft Marketplace Partner (2-Tail Productions) with 140 skin packs and 336 Marketplace items.

About · YouTube

What files are in a Minecraft Bedrock skin pack?

A skin pack contains manifest.json (pack name, two UUIDs, version), skins.json (lists each skin, its geometry type, and PNG file), one or more PNG images at the root, and texts/en_US.lang (display names). An optional texts/languages.json lists supported languages. Zip the contents into a .mcpack file to import.

A Minecraft Bedrock skin pack is just a folder with a few small text files and your skin PNGs. No compiler, no build step. The game reads the JSON directly. This guide walks through every file, what each field does, and how to zip it all into a .mcpack you can double-click to import.

If you would rather skip the JSON entirely, my free Skin Pack Creator writes all of these files for you in the browser. But knowing what is inside helps when something goes wrong.

What is inside a skin pack

At the root of the pack folder you will find these files:

My_Skin_Pack/
  manifest.json
  skins.json
  fox_classic.png
  fox_slim.png
  texts/
    en_US.lang
    languages.json   (optional)
  • manifest.json tells the game what kind of pack this is, its name, and its version.
  • skins.json lists every skin in the pack, which geometry it uses, and which PNG file belongs to it.
  • One or more PNG files, the actual skin textures. They must sit at the root of the pack, not in a subfolder.
  • texts/en_US.lang, the display names the game shows in the Dressing Room.
  • texts/languages.json, optional; lists which language files are present. The official Microsoft sample works without it, so for a single-language pack you can skip it.

There is no pack_icon.png requirement for skin packs. The official Microsoft sample pack contains only manifest.json, skins.json, one PNG, and texts/en_US.lang: four files, nothing else.

Custom geometry files are not supported in skin packs. Mojang removed that ability, so every skin uses either the Classic or Slim humanoid model built into the game.

manifest.json

The manifest identifies your pack to Minecraft. Here is a minimal, valid example (the same shape as the official Microsoft sample):

{
  "format_version": 2,
  "header": {
    "name": "My Skin Pack",
    "uuid": "11111111-2222-4333-8444-555555555555",
    "version": [1, 0, 0]
  },
  "modules": [
    {
      "type": "skin_pack",
      "uuid": "66666666-7777-4888-9999-000000000000",
      "version": [1, 0, 0]
    }
  ]
}

Field by field:

  • format_version: use 2. Version 1 still works but 2 is what the current docs and sample use.
  • header.name: a readable name for the pack. It is what shows in the Dressing Room (the actual display text comes from the lang file, but this is the fallback).
  • header.uuid: a unique version-4 UUID. Generate one at uuidgenerator.net.
  • header.version: a three-number array like [1, 0, 0]. Bump it when you update the pack.
  • modules[0].type: must be exactly "skin_pack".
  • modules[0].uuid: a second, different UUID. The header and the module each need their own.
  • modules[0].version: same three-number array.

The two UUIDs must be different from each other and from any other pack on the device. Reusing a UUID that already exists will cause a conflict and the import may be silently ignored.

Advertisement

skins.json

This file lists every skin in the pack and maps each one to a PNG and a geometry type:

{
  "serialize_name": "MySkins",
  "localization_name": "MySkins",
  "skins": [
    {
      "localization_name": "FoxClassic",
      "geometry": "geometry.humanoid.custom",
      "texture": "fox_classic.png",
      "type": "free"
    },
    {
      "localization_name": "FoxSlim",
      "geometry": "geometry.humanoid.customSlim",
      "texture": "fox_slim.png",
      "type": "free"
    }
  ]
}

Top-level fields:

  • serialize_name: an identifier for the pack. The official docs recommend keeping it the same as localization_name.
  • localization_name: the key used in the lang file. Use a simple word with no spaces (e.g. MySkins). Do not reuse this value across different packs, because it affects translations.

Each entry in the skins array:

  • localization_name: a short id for this skin, used in the lang file. No spaces.
  • geometry: geometry.humanoid.custom for Classic (4-pixel arms, Steve-style) or geometry.humanoid.customSlim for Slim (3-pixel arms, Alex-style). It is case-sensitive; a typo here will break the skin.
  • texture: the exact file name of the PNG at the pack root. Must match including capitalisation and extension.
  • type: set to "free". The "paid" value is reserved for Marketplace partners and will lock the skin for everyone else.

Skins appear in the Dressing Room in the same order they are listed in this array, so put your "best" skin first if you want it on top.

texts/en_US.lang

This plain-text file gives the game the display names it shows in the Dressing Room. One key=value per line:

skinpack.MySkins=My Skin Pack
skinpack.MySkins.by=YourName
skin.MySkins.FoxClassic=Fox (Classic)
skin.MySkins.FoxSlim=Fox (Slim)

The key patterns are:

  • skinpack.<localization_name>: the pack name shown in the list.
  • skinpack.<serialize_name>.by: optional; shows the creator credit line.
  • skin.<localization_name>.<skin localization_name>: the name for each individual skin.

If the keys in this file do not match the localization_name values in skins.json exactly, the skin names will appear as raw keys (like skin.MySkins.FoxClassic) or be blank. Double-check that every id lines up.

For other languages, add more .lang files in the texts/ folder (e.g. de_DE.lang) and list them in texts/languages.json as a JSON array: ["en_US", "de_DE"]. The Microsoft sample works with just en_US.lang and no languages.json, so it is optional for a single-language pack.

Packing it as a .mcpack

To turn the folder into a file you can share or import:

  1. Select the contents of the pack folder (not the folder itself) and create a .zip archive. manifest.json must be at the very top level of the zip, not inside a wrapper folder.
  2. Rename the file from .zip to .mcpack.
  3. Double-click (or tap) the .mcpack file. Minecraft launches and imports the pack into its skin_packs folder.

If the import fails or nothing happens, the most common cause is an extra folder inside the zip. Unzip it, check that manifest.json is right at the top, re-zip the contents, and try again.

Need a starting point? Grab one of my free skin pack templates: unzip it, look at the files, and you will see the exact structure described here.

Advertisement

Updating vs making a copy

Two common situations:

  • Updating an existing pack: keep the same two UUIDs and raise the version array (e.g. [1, 0, 0] to [1, 1, 0]). Re-import the new .mcpack and the game should replace the old version.
  • Making a separate copy: generate two brand-new UUIDs so the game treats it as a different pack. The official sample README specifically warns: "Be sure to change the UUIDs in manifest.json before you try to import it again" when making a copy.

There is also a development_skin_packs folder that some editors mention, but community reports say it does not function reliably. The safe approach is to import into skin_packs and restart Minecraft after each change.

Skip the JSON: use the Skin Pack Creator

If all of this feels like more typing than you want, my Skin Pack Creator handles every file for you. You drop in your PNG skins, give the pack a name, pick Classic or Slim for each skin, and it generates manifest.json, skins.json, en_US.lang, and the final .mcpack zip, all in your browser, no upload, no account.

It also lets you import an existing pack to edit it, reorder skins, and preview them in 3-D before you download. The JSON it writes follows exactly the structure in this guide, so if you ever need to tweak it by hand, you will know where everything lives.

FAQ

Do I need a pack_icon.png?

No. The official Microsoft sample skin pack does not include one, and none of the packaging guides require it. It is not part of the skin pack format.

Can I add custom geometry (a new model) to a skin pack?

No. Mojang removed the ability to include custom geometry files in skin packs. Every skin uses either the built-in Classic (geometry.humanoid.custom) or Slim (geometry.humanoid.customSlim) humanoid model.

What PNG sizes work?

Imported custom skins accept 64×32, 64×64, or 128×128 pixel PNGs. 64×64 is the standard size used by the official sample. The PNG must be a plain indexed or true-colour PNG. No other image formats are accepted.

Why do my skin names show as "skin.MySkins.FoxClassic"?

Your en_US.lang keys do not match the localization_name values in skins.json. Make sure the pack-level id and each skin-level id are spelled identically in both files.

Can I use the same UUID in two packs?

No. Each pack needs its own unique pair of UUIDs (one for the header, one for the module). Reusing a UUID that already exists on the device will cause a conflict.

Where do imported packs get stored?

In the skin_packs folder inside com.mojang. On Windows (Microsoft Store build) that is under %localappdata%\Packages\Microsoft.MinecraftUWP_8wekyb3d8bbwe\LocalState\games\com.mojang\skin_packs. Newer GDK-based installs may use a different location, so the double-click import method is the safest way to install.

Do custom skins sync to other devices?

No. Custom .mcpack files are stored on the device you import them to. You will need to import them again on each phone or PC. Marketplace purchases, by contrast, follow your Microsoft account.

Related guides

Sources

  1. Microsoft Learn: Packaging a Skin Pack
  2. Microsoft Learn: Change Your Look: An Introduction To Skin Packs
  3. Microsoft sample skin pack
  4. Bedrock Wiki: Skin Packs
  5. Minecraft Wiki: Skin pack
Get notified about new packs

Join the Discord for update announcements, help and sneak peeks.

Join Discord
Advertisement