Guides / Commands & Data

A custom head stores a URL wrapped in base64 JSON, not an image

The profile component holds base64 of {textures:{SKIN:{url:…}}}. That is why a head's look is fixed at the moment it was made, and why the database can be tens of thousands of entries.

A custom player head does not contain a picture. It contains a texture hash, wrapped in JSON, wrapped in base64, sitting inside the item's profile component.

The layers

Starting from a hash, the command is built up like this:

1. hash        e3b0c44298fc1c149afbf4c8996fb924…
2. JSON        {"textures":{"SKIN":{"url":"http://textures.minecraft.net/texture/<hash>"}}}
3. base64      eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6…
4. component   /give @p player_head[profile={properties:[{name:"textures",value:"<base64>"}]}]

Four layers to say "this head looks like that image". The property is always named textures, and the value is always the base64 of that JSON shape.

Two things follow directly:

A head is a snapshot, not a link to a person. The URL points at an immutable texture file, not at an account. Whatever that hash resolved to when the head was made is what it will always show.

The data is tiny. A head entry is a name, a hash and some tags — no image bytes at all. That is why a catalogue can hold tens of thousands of heads as plain static JSON and still load quickly.

Why the catalogue loads by category

The database here is TheSilentPro's CC0 head collection, and it is fetched one category at a time rather than all at once. An index lists the categories and their counts; picking one fetches only that file.

That is not lazy engineering, it is the only shape that works at this size. The entire collection as a single JSON would be a large download for someone who wanted three heads from one category.

The 300-item render cap is a DOM limit, not a search limit

Results are painted at most 300 at a time. Search still runs across everything in the loaded category — the cap applies to how many get turned into DOM nodes, not how many are considered.

This distinction matters when a search says it is showing the first 300: the missing entries were found and are being withheld from the page, not excluded from the query. Narrowing the search brings them into range rather than searching harder.

Painting tens of thousands of elements at once is what the cap exists to prevent, and it is a real limit rather than a defensive round number — a grid that large stops being scrollable long before it stops being renderable.

Nothing here uploads anything

The head data is same-origin static JSON. The only third-party request is the <img> preview from mc-heads.net, which resolves a hash into a picture for display. The /give command is assembled locally from the hash, so the command works whether or not that preview loaded.

Player Head Database →

More guides

Browse all →

Looking for more Minecraft tools?

A suite of client-side generators, viewers and converters — all free, all in your browser.