Game Modding
Mod Directory Structure
Every game in Citra has its own Mods folder. You can open it by right-clicking the game title inside Citra and selecting “Open Mods Location.” or (alternatively, load/mods/<Title ID> in the User Directory)
The folder path usually looks like this:
load/mods/<Title ID>
- exefs
- romfs
- romfs_ext
- exheader.binEach folder serves a unique purpose, and not all of them are required. You can include only the ones you need for your specific mod.
ExeFS (Game Logic and Code Mods)
The ExeFS folder is used for modifying the game’s executable files. These mods typically change game logic or mechanics.
Citra supports three types of files here:
- code.bin: It is a complete replacement for the game’s executable.
- code.ips: The IPS patch format applies small changes to the game’s code. More details on the IPS format can be found on ZeroSoft and SMWiki.
- code.bps: The BPS patch format, used for advanced modifications. More details on the BPS format can be found on byuu.
Tip: You can also place these files directly inside the /mods/ folder (instead of /exefs/) for full Luma3DS compatibility.
RomFS (Textures, Audio, and Visual Mods)
The RomFS folder contains game assets, i-e, textures, fonts, sounds, and other visual elements. When you place files here, Citra merges them with the base game using a feature called LayeredFS, giving your custom files priority over the originals.
Note: Your RomFS mod folder must follow the same structure as the game’s original RomFS directory. To extract (dump) the original assets:
- Right-click on the game.
- Select “Dump RomFS”.
- Citra will open the dumped folder automatically, and it can be found at dump/romfs/<Title ID> in the User Directory.
RomFS Extension (romfs_ext)
The romfs_ext folder is for advanced modding tasks like deleting or patching specific files. You can use it to:
- Delete files by placing a .stub version of that file in the same directory.
- Patch files using .ips or .bps patches.
Keep in Mind: Citra currently loads entire patched files into RAM, so avoid applying too many patches at once to maintain stable performance.
ExHeader (Advanced Modding)
The exheader.bin file modifies system-level information such as memory usage and code size. This allows modders to increase available RAM or enable more complex custom code for advanced projects.
Example: Pokémon Ultra Sun
For example, Pokémon Ultra Sun has a Title ID of 00040000001B5000. Your mods for this game would go here:
load/mods/00040000001B5000/
├─ exefs
├─ romfs
├─ romfs_ext
└─ exheader.binNot all folders are required, as Citra automatically ignores any empty ones.
Using Luma3DS Mods in Citra
Good news for modders because Citra is compatible with Luma3DS mods.Simply copy your existing Luma3DS mod files into the Citra mods folder. Here’s an example layout:
luma/titles/<Title ID>
- romfs
- code.bin / code.ips
- exheader.binCitra recognizes these mods automatically and applies them when you launch the game.
Using 3GX Plugins
Citra also supports 3GX plugins, the same format used by Luma3DS 3GX Plugin Loader. You can place plugin files (.3gx) in two locations:
sdmc/luma/plugins/<TitleID>/<filename>.3gx → applies to a specific game
sdmc/luma/plugins/default.3gx → applies to all gamesAfter placing your plugins, go to System Settings → Enable 3GX Plugin Loader in Citra, and your plugins will load automatically next time you play.
Conclusion
The Citra Emulator Modding Framework gives players and developers the freedom to tweak, enhance, or completely transform their favorite Nintendo 3DS games. From simple texture replacements to advanced gameplay patches and 3GX plugins, Citra provides everything you need to make your games truly your own.
