Building
Icons
An icon is a bitmap glyph bound to a character. Type that character anywhere Minecraft renders text (chat, signs, books, item names, holograms) and your image appears inline. It's how server icons, custom emotes and inline UI symbols are done.
Sizes#
Four presets, plus a custom height up to 256. The choice is about line height rather than quality:
| Size | Behaviour |
|---|---|
| 8px | Sits flush inside one line of text. The only size guaranteed not to spill |
| 12px | The default for chat: a readable icon with ascent 9 |
| 16px | Deliberately oversized; overlaps the lines above and below |
| 32px | Much more so |
Minecraft's line pitch is about 9 pixels and the renderer does not reflow line spacing for taller glyphs. So 16 and 32 aren't bugs to be worked around; they're the Discord-style "big emoji" effect, and they overlap on purpose.
Start with the 12px default for chat. Use 8px when an icon must stay strictly inside one line, and reach for 16px or 32px when the glyph is the message.
Characters#
Glyphs are assigned to codepoints in Unicode's Private Use Area
(U+E000–U+F8FF), the block reserved for exactly this, so your glyph can
never collide with a real character someone might type.
Practically: you copy the character out of the Studio and paste it wherever you need it. It looks like a blank box everywhere except in a client with your pack loaded, which is expected.
On our test server, /sidebar, /title,
/actionbar and /bossbar take arbitrary text; paste a glyph into one to
see how it sits against real UI text rather than only in chat.
Making one#
Describe the icon and generate it ("a coin", "a crossed sword and shield", "a lightning bolt"), then finish it in the pixel editor. Uploading a PNG or starting from blank works too. Source art is capped at 256×256 before it's fitted to the size you chose.
Glyphs are pixel art at small sizes, and legibility falls off a cliff below about 6 pixels of actual detail. Silhouette first, detail second, the same rule as a 16×16 block texture.
Seeing it in game#
Sync the pack, then paste the character somewhere the game draws text. Nothing has to be placed, given or triggered: a glyph is live the moment a player has the pack, in every message anyone sends.
That also makes icons the one asset kind you can test without touching the
world at all. On our test server, /sidebar, /title,
/actionbar and /bossbar take arbitrary text.
A plugin sends one the same way it sends any other message:
// The character is copied from the icon's page in the Studio.
player.sendMessage(Component.text(" Quest complete"));Exporting#
An icon is two things in the .zip:
assets/minecraft/textures/font/<name>.png
assets/minecraft/font/default.jsonThe PNG is the artwork; default.json is the font provider, which binds
each image to its character and records the height and ascent that decide how
the glyph sits on a line. Every icon in the pack shares that one file, which is
why nothing here is per-icon.
Because it extends the default font rather than replacing it, ordinary text keeps rendering normally. A player without the pack sees a blank box where the character is, which is Minecraft's ordinary behaviour for a codepoint it has no glyph for.
Characters are allocated per pack
An icon copied into another pack usually keeps its character, but takes a new one if that pack has already spent it. Re-copy the character from the icon's page after moving it rather than reusing the old one.
On Bedrock#
Glyphs don't convert. Bedrock's font handling isn't Java's provider format, so an icon is a Java-only asset.