
Wii System Menu Extractor & Normalizer
An advanced reverse engineering tool written in Rust, designed to extract, decompress, and normalize as many Wii System Menu assets as possible into standard, open formats (glTF, PNG, JSON, WAV). It can also, even though it is not the primary goal, extract/convert files from certain Wii games.
Goal and Purpose
This project is dedicated to digital preservation and historical analysis, with the aim of a complete rewrite of USB Loader GX and other Wii homebrew for SteamOS, and more generally, Linux on PC.The Wii System Menu (and its associated channels) relies on proprietary file formats (U8, TPL, BRLYT, ASH, BRSAR, BRRES) that standard tools cannot read. For analysis, UI emulation, customization, or historical preservation, it is essential to transform this binary data into assets usable by platforms that rely on documented file formats.
This program does not merely extract files: it recursively converts and normalizes them.
Normalization Methodology
The tool runs up to 20 recursive passes to resolve nested dependencies (e.g., a .app containing a compressed .ash, containing a U8 .arc, containing a .brres itself full of TEX0 textures). Recursion stops automatically after two passes with no extraction, to ensure process reliability.1. Data Access (Extraction Engines)
- ASH (
.ash) : Custom integrated Huffman/LZ77 virtual machine for bit-perfect decompression. - LZ77 (
.LZ,.lz7) : Full support for 0x10 variants with robust detection. - Yaz0 (
.szs) : High-performance LZSS decompressor for channel archives. - Standard Archives (
.app,.arc,.zip) : Full extraction of U8 and ZIP directory trees. - NW4R Containers (
.brres,.breft) : Heuristic pattern scanning to extract subfiles.
2. Asset Normalization (Museum Grade)
- Graphics (Pixel-Perfect):
- TEX0 / TPL / BTI -> PNG : Full GX decoding. Unique Improvement : "White-Alpha" strategy handling for intensity formats (I4, IA4), ensuring UI elements without black artifacts. Full support for RGBA8 (planar) and CMPR (Wii BC1/DXT1).
- Palette Support (PLT0) : Automatic application to indexed textures (CI4/CI8).
- Interface (UI-Dependent):
- BRLYT -> JSON : Reconstruction of the complex hierarchical scene tree.
- BRLAN -> JSON : Extraction of animation curves.
- 3D Models:
- MDL0 -> glTF 2.0 : Export of complete geometry (v1 to v11).
- Typography:
- BRFNT -> JSON & PNG : Bit-perfect decoding including the Wii-specific 8x4 tiling used by fonts (Rodin). Extraction of glyph metrics (CWDH) and Unicode maps (CMAP).
- Audio & Music:
- BWAV -> WAV : Support for these System Menu files.
- RWAV/RWSD/RBNK -> WAV : 16-bit hardware DSP-ADPCM decoding.
- BRSEQ -> MIDI & JSON : Musical sequences. (Work still in progress)
- Reverse Engineering:
- SEL -> JSON : Support for binary files (Static Executable Linker). Recovery of the original build path (
.elf) and the complete symbol table (internal function names).
- SEL -> JSON : Support for binary files (Static Executable Linker). Recovery of the original build path (
Usage
Build
Code:
cargo build --release
Run
Code:
./target/release/wii_system_menu_extractor <TITLE_FOLDER_OR_FILE_PATH>
The program processes files idempotently: it detects extractions already performed and only processes new files or modifications. Running the program directly (without a terminal) in the current directory has the same effect on its contents, even without any graphical output. There is no official release nor version number yet, as the program is still under development, but it is functional and effective enough for most needs.
AppImage
An AppImage build script is provided in the scripts folder, and a ready-to-use AppImage is also available in the packages folder. This program was compiled on Debian 13 and will require at minimum the versions of certain libraries bundled in that reference distribution. Logically, this AppImage should run on all up-to-date Linux distributions.
Glossary of Formats and Normalized JSON
Archives and Compression
- ASH / LZ77 / Yaz0: Proprietary compression formats.
- Normalization : Decompressed into the original files (
.arc,.brres).
- Normalization : Decompressed into the original files (
- U8 / ARC / APP: Uncompressed file archives.
- Normalization : Extracted into
_extractedsubfolders.
- Normalization : Extracted into
Graphics and Typography
- TPL / TEX0 / BTI (Wii textures) -> PNG
- GX tiled storage. IA4/IA8 formats are normalized using "White-Alpha" for UI.
- BRFNT (Binary font) -> PNG atlas + JSON
- The JSON contains metrics (height, baseline) and Unicode mapping (
code->glyph_index). - JSON fields :
ascent(height above baseline),widths(per-glyph width).
- The JSON contains metrics (height, baseline) and Unicode mapping (
Interface and Animation
- BRLYT (Layout) -> JSON
- Stores the hierarchical interface tree (Panes).
- JSON fields :
rootcontains thePanestack withname,x/y/z,scale,rotation, andchildrenfor hierarchy.
- BRLAN (Layout Animation) -> JSON
- Animation sequences for BRLYT
Panes. - JSON fields :
animationslists targets,keyframescontains time (frame) and property (value) values.
- Animation sequences for BRLYT
Audio
- RWAV / BWAV -> WAV
- Raw audio files, often DSP-ADPCM (hardware 4-bit compressed) or PCM16.
- BRSAR / RWSD -> WAV + JSON
- The JSON lists
soundsand their properties (volume, pitch).
- The JSON lists
Reverse Engineering
- SEL (Symbol Table) -> JSON
- Contains linking metadata for Wii code (often present in
.app). - JSON fields :
internal_path(original path on the Nintendo developer’s PC),symbols(list of all recovered C++ function names).
- Contains linking metadata for Wii code (often present in
- BMG (Message Group) -> JSON
- Localized text table.
- JSON fields :
messagesmaps a numericIDto the translated string.
License
GNU GENERAL PUBLIC LICENCE 3 (GPL 3) - TikilouDownload AppImage executable : https://github.com/Tikilou/Wii-Syst...ges/wii_system_menu_extractor-x86_64.AppImage
Github repository : https://github.com/Tikilou/Wii-System-Menu-Extractor-Normalizer
Ps : this project is a part of a most bigger "Museum Project" (It's a surprise !), I'll let you know about that soon, it's still in development, and I'm rather in favor of Valve's approach in this regard.
Last edited by Tikilou,









