Skip to content

DevYukine/rom-converto

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

136 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

rom-converto

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.

Features

Nintendo 3DS (CTR)

  • Convert CDN files to .cia
  • Generate tickets for CDN files
  • Decrypt .cia, .3ds, .cci, and .cxi for emulator use (e.g. Azahar)
  • Compress and decompress ROMs using the Z3DS format (seekable zstd)
  • Verify .cia legitimacy and .3ds / .cci NCCH partition integrity
  • See benchmark/3DS.md for performance numbers

GameCube (DOL)

  • Compress .iso / .gcm to Dolphin's .rvz format
  • Decompress .rvz back to raw .iso
  • Byte identical output against Dolphin's own encoder and decoder
  • See benchmark/GameCube.md for performance numbers

Wii (RVL)

  • Compress .iso / .wbfs to Dolphin's .rvz format
  • Decompress .rvz back 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.md for performance numbers

Wii U (WUP)

  • Bundle titles, updates, and DLC into Cemu's .wua archive format
  • Decrypt NUS-format titles (title.tmd + title.tik + .app files) into a loadiine-shaped meta/code/content tree
  • Also accepts the community layout variant (tmd.<N> + optional cetk.<N> + extensionless content files)
  • Wii U disc images (.wud / .wux) accepted as .wua input, with per-disc key files
  • FST-aware inherited-file skipping so update overlays install cleanly on top of the base title

CD images (CHD)

  • Compress .bin + .cue pairs to .chd
  • Extract .chd back to .bin + .cue
  • Verify .chd integrity via SHA-1 checksums, with optional header repair
  • See benchmark/CHD.md for performance numbers

Application

  • Command line interface with progress bars
  • Desktop GUI with drag and drop batch processing
  • Self update from GitHub releases (CLI)

GUI Application

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

Running the GUI in Development

  1. Install Rust 1.88+ and Node.js 22+
  2. Install pnpm
  3. Clone the repository
  4. Install frontend dependencies:
    cd crates/rom-converto-gui
    pnpm install
    
  5. Start the development server:
    pnpm tauri dev
    

CLI Commands

CTR (Nintendo 3DS)

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, .cci and .cxi files. The format is detected automatically. Place a seeddb.bin file 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.


DOL (GameCube)

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)

RVL (Wii)

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.

dol and rvl share 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.


WUP (Wii U)

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 --key flags, a sibling <disc>.key file, or game.key in 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> + optional cetk.<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.


CHD

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

Self-Update

rom-converto self-update

Checks GitHub for a newer release and replaces the current binary in place.

Benchmarks

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:

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.

Project Structure

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)

Development

Prerequisites

  1. Install Rust 1.88+
  2. For the GUI: Install Node.js 22+ and pnpm

Running the CLI in Development

cargo run -p rom-converto-cli

Building Release Binaries

cargo build --release -p rom-converto-cli

The resulting binary will be at target/release/rom-converto.

Built With

Contributing

Contributions are welcome! Please open an issue or PR if you'd like to help shape this project.

Versioning

We use SemVer for versioning. See the tags on this repository for available versions.

Authors

See also the list of contributors who participated in this project.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

These projects/resources were extremely helpful during development:

About

Suite for converting, compressing, decompressing, encrypting, and decrypting ROMs.

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors