3DS - System Font Customization Guide
A guide for customizing the system-wide font on the Nintendo 3DS.
Custom system font shown in this screenshot is "Pop Happiness".
Download the custom system fonts here
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 and can be restored by re-installing the original system font, instead of restoring a NAND backup.
To restore the system font, see the
restore section.
Never uninstall CFW while any modded system files are installed, doing so will brick the console! A
DS flashcart with ntrboot
is required to re-install B9S.
Modified system files are not signed which they don't work on the original firmware, as the signature check fails.
If you wanna uninstall CFW before selling your console, you must restore the system files first, then follow the
CFW uninstallation instructions.
What You Need:
-
A font you want to install on a 3DS (TTF or OTF)
-
CTR Font Converter (Legal Edition)
-
Python (version 3+)
-
FontTool (tweaked to work with Python 3)
-
Lime3DS emulator (for previewing the custom system font)
-
At least 1080p of screen resolution (needed for CTR Font Converter)
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 is faster than the GUI method. If the CLI method does not work for you, go to the GUI method section.
Method 1: FontForge + Python script
The example custom system font used in this section is PopHappiness.ttf
.
-
Go to the Wii U System Font Replacer plugin repository.
-
Download a Python script:
merge-fonts.py
-
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)
-
-
Launch the Terminal app by right-clicking on File Explorer’s empty space and clicking
Open in Terminal
. -
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
. -
On a File Explorer window, open the merged font file and install it.
Continue to the Generating the Custom System Font section.
Method 2: FontForge only
-
Launch FontForge.
-
Open the custom font file (TTF/OTF).
-
Go to
Element
→Font Info...
→General
. -
Set the
Em Size
value to1000
and clickOK
. The custom font size will be adjusted so it matches the 3DS font size. Skip if em size is already 1,000. -
Go to
View
→Goto
, inputU+E000
into the text box to jump to the Private Use Area block. -
If the custom font contains any non-3DS glyphs in the PUA block, go to
File
→Execute 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. -
Go to
Element
→Merge Fonts...
and select the 3DS font file. -
Click
Yes
when prompted to retain kerning info. -
Go to
File
→Generate Fonts...
. -
Pick
TrueType
in the combo-box, uncheckValidate Before Saving
, then clickGenerate
. -
On a File Explorer window, open the merged font file and install it.
Generating the Custom System Font
-
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.
-
-
Go to the
Windows Font
tab and select a recently installed font. -
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.
-
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
System
→Display
→Scale & layout
, and temporarily set theScaling
value to100%
.
-
-
Activate the
Use filter
check-box, clickSelect file
, go to thexllt
folder and select the3ds_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.
-
Go to the
bcfnt / bcfna
tab. -
Save the font file as
SystemFont.bcfnt
to theFontTool
folder. -
Click
Convert
.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 theInstall
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.
-
-
Go to the
FontTool
folder. -
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
.
Previewing the Custom System Font on Lime3DS
You can preview the custom system font on Lime3DS emulator before installing it to a 3DS.
AES Keys are required to load encrypted contents on Lime3DS.
Follow the instructions for
dumping keys from a real 3DS.
The installation process also works with Citra emulator.
-
Launch Lime3DS emulator. If the system firmware is already installed, skip to step 6.
-
Go to
Emulation
→Configure...
→System
. -
Under the
3GX Plugins Loader
options, pick the system model and system region, then clickDownload
. -
Wait for the system firmware download to complete.
-
Close the configuration window.
-
Go to
File
→Install CIA...
. -
Select the generated CIA file.
-
Launch any of the system apps and see how the custom system font looks.
If the font size is too big/small, repeat the Generating the Custom System Font section and try a different font size until you get it right.
Installing the Custom System Font to 3DS
-
Add the generated CIA file to the SD Card.
-
Launch GodMode9.
-
Browse and select the CIA file.
-
Select
CIA image options...
→Install game image
.- CIA files are encrypted by default, so there’s no need to re-encrypt it.
-
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.
Restoring the System Font
-
Download the original system font.
-
Add the
SystemFont.cia
file to the SD Card. -
Launch GodMode9.
-
Browse and select the
SystemFont.cia
file. -
Select
CIA image options...
→Install game image
. -
Reboot the console.
The system font has been restored.
To restore the system font on Lime3DS, go to File
→ Install CIA...
and select the SystemFont.cia
file.
Tools Used
FontTool by astronautlevel2 & ihaveamac
3dstool by dnasdw
make_cia by Tiger21820 & 3DSGuy