A guide for customizing the system-wide font on the Nintendo 3DS.


System Settings with a custom system font "Pop Happiness".
Download the custom system fonts here

Table of Contents

Getting Started

Luma3DS custom firmware is required to use the mod. Install CFW if you haven't already.

Create a NAND backup before modifying any system files! Modifying the system font is safe since Boot9Strap provides brick protection, allowing recovery with GodMode9. If you messed up and the Home Menu fails to launch, use GodMode9 to restore the system font.

Never uninstall CFW while any modded system files are installed, doing so will remove Boot9Strap and fully brick the console! If you fully bricked your console, you'll need a DS flashcart with ntrboot to re-install Boot9Strap to unbrick your console.

Why install patched CIA file instead of LayeredFS?

The method to install a custom system font is installing a .cia file which replaces a system file. I tried a safer method; LayeredFS, a Luma3DS feature that redirects games assets to modded assets files in the SD Card without patching the ROMs directly, but it currently doesn't work with a system font, so we have to modify a system file instead.

What You Need:

Recommended OS: Windows 10 or 11 - FontTool is not compatible with Linux

Merging the Fonts

A 3DS font will be merged into a custom system font so the icon glyphs are preserved.

There are 2 ways to merge the fonts: CLI & GUI

The CLI method involves in using a Python script that calls the FontForge program to merge the fonts automatically, while the GUI method involves in using FontForge itself to merge the fonts manually.

The CLI method process is shorter than the GUI method. If the CLI method does not work for you, try the GUI method instead.

  1. Go to the Wii U System Font Replacer plugin repository.

  2. Download a Python script: merge-fonts.py

  3. Place those 3 files in a folder:

    • merge-fonts.py

    • 3DS font - nintendo_NTLG-DB_001.ttf

    • A custom font - PopHappiness.ttf (OTF also works)

  4. Launch the Terminal app by right-clicking on File Explorer's empty space and clicking Open in Terminal.

  5. Input this command (pick one):

    PowerShell:

    & 'C:\Program Files (x86)\FontForgeBuilds\bin\fontforge.exe' merge-fonts.py PopHappiness.ttf nintendo_NTLG-DB_001.ttf PopHappiness_Merged.ttf

    Command Prompt (CMD):

    "C:\Program Files (x86)\FontForgeBuilds\bin\fontforge.exe" merge-fonts.py PopHappiness.ttf nintendo_NTLG-DB_001.ttf PopHappiness_Merged.ttf

    Those are single line commands - they are wrapped so the whole commands are displayed for easy copy without horizontally scrolling.

    The fonts have been merged as PopHappiness_Merged.ttf.

  6. On a File Explorer window, open the merged font file and install it.

  1. Launch FontForge.

  2. Open the custom font file (TTF/OTF).

  3. Go to ElementFont Info...General.

  4. Set the Em Size value to 1000 and click OK. The custom font size will be adjusted so it matches the 3DS font size. Skip if the em size is already 1,000.

  5. Go to ViewGoto, input U+E000 into the text box to jump to the Private Use Area block.

  6. If the custom font contains any non-3DS glyphs in the PUA block, go to FileExecute Script, input this code into the text box:

    fontforge.activeFont().selection.select(("ranges", None), 0xE000, 0xE07E)
    fontforge.activeFont().clear()
    

    and click OK. This will clear out all the non-3DS glyphs in this block.

  7. Go to ElementMerge Fonts... and select the 3DS font file.

  8. Click Yes when prompted to retain kerning info.

  9. Go to FileGenerate Fonts....

  10. Pick TrueType in the combo-box, uncheck Validate Before Saving, then click Generate.

  11. On a File Explorer window, open the merged font file and install it.

Generating the Custom System Font

  1. Launch CTR Font Converter.

    • A dialog will say that .NET Framework 3.5 isn’t installed, click “Download and install this feature”.

    • Wait for the download to complete, then relaunch that app.

  2. Go to the Windows Font tab and select a recently installed font.

  3. Set the font size - start with 20px.

    • If the font size is too big/small after installing to a 3DS, come back to it and try a different font size until you get it right.
  4. Set the bit depth to 16 levels (A4).

    • This option is not accessible if your screen resolution is lower than 1080p as the Input and Output sections do not have scroll bars.

    • If you’re on a laptop and the screen resolution is 1080p with high DPI scaling, launch Settings, go to SystemDisplayScale & layout, and temporarily set the Scaling value to 100%.
  5. Activate the Use filter check-box, click Select file, go to the xllt folder and select the 3ds_bitmap_font_std.xllt file.

    • This will clear out all the glyphs not used in 3DS games/apps, reducing the font file size. Max file size for compressed BCFNT file (after running FontTool) is 1.5 MiB.
  6. Go to the bcfnt / bcfna tab.

  7. Save the font file as SystemFont.bcfnt to the FontTool folder.

  8. Click Convert.


    Click the screenshot for full view.

    Note: The preview section has a different result depending on where the font is installed:

    • The corresponding font is displayed if that font is installed to C:\Windows\Fonts (right-click on a TTF file → Install for all users)

    • Otherwise a Windows system font is displayed if that font is installed to %LocalAppData%\Microsoft\Windows\Fonts (click the Install button on Windows Font Viewer)

    This does not affect the custom font file generation, you can install a TTF font to whichever Fonts folder you want.

  9. Go to the FontTool folder.

  10. Launch the Terminal app by right-clicking on File Explorer’s empty space and clicking Open in Terminal. Input this command:

    python FontTool.py -font SystemFont.bcfnt
    

    or launch convert-system-font.cmd.

    The SystemFont.cia file has been generated.

    Rename SystemFont to match the actual font name, in this case: PopHappinessFont.cia.

    If you want to install it to Azahar emulator, launch compress-bcfnt-file.cmd and the font file will be compressed as SystemFont.bcfnt.lz.

Installing the Custom System Font

GodMode9 v2.0.0 or higher is required to install .cia files. Get the latest version of GodMode9 here.

  1. Add the generated CIA file to the SD Card.

  2. Launch GodMode9.

  3. Browse and select the CIA file.

  4. Select CIA image options...Install game image.

    • CIA files generated by FontTool are already encrypted, so there's no need to re-encrypt it.

  5. Reboot the console.

The custom system font has been installed!


The button glyphs should be preserved.
The ZL/ZR/C-Stick/Start glyphs are part of the game's digital manual, not the system font.

You can also install the custom system font to Azahar emulator.

The system files need to be installed to a virtual NAND before continuing. Follow the instructions for setting up system files on an emulator. A real 3DS is required.

  1. Rename the compressed font file to cbf_std.bcfnt.lz.

  2. Launch Azahar.

  3. Go to FileOpen Azahar Folder.

  4. Navigate to /load/mods/0004009B00014002/romfs. Create folders if those don't exist.

  5. Add the cbf_std.bcfnt.lz file here.

  6. Launch the Home Menu by going to FileBoot Home MenuEUR/USA/JPN.

The custom system font has been installed!


The button glyphs should be preserved.
The ZL/ZR/C-Stick/Start glyphs are part of the game's digital manual, not the system font.

Restoring the System Font

  1. Download the original system font.

  2. Add the SystemFont.cia file to the SD Card.

  3. Launch GodMode9.

  4. Browse and select the SystemFont.cia file.

  5. Select CIA image options...Install game image.

  6. Reboot the console.

The system font has been restored.

  1. Launch Azahar.

  2. Go to FileOpen Azahar Folder.

  3. Navigate to /load/mods/0004009B00014002/romfs.

  4. Delete or rename the cbf_std.bcfnt.lz file.

  5. Launch the Home Menu by going to FileBoot Home MenuEUR/USA/JPN.

The system font has been restored.

Tools Used

FontTool by astronautlevel2 & ihaveamac

3dstool by dnasdw

make_cia by Tiger21820 & 3DSGuy