A utility suite for converting, compressing, encrypting, and decrypting ROM formats across Nintendo 3DS, GameCube, Wii, Wii U, and CD image formats.
Available as both a command line tool and a desktop GUI application.
Built for developers, tinkerers and archivists.
- Convert CDN files to
.cia - Generate tickets for CDN files
- Decrypt
.cia,.3ds,.cci, and.cxifor emulator use (e.g. Azahar) - Compress and decompress ROMs using the Z3DS format (seekable zstd)
- Verify
.cialegitimacy and.3ds/.cciNCCH partition integrity - See
benchmark/3DS.mdfor performance numbers
- Compress
.iso/.gcmto Dolphin's.rvzformat - Decompress
.rvzback to raw.iso - Byte identical output against Dolphin's own encoder and decoder
- See
benchmark/GameCube.mdfor performance numbers
- Compress
.iso/.wbfsto Dolphin's.rvzformat - Decompress
.rvzback to raw.iso - Full partition pipeline: AES-CBC sector encryption, H0/H1/H2 hash hierarchy, per-chunk exception list, partial-cluster partitions
- Byte identical output against Dolphin's own encoder and decoder
- See
benchmark/Wii.mdfor performance numbers
- Bundle titles, updates, and DLC into Cemu's
.wuaarchive format - Decrypt NUS-format titles (
title.tmd+title.tik+.appfiles) into a loadiine-shapedmeta/code/contenttree - Also accepts the community layout variant (
tmd.<N>+ optionalcetk.<N>+ extensionless content files) - Wii U disc images (
.wud/.wux) accepted as.wuainput, with per-disc key files - FST-aware inherited-file skipping so update overlays install cleanly on top of the base title
- Compress
.bin+.cuepairs to.chd - Extract
.chdback to.bin+.cue - Verify
.chdintegrity via SHA-1 checksums, with optional header repair - See
benchmark/CHD.mdfor performance numbers
- Command line interface with progress bars
- Desktop GUI with drag and drop batch processing
- Self update from GitHub releases (CLI)
The desktop app provides a visual interface for all operations. Built with Tauri, Nuxt and Tailwind CSS.
Highlights:
- Drag and drop files directly into the application
- Batch process multiple files at once (drop several files to queue them up)
- Real time progress tracking for all operations
- State persists when switching between pages
- Works on Windows, macOS and Linux
- Install Rust 1.88+ and Node.js 22+
- Install pnpm
- Clone the repository
- Install frontend dependencies:
cd crates/rom-converto-gui pnpm install - Start the development server:
pnpm tauri dev
| Command | Description |
|---|---|
ctr cdn-to-cia <CDN_DIR> [OUTPUT] |
Convert a CDN directory to .cia |
ctr generate-cdn-ticket <CDN_DIR> [OUTPUT] |
Generate a .tik ticket from CDN content |
ctr decrypt <INPUT> <OUTPUT> |
Decrypt an encrypted ROM for emulator use |
ctr compress <INPUT> [OUTPUT] |
Compress a decrypted ROM to Z3DS format |
ctr decompress <INPUT> [OUTPUT] |
Decompress a Z3DS file back to the original ROM |
cdn-to-cia flags:
| Flag | Description |
|---|---|
-C, --cleanup |
Remove original CDN files after conversion |
-R, --recursive |
Process all subdirectories, converting each to .cia |
-T, --ensure-ticket-exists |
Auto-generate a ticket file if one is not found |
-D, --decrypt |
Also decrypt the CIA after creation |
-Z, --compress |
Also compress the CIA after creation (implies decrypt) |
generate-cdn-ticket: Generated tickets use placeholder values (null Console ID, etc.) and only work on modded consoles and emulators. They will not work on stock hardware.
decrypt: Supports.cia,.3ds,.cciand.cxifiles. The format is detected automatically. Place aseeddb.binfile next to the executable to resolve seeds locally. If none is found, the tool will fetch the required seed from Nintendo's API.
compress/decompress: Supported input formats for compression:.cia,.cci,.3ds,.cxi,.3dsx. Output files use the Z3DS format (.zcia,.zcci,.zcxi,.z3dsx). Compression only works on decrypted ROMs, since encrypted ROMs have near-zero compression ratios. The output file path defaults to the input path with the extension updated automatically.
| Command | Description |
|---|---|
dol compress <INPUT> [OUTPUT] |
Compress a .iso/.gcm to Dolphin's .rvz |
dol decompress <INPUT> [OUTPUT] |
Decompress a .rvz back to .iso |
Flags:
| Flag | Applies to | Description |
|---|---|---|
-l, --level <LEVEL> |
compress |
Zstandard compression level (signed, defaults to 22, Dolphin's max non-extreme) |
--chunk-size <BYTES> |
compress |
Chunk size in bytes, power of two between 32 KiB and 2 MiB (defaults to 128 KiB to match Dolphin) |
| Command | Description |
|---|---|
rvl compress <INPUT> [OUTPUT] |
Compress a .iso/.wbfs to Dolphin's .rvz |
rvl decompress <INPUT> [OUTPUT] |
Decompress a .rvz back to .iso |
Flags match the dol commands.
dolandrvlshare one RVZ pipeline. Output files are byte identical to Dolphin's own encoder and decoder in both directions, on both GameCube and Wii. See the Benchmarks section for measured performance.
| Command | Description |
|---|---|
wup compress -o <OUTPUT> <INPUTS>... |
Bundle one or more titles into a Cemu .wua archive |
wup decrypt -o <OUTPUT> <INPUT> |
Decrypt a NUS directory into a loadiine meta/code/content tree |
compress flags:
| Flag | Description |
|---|---|
-o, --output <FILE> |
Output .wua file path |
-l, --level <LEVEL> |
Zstd compression level 0..=22 (0 = Cemu default of 6) |
--key <KEYFILE> |
Disc master key file. Pass once per disc input in positional order |
compress: Each input is auto-detected as a loadiine directory, a NUS directory, or a disc image (.wud/.wux). Disc images need a 16-byte master key; keys are resolved in order from--keyflags, a sibling<disc>.keyfile, orgame.keyin the same directory. Multiple titles (base + update + DLC) can be bundled into one archive and each lands under its own<titleId>_v<version>/folder, the layout Cemu expects.
decrypt: Writes the decrypted tree to the output directory. Handles both the canonical Nintendo layout (title.tmd+title.tik+{id}.app) and the community layout variant (tmd.<N>+ optionalcetk.<N>+ extensionless content files). When no ticket is present, the title key is derived from the title id via the Nintendo CDN's PBKDF2 scheme.
| Command | Description |
|---|---|
chd compress <INPUT_CUE> <OUTPUT> |
Compress a .bin + .cue pair to .chd |
chd extract <INPUT> <OUTPUT> |
Extract a .chd file back to .bin + .cue |
chd verify <INPUT> |
Verify the SHA1 integrity of a .chd file |
Flags:
| Flag | Applies to | Description |
|---|---|---|
-f, --force |
compress |
Overwrite output file if it already exists |
-p, --parent <PARENT> |
extract, verify |
Specify a parent CHD for parent-child relationships |
--fix |
verify |
Correct SHA1 values in the CHD header if mismatches are found |
rom-converto self-update
Checks GitHub for a newer release and replaces the current binary in place.
RVZ and CHD operations are measured against DolphinTool.exe 2603a-x64
and chdman.exe 0.284 respectively, each tool on its own default
settings, N = 10 interleaved warm runs. Full methodology and per-run
detail live alongside the results:
benchmark/3DS.md: 3DS ROM results (Z3DS)benchmark/GameCube.md: GameCube disc image results (RVZ)benchmark/Wii.md: Wii disc image results (RVZ)benchmark/CHD.md: CD image results (CHD)
The Wii U .wua pipeline has no comparable reference CLI (Cemu ships the format but not a standalone compressor), so no head-to-head numbers are published for it.
The project is organized as a Cargo workspace with three crates:
| Crate | Description |
|---|---|
rom-converto-lib |
Core library with all conversion, compression and decryption logic |
rom-converto-cli |
Command line interface |
rom-converto-gui |
Desktop GUI application (Tauri + Nuxt) |
- Install Rust 1.88+
- For the GUI: Install Node.js 22+ and pnpm
cargo run -p rom-converto-cli
cargo build --release -p rom-converto-cli
The resulting binary will be at target/release/rom-converto.
- Rust and tokio for the core logic and async runtime
- Tauri and Nuxt for the desktop GUI
- clap for command line argument parsing
- binrw for reading/writing binary data structures
- RustCrypto for AES encryption, key derivation, and hashing
- zstd for seekable zstd compression (Z3DS format)
- flate2 / lzma-sdk-sys / flacenc for CHD compression codecs
- indicatif for CLI progress bars
- Pinia for GUI state management
- Tailwind CSS for GUI styling
Contributions are welcome! Please open an issue or PR if you'd like to help shape this project.
We use SemVer for versioning. See the tags on this repository for available versions.
- DevYukine - Initial work - DevYukine
See also the list of contributors who participated in this project.
This project is licensed under the MIT License - see the LICENSE file for details.
These projects/resources were extremely helpful during development: