NPC skins
How Minecraft skins are stored as signed texture data, how to generate that data for any image with MineSkin, and how to apply it to Citizens NPCs (a server plugin) as well as to datapack-native NPCs β the minecraft:mannequin entity and player heads.
Citizens is a server plugin (Spigot/Paper), not a data pack β its /npc commands only exist on a server running the plugin. The skin data (texture value + signature), however, is the same everywhere, so the same MineSkin output drives a Citizens NPC, a datapack mannequin, or a player_head. Where a step is plugin-only vs. vanilla/datapack is called out below.
How a Minecraft skin is stored
A skin is not an image attached to an entity β it is a profile property named textures, carried by any player-shaped thing:
valueβ a Base64-encoded JSON blob that points at a hosted skin image (ahttps://textures.minecraft.net/texture/<hash>URL) plus the model (classicorslim).signatureβ a Yggdrasil (Mojang) signature over that value. Optional in many contexts, but required whenever the server enforces secure profiles (enforce-secure-profile=true) β without it those servers fall back to the default Steve/Alex.
So "giving an NPC a custom skin" always reduces to obtaining a value + signature pair and putting it where that NPC reads its profile. MineSkin exists to produce that pair from any image.
Generating signed skins with MineSkin
MineSkin signs skins for you: upload a skin PNG (or point it at an existing skin/URL) and it returns a signed texture β the value, the signature, a textures.minecraft.net URL, and a UUID.
The MineSkin skins gallery is a large, browsable repository of already-signed skins. For a lot of NPCs you never need to make your own image: search/scroll the gallery, open a skin, and copy its ready-made URL (for Citizens --url) or its value + signature (for a mannequin/head or Citizens -t). Each gallery entry is already signed, so it drops straight into any of the steps below.
- Open mineskin.org, upload your skin image (or pick one from the gallery), and choose the model (classic / slim).
- Copy the outputs you need: the URL (easiest for Citizens'
--url), or the value + signature (for raw application to Citizens-t, mannequins, or heads).
MineSkin also has an API β POST an image and store the returned data.texture.value / data.texture.signature in a config, so a plugin or generator can set skins programmatically instead of by hand.
Applying a skin to a Citizens NPC plugin
Select the NPC (/npc select or look at it), then use one of the /npc skin forms. Easiest for a MineSkin custom skin is --url; Citizens signs and caches it for you:
# From a player's account skin
/npc skin Notch
# Always track that player's *latest* skin (lowercase L)
/npc skin Notch -l
# From an image or texture URL (MineSkin output) β recommended for custom skins
/npc skin --url https://textures.minecraft.net/texture/<hash>
# Raw signed blob (developer/console tool): uuid, value, signature
/npc skin -t <uuid> <value> <signature>
/npc skin <name>copies a real account's skin; add-lto keep following that account's updates./npc skin --url <image>takes a MineSkin (or texture) URL β the simplest path for a custom skin./npc skin -t <uuid> <value> <signature>sets the raw signed texture; it's a long blob, so run it from the console (or a command block) rather than chat. Use thevalue/signaturestraight from MineSkin.
Only player-type NPCs render a skin. Citizens stores the skin in the NPC's data so it persists across restarts; changing it re-signs/re-caches. If a skin "won't change", it's usually a stale cache β re-run with --url or restart to clear it.
Applying a skin to a datapack NPC (mannequin / head)
For vanilla, datapack-native NPCs there is no plugin β you put the same MineSkin value/signature into the minecraft:profile profile property. This works for the minecraft:mannequin entity 1.21.9+ and for player_head items:
# A mannequin wearing a MineSkin custom skin
/summon minecraft:mannequin ~ ~ ~ {profile:{properties:[
{name:"textures", value:"<base64 value from MineSkin>", signature:"<signature>"}
]}}
# A player head with the same skin (data-component form)
/give @s minecraft:player_head[profile={properties:[
{name:"textures", value:"<value>", signature:"<signature>"}
]}]
If you just want an existing account's skin (not a custom image), the short form profile:{name:"Notch"} resolves it β no MineSkin needed. MineSkin is for custom images that aren't tied to a real account.
Gotchas
- Signature vs. no signature. A
valuealone renders in most single-player/LAN contexts, but a server withenforce-secure-profile=trueneeds the matchingsignatureor it shows the default skin. Always keep the value/signature as a pair from the same MineSkin generation. - Value and signature must match. Mixing a value from one skin with a signature from another fails validation β regenerate both together.
- Model type. Slim (Alex) vs classic (Steve) is encoded in the value; pick the right one in MineSkin or arms/edges misalign.
- Citizens is server-side; mannequins are datapack. Pick the tool for your environment β the skin data is portable between them, the commands are not.
Sources
- MineSkin skins gallery and MineSkin β signed-skin generation + API.
- Citizens Wiki β Skins (the
/npc skincommand and its--url/-t/-loptions). - Mannequin entity (this Codex) and
minecraft:profilecomponent (this Codex).