Wiki 9Minecraft Wiki 9Minecraft

Resource Pack Fonts and Custom Glyphs

How to replace default fonts and add custom inline icons using 16x16 bitmap sheets.

6Sections
2Code examples
4Known errors

Minecraft Bedrock renders all in-game text and inline icons using square bitmap sprite sheets located in the resource pack's font folder. Unlike Java Edition, which routes character mapping through JSON provider definitions, Bedrock maps Unicode codepoints directly to fixed 16x16 grids on PNG files named after their hexadecimal Unicode blocks. You edit or add files in this folder when you want to restyle the game's typography or inject custom inline sprites into item tooltips, chat messages, actionbars, and Script API forms.

Font folder structure and core files

All font assets live in the RP/font/ directory of a resource pack. You do not register fonts in a manifest or blocks-style catalog file; the engine automatically scans RP/font/ on pack load and overrides matching files from the vanilla pack.

Every bitmap font sheet in Bedrock is divided into a strict 16 by 16 grid, giving 256 character slots per image. The resolution of a single cell is determined automatically by dividing the image width by 16. A 128x128 image yields 8x8 pixel characters, while a 256x256 image yields 16x16 pixel characters. The image must always have a 1:1 aspect ratio and its dimensions should be a power of two (128, 256, 512, or 1024) so the UI texture sampler does not blur or clip cell edges.

File pathWhat it doesNotes
RP/font/default8.pngPrimary ASCII bitmap fontCovers basic Latin characters, numbers, and punctuation in a 16x16 grid.
RP/font/rune.pngStandard Galactic Alphabet fontUsed by the enchanting table interface.
RP/font/glyph_XX.pngUnicode block sheet for page 0xXXXX is two uppercase hex digits (for example, glyph_E0.png covers U+E000 to U+E0FF).
RP/font/emoticons.jsonMaps text tokens to default glyph codesUsed by the vanilla game for controller button and coin icons; rarely edited in custom packs.

Replacing the base ASCII font

When the game renders basic English text, numbers, and standard punctuation, it looks up RP/font/default8.png first. Despite the number 8 in its filename, this texture does not have to be 8 pixels per cell. You can supply a 256x256 or 512x512 PNG at RP/font/default8.png to create a higher-resolution typeface.

Bedrock calculates proportional character widths dynamically by scanning each cell in default8.png from left to right. It stops at the last column that contains a pixel with an alpha value above zero, and adds a standard kerning gap after that column. Because of this automatic scanner, even a faintly visible stray pixel (such as alpha 1 out of 255) on the far right of a cell will force that letter to render with a wide blank gap after it.

Adding custom icons with Private Use Area glyphs

To add custom icons—such as custom currency badges, custom hunger shanks, or faction emblems—without overwriting readable letters across the game, you place sprites inside Unicode's Private Use Area (PUA), which runs from U+E000 to U+F8FF. In Bedrock's file naming scheme, a sheet named glyph_XX.png holds the 256 characters for the hexadecimal block XX. The row (0 through F from top to bottom) gives the third hex digit, and the column (0 through F from left to right) gives the fourth hex digit.

Wait before drawing onto glyph_E0.png or glyph_E1.png: vanilla Bedrock already uses those two sheets for controller buttons, keyboard prompts, touch screen arrows, and Minecoin symbols. Overwriting glyph_E0.png with a mostly blank sheet containing only two of your own icons will turn every controller button prompt in the user's game into invisible blank spaces. Either copy the vanilla glyph_E0.png and paint into its unused rows, or start a brand new sheet at a higher range like RP/font/glyph_E2.png (which maps to U+E200 through U+E2FF).

On custom glyph_XX.png sheets, characters are often treated as full-width icons if they contain color. If you draw an 11x11 icon in the middle of a 16x16 cell on glyph_E2.png, the game may crop the empty transparent columns and shift the icon left. To force a custom glyph to stay centered and keep a consistent 16x16 box width, place a single pixel with an alpha value of 1 (out of 255) in the top-left corner and bottom-right corner of its 16x16 cell.

Using custom glyphs in language files and scripts

Once your sprite sheet is saved at RP/font/glyph_E2.png, you reference its cells by their Unicode characters. The top-left cell (row 0, column 0) is U+E200; the cell immediately to its right (row 0, column 1) is U+E201; the first cell on the second row (row 1, column 0) is U+E210.

In JSON files—such as Rawtext inside tellraw commands, item components, or JSON UI—and in TypeScript or JavaScript files for @minecraft/server, you can write the standard Unicode escape sequence \uE200. In .lang localization files, however, backslash escapes like \uE200 are printed literally as text rather than converted into a character. For .lang files, you must copy and paste the raw UTF-8 character itself into the file and ensure the file is saved with UTF-8 encoding.

BP/scripts/display_glyphs.js
import { world } from "@minecraft/server";

// U+E200 = RP/font/glyph_E2.png (Row 0, Column 0)
// U+E201 = RP/font/glyph_E2.png (Row 0, Column 1)
const ICON_RUBY = "\uE200";
const ICON_MANA = "\uE201";

world.afterEvents.itemUse.subscribe((event) => {
  const player = event.source;
  
  // Append §r after colored text if a custom icon follows,
  // otherwise the active § color code will tint the sprite.
  player.onScreenDisplay.setActionBar(
    `${ICON_RUBY} §fRubies: §a12§r   ${ICON_MANA} §fMana: §b80/100`
  );
});

Preventing text color codes from tinting icons

Bedrock's font renderer multiplies every pixel of a glyph by the currently active formatting color. Standard white text is unaffected because multiplying by white (RGB 255, 255, 255) leaves your sprite's original colors intact. However, if a glyph appears inside an item name or chat line after a color code like §c (red) or §7 (gray), the entire RGB sprite is tinted dark red or gray.

Always insert a reset code (§r) or white code (§f) immediately before a full-color custom glyph, and then re-apply your text color code right after the glyph.

BP/items/ruby_coin.json
{
  "format_version": "1.20.50",
  "minecraft:item": {
    "description": {
      "identifier": "wiki:ruby_coin",
      "menu_category": {
        "category": "items"
      }
    },
    "components": {
      "minecraft:icon": {
        "texture": "ruby_coin"
      },
      "minecraft:display_name": {
        "value": "§r\uE200 §dRuby Coin"
      }
    }
  }
}

Using the smooth TTF font in JSON UI

In addition to bitmap grids, Bedrock includes a TrueType font used when the 'Smooth Font' toggle is enabled in language settings or when requested by a custom JSON UI screen. In JSON UI text elements, you can select between font styles using the font_type property.

Keep in mind that switching a JSON UI label to smooth font only alters standard text glyphs; inline PUA icons from glyph_XX.png still render from their bitmap sheets alongside the smooth text.

font_type valueWhat it doesNotes
defaultStandard pixelated bitmap fontReads from default8.png and glyph_XX.png.
smoothHigh-resolution TrueType fontClean vector-style text used in modern UI panels.
runeEnchanting table alphabetReads from RP/font/rune.png.
MinecraftTenBlocky display title fontUsed for bulky headers on menus and store screens; supports limited characters.

Which versions this applies to

Applies to all stable Minecraft Bedrock versions (1.16.0 through 1.21+). No experimental toggles are required to override fonts or add glyph_XX.png sheets.

When it does not work

What you seeWhyThe fix
Controller buttons, touch d-pad arrows, or Minecoin icons disappear across the entire game UI.You placed a new, mostly blank glyph_E0.png or glyph_E1.png in RP/font/. Bedrock does not merge individual transparent cells with the vanilla sheet underneath; your file completely replaces the vanilla sheet.Move your custom icons to an unused sheet such as RP/font/glyph_E2.png (U+E200–U+E2FF), or copy the full vanilla glyph_E0.png / glyph_E1.png texture into your pack and only edit the blank slots.
A custom icon renders as a dark, muddy silhouette or takes on the color of the surrounding text.A formatting code (like §7 in lore or §e on an item name) is active before the glyph character, causing the renderer to multiply the sprite's RGB values by that color.Place §r or §f immediately before the glyph character to reset the vertex tint to pure white, then place your desired § color code after the glyph.
The literal text '\uE200' appears on screen instead of the icon when reading from a .lang file.Bedrock's .lang parser does not evaluate JSON-style \uXXXX hexadecimal escape sequences.Copy the actual UTF-8 character for U+E200 (it will look like a blank box or placeholder icon in your code editor) and paste it directly into the .lang file, saving the file as UTF-8.
Letters or icons have neighbouring pixels bleeding into their edges, or all characters look shifted and scrambled.The PNG dimensions are not a 1:1 square power of two (such as 256x256 or 512x512), or the artwork was drawn on a grid that does not divide evenly into 16 rows and 16 columns.Resize the canvas to an exact power-of-two square (256x256 gives 16x16 pixels per cell) and ensure every glyph stays strictly inside its cell boundaries.

Reference, straight from the game files

Read out of the game itself, so the ids match the version you are building for.