A practical guide to creating complete saber themes on Crystal Focus X, including folder structure, per-theme fonts, config overrides, menu previews, and how theme switching works.
theme_prefs.txtconfig.txt, colors.txt, prefs.txt, special.txttheme.bmp, theme.wavA theme is a self-contained saber personality that lives in a single folder on the SD card. It bundles together sound fonts, blade colors, accent LED sequences, pixel animations, display graphics, audio tracks, and configuration files into one package.
Without themes, all of these pieces live at the SD card root and apply globally. With themes, you can build multiple complete saber identities and switch between them on the fly, such as a Jedi theme and a Sith theme.
Important: Themes are completely optional. If you never set one up, the CFX keeps using the traditional root-level files exactly as before.
When a theme is active, the CFX redirects almost every important file path into the theme folder instead of reading from the SD card root. That includes configs, display assets, accents, GraFx sequences, VU meter art, UI sounds, tracks, and more.
Sound fonts also live inside the theme folder, so each theme has its own independent set of fonts.
Switching themes causes the saber to fully reboot. This is normal. A theme changes so many things at once that a clean restart is the safest way to load everything correctly.
Theme folders sit at the root of the SD card and follow a strict naming pattern:
<number>-<name>
0-Jedi
1-Sith
2-Mandalorian
3-MyCustomTheme
Tip: Keep theme folder names short and avoid spaces or unusual special characters.
A theme folder mirrors the structure you would normally have at the SD card root.
1-Sith/
├── config.txt
├── colors.txt
├── prefs.txt
├── special.txt
├── theme.bmp
├── theme.wav
│
├── 1-DarkLord/
│ ├── font_config.txt
│ ├── boot.wav
│ ├── hum.wav
│ ├── clash1.wav
│ ├── ...
│ ├── crystal.bmp
│ ├── bladeon.bmp
│ └── bladeoff.bmp
│
├── 2-Emperor/
│ ├── font_config.txt
│ ├── hum.wav
│ └── ...
│
├── tracks/
│ ├── track1.wav
│ └── ...
│
└── extra/
├── UI/
│ ├── font.wav
│ ├── font.bmp
│ ├── themeswitch.wav
│ └── ...
├── PLI/
├── GRAFX/
├── ACCENTS/
├── PIXIES/
├── VUMETER/
│ └── vumeter.bmp
├── SCSV/
├── IDs/
├── OBJ/
│ └── display.obj
├── accent0.bmp
├── accent1.bmp
├── crystal.bmp
├── bladeon.bmp
└── bladeoff.bmp
Font folders inside a theme use the same naming convention as normal root-level fonts: <number>-<name>. When a theme is active, the CFX scans only the theme folder for fonts. Root-level fonts are ignored.
For crystal.bmp, bladeon.bmp, and bladeoff.bmp, the CFX uses a two-step lookup:
1-Sith/2-Emperor/crystal.bmp1-Sith/extra/crystal.bmpThis lets you provide theme-wide default OLED assets while still allowing individual fonts to override them.
accent0.bmp, accent1.bmp, and display.obj are always loaded from the theme’s extra/ folder.
| Resource | Default Location | Themed Location |
|---|---|---|
| UI sounds & graphics | extra/UI/ | <theme>/extra/UI/ |
| PLI graphics | extra/PLI/ | <theme>/extra/PLI/ |
| GraFx animations | /extra/GRAFX/ | <theme>/extra/GRAFX/ |
| Accent LED sequences | /extra/ACCENTS/ | <theme>/extra/ACCENTS/ |
| Pixel accent animations | /extra/PIXIES/ | <theme>/extra/PIXIES/ |
| VU meter folder | /extra/VUMETER/ | <theme>/extra/VUMETER/ |
| Screen savers | extra/SCSV/ | <theme>/extra/SCSV/ |
| NFC identity sounds | extra/IDs/ | <theme>/extra/IDs/ |
| Audio tracks | tracks/ | <theme>/tracks/ |
| Preferences | prefs.txt | <theme>/prefs.txt |
| Configuration | config.txt | <theme>/config.txt |
| Color profiles | colors.txt | <theme>/colors.txt |
| Special settings | special.txt | <theme>/special.txt |
| Sound fonts | Root-level font folders | Font folders inside <theme>/ |
Important: A theme’sconfig.txtcompletely replaces the rootconfig.txt. There is no merging. The same applies toprefs.txt,colors.txt, andspecial.txt.
font_config.txt stays per-font. It is always read from the individual font folder.
theme_prefs.txt Filetheme_prefs.txt lives at the root of the SD card and tells the CFX which theme to load at boot.
bank=1
The number after bank= matches the number prefix of the theme folder. For example, bank=1 loads 1-Sith/.
You normally do not edit theme_prefs.txt by hand. It is written automatically when you select a theme through the vocal menu or via serial. If you delete it, the saber boots without any theme active and goes back to root-level files.
If the CFX detects at least one valid theme folder, a Theme entry appears automatically in the vocal menu.
theme.bmp while you browse.theme.wav plays as a preview while you browse.When you confirm a selection, the saber writes the new bank=N value to theme_prefs.txt, plays the theme switching sound, and then reboots.
selecttheme=N
This writes theme_prefs.txt and reboots, just like the menu does.
dirthemes
This prints all detected theme folders and their index numbers.
theme_prefs.txt from the SD root.N-.config.txt, prefs.txt, colors.txt, and special.txt are loaded from the theme.If theme_prefs.txt does not exist or contains an invalid value, the saber boots without a theme and uses root-level files as normal.
0-Jedi
0-Jedi/
├── config.txt
├── colors.txt
├── prefs.txt
└── special.txt
0-Jedi/
├── 1-Guardian/
│ ├── font_config.txt
│ ├── boot.wav
│ ├── hum.wav
│ └── ...
└── 2-ConsularSage/
├── font_config.txt
├── hum.wav
└── ...
0-Jedi/
└── extra/
├── UI/
├── PLI/
├── GRAFX/
├── ACCENTS/
├── PIXIES/
└── ...
0-Jedi/
├── theme.bmp
└── theme.wav
0-Jedi/
└── tracks/
├── track1.wav
└── track2.wav
theme_prefs.txt at the SD root with bank=0, orSD Card Root/
├── theme_prefs.txt
│
├── 0-Jedi/
│ ├── config.txt
│ ├── colors.txt
│ ├── prefs.txt
│ ├── theme.bmp
│ ├── theme.wav
│ ├── 1-Guardian/
│ ├── 2-Sentinel/
│ ├── tracks/
│ └── extra/
│ ├── UI/
│ ├── GRAFX/
│ └── ACCENTS/
│
├── 1-Sith/
│ ├── config.txt
│ ├── colors.txt
│ ├── prefs.txt
│ ├── theme.bmp
│ ├── theme.wav
│ ├── 1-DarkLord/
│ ├── 2-Emperor/
│ ├── tracks/
│ └── extra/
│ ├── UI/
│ ├── GRAFX/
│ └── ACCENTS/
│
└── 2-Mandalorian/
├── config.txt
├── prefs.txt
├── theme.bmp
├── theme.wav
├── 1-Whistling/
└── extra/
└── ACCENTS/
Each theme is fully independent. Switching between them swaps everything at once.
You do not have to override everything. A minimal theme only needs:
config.txtEverything else is optional.
0-SimpleTheme/
├── config.txt
└── 1-MyFont/
├── font_config.txt
├── boot.wav
├── hum.wav
├── poweron.wav
├── poweroff.wav
└── clash1.wav
| Task | How |
|---|---|
| Create a theme | Make a folder at the SD root named N-Name, such as 0-Jedi |
| Add fonts to a theme | Put font folders inside the theme folder |
| Override config | Place config.txt in the theme folder |
| Override colors | Place colors.txt in the theme folder |
| Add OLED preview | Place theme.bmp in the theme folder |
| Add audio preview | Place theme.wav in the theme folder |
| Select via menu | Use the Theme entry in the vocal menu |
| Select via serial | Send selecttheme=N |
| List all themes | Send dirthemes |
| Remove theming | Delete theme_prefs.txt from the SD root |
| Check active theme | Look at bank=N inside theme_prefs.txt |
1-Sith is active, color changes are saved to 1-Sith/colors.txt.theme_prefs.txt anytime to return to a root-level setup.