Comparison with similar tools
rom-weaver overlaps with six established tools, each narrower than it is. This page compares all of them, format by format and feature by feature, so you can tell which one fits your job.
Legend
Every table on this page uses these three marks. Each one has its own shape as well as its own colour, so the tables still read without colour vision.
| Mark | Meaning |
|---|---|
| ✅ | Supported. |
| ⚠️ | Partly supported. The limit is written next to the mark, or in a numbered note under the table. |
| ❌ | Not supported. |
The tools
| Tool | What it does | Platforms | License |
|---|---|---|---|
| rom-weaver | ROM workflow: patch, extract, compress, hash, trim, bundle | Browser, Linux, macOS, Windows | AGPL-3.0-or-later |
| RomPatcher.js | Applies and creates ROM patches | Browser, Node | MIT |
| Floating IPS (Flips) | Applies and creates IPS and BPS patches | Linux, macOS, Windows | GPL-3.0 |
| MultiPatch | Applies and creates seven patch families | macOS | GPL-2.0 |
| xdelta3 | General VCDIFF delta compressor | Linux, macOS, Windows | Apache-2.0 |
| chdman | Converts disc images to and from CHD | Linux, macOS, Windows | GPL-2.0 |
| Dolphin tool | Converts GameCube and Wii images | Linux, macOS, Windows | GPL-2.0 |
The last three are the reference implementations rom-weaver is tested against. Its CHD and RVZ output is checked byte-for-byte against chdman and Dolphin tool, and its patch output against Flips and MultiPatch, so choosing rom-weaver for those jobs is a question of convenience, not of different bytes. The full list of specifications consulted is in references.
At a glance
The patch counts are format counts from the Applying a patch and Creating a patch tables, so every tool is counted the same way. Partial support counts. A row naming several formats counts as each of them.
| Capability | rom-weaver | RomPatcher.js | Flips | MultiPatch | xdelta3 | chdman | Dolphin tool |
|---|---|---|---|---|---|---|---|
| Patch formats applied | ✅ 21 | ⚠️ 12 | ❌ 3 | ⚠️ 8 | ❌ 2 1 | ❌ 2 | ❌ 2 |
| Patch formats created | ✅ 18 | ⚠️ 7 | ❌ 2 | ⚠️ 7 | ❌ 2 1 | ❌ 2 | ❌ 2 |
| Chain several patches | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| ROM header awareness | ✅ 12 families | ⚠️ 4 formats | ⚠️ SNES only | ❌ | ❌ | ❌ | ❌ |
| Archive extract | ✅ 23 formats | ⚠️ ZIP only | ❌ | ❌ | ❌ | ❌ | ❌ |
| Archive or image create | ✅ 5 formats | ❌ | ❌ | ❌ | ❌ | ⚠️ CHD only | ⚠️ 4 formats |
| Standalone checksum tool | ✅ 8 algorithms | ⚠️ 3, display only | ❌ | ❌ | ❌ | ⚠️ CHD self-check | ⚠️ image verify |
| Trim ROM padding | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Runs in a browser | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Command line | ✅ | ⚠️ Node script | ✅ | ⚠️ macOS only | ✅ | ✅ | ✅ |
1 xdelta3's two rows, VCDIFF and xdelta, are one underlying family: plain VCDIFF. It is a general delta tool with no ROM knowledge at all — no headers, no byte order, no consoles.
2 chdman and Dolphin tool do not patch. They convert disc images.
Applying a patch
rom-weaver reads 21 patch formats. No other tool here reads more than 12.
| Format | rom-weaver | RomPatcher.js | Flips | MultiPatch | xdelta3 |
|---|---|---|---|---|---|
| IPS | ✅ | ✅ | ✅ | ✅ | ❌ |
| IPS32 | ✅ | ❌ | ❌ | ❌ | ❌ |
| EBP | ✅ | ✅ | ❌ | ❌ | ❌ |
| BPS | ✅ | ✅ | ✅ | ✅ | ❌ |
| UPS | ✅ | ✅ | ✅ | ✅ | ❌ |
| PPF | ✅ | ✅ | ❌ | ✅ | ❌ |
| RUP | ✅ | ✅ | ❌ | ✅ | ❌ |
| APS (N64) | ✅ | ✅ | ❌ | ❌ | ❌ |
| APSGBA | ✅ | ✅ | ❌ | ❌ | ❌ |
| BDF/BSDIFF40 | ✅ | ✅ | ❌ | ✅ | ❌ |
| MOD (PMSR) | ✅ | ✅ | ❌ | ❌ | ❌ |
| VCDIFF | ✅ | ⚠️ 1 | ❌ | ✅ 2 | ✅ |
| xdelta | ✅ | ⚠️ 1 | ❌ | ✅ 2 | ✅ |
| SOLID | ✅ | ❌ | ❌ | ❌ | ❌ |
| GDIFF | ✅ | ❌ | ❌ | ❌ | ❌ |
| PAT (FireFlower) | ✅ | ❌ | ❌ | ❌ | ❌ |
| DLDI | ✅ | ❌ | ❌ | ❌ | ❌ |
| DPS | ✅ | ❌ | ❌ | ❌ | ❌ |
| BSP | ✅ | ❌ | ❌ | ❌ | ❌ |
| HDiffPatch/HPatchZ | ✅ | ❌ | ❌ | ❌ | ❌ |
| DCP (Dreamcast) | ✅ | ❌ | ❌ | ❌ | ❌ |
1 RomPatcher.js decodes plain VCDIFF but throws on two optional parts of the spec: a secondary compressor and a custom code table. Most
.xdeltapatches from xdelta3 use thedjwsecondary compressor, so they fail.2 MultiPatch links the real xdelta3 library, so it decodes both. So does rom-weaver.
rom-weaver has gaps too. It detects NINJA1 headers but cannot apply them, it does not support PDS, and it does not support HDiffPatch directory patches (HDIFF19). None of the other tools support those either.
Creating a patch
| Format | rom-weaver | RomPatcher.js | Flips | MultiPatch | xdelta3 |
|---|---|---|---|---|---|
| IPS | ✅ | ✅ | ✅ | ✅ | ❌ |
| IPS32 | ✅ | ❌ | ❌ | ❌ | ❌ |
| EBP | ✅ | ✅ | ❌ | ❌ | ❌ |
| BPS | ✅ | ✅ | ✅ 1 | ✅ | ❌ |
| UPS | ✅ | ✅ | ❌ 2 | ✅ | ❌ |
| PPF | ✅ | ✅ | ❌ | ✅ | ❌ |
| RUP | ✅ | ✅ | ❌ | ❌ | ❌ |
| APS (N64) | ✅ | ✅ | ❌ | ❌ | ❌ |
| APSGBA | ✅ | ❌ | ❌ | ❌ | ❌ |
| BDF/BSDIFF40 | ✅ | ❌ | ❌ | ✅ | ❌ |
| MOD (PMSR) | ✅ | ❌ | ❌ | ❌ | ❌ |
| VCDIFF | ✅ | ❌ | ❌ | ✅ | ✅ |
| xdelta | ✅ | ❌ | ❌ | ✅ | ✅ |
| SOLID, GDIFF, PAT, DLDI, DPS | ✅ | ❌ | ❌ | ❌ | ❌ |
| BSP, HDiffPatch, DCP | ❌ | ❌ | ❌ | ❌ | ❌ |
1 Flips is the only tool here offering two BPS strategies on the command line:
--bps-deltaand--bps-linear.2 Flips ships a UPS encoder in its library but exposes no way to reach it, so UPS is apply-only in practice.
Containers and disc images
| Format | rom-weaver extract | rom-weaver create | RomPatcher.js | chdman | Dolphin tool |
|---|---|---|---|---|---|
| ZIP | ✅ | ✅ | ⚠️ extract only | ❌ | ❌ |
| ZIPX | ✅ | ❌ | ❌ | ❌ | ❌ |
| 7z | ✅ | ✅ | ❌ | ❌ | ❌ |
| RAR | ✅ | ❌ | ❌ | ❌ | ❌ |
| TAR (plain, gz, bz2, xz) | ✅ | ❌ | ❌ | ❌ | ❌ |
| Gzip, Bzip2, XZ, Zstandard | ✅ | ❌ | ❌ | ❌ | ❌ |
| CHD | ✅ | ✅ | ❌ | ✅ 1 | ❌ |
| RVZ | ✅ | ✅ | ❌ | ❌ | ✅ |
| Z3DS | ✅ | ✅ | ❌ | ❌ | ❌ |
| GCZ | ✅ | ❌ 2 | ❌ | ❌ | ✅ |
| WIA | ✅ | ❌ 2 | ❌ | ❌ | ✅ |
| TGC | ✅ | ❌ | ❌ | ❌ | ⚠️ read only |
| NFS | ✅ | ❌ | ❌ | ❌ | ⚠️ read only |
| WBFS | ✅ | ❌ | ❌ | ❌ | ⚠️ read only |
| CSO/CISO | ✅ | ❌ | ❌ | ❌ | ⚠️ read only |
| PBP | ✅ | ❌ | ❌ | ❌ | ❌ |
| XISO | ✅ | ❌ | ❌ | ❌ | ❌ |
1 chdman also reads
.cue,.gdi,.toc, and raw images as CHD build inputs, which is a different job from extracting an existing archive.2 An honest gap: Dolphin tool writes GCZ and WIA, and rom-weaver only reads them.
The practical difference: rom-weaver can take a .chd or .rvz disc image, patch the ROM inside, and pack the result back up in one command. Every other tool here needs you to convert, patch, and convert back by hand.
Checksums
| Capability | rom-weaver | RomPatcher.js | Flips | MultiPatch | chdman | Dolphin tool |
|---|---|---|---|---|---|---|
| Algorithms | ✅ CRC32, CRC32C, CRC16, MD5, SHA-1, SHA-256, BLAKE3, Adler-32 | ⚠️ CRC32, MD5, SHA-1 | ❌ | ❌ | ⚠️ SHA-1 1 | ⚠️ CRC32, MD5, SHA-1 1 |
| Shows ROM hashes | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Verifies checksums in the patch | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
| Assert an expected input hash | ✅ --expect-in |
❌ | ❌ | ❌ | ❌ | ❌ |
| Assert an expected output hash | ✅ --expect-out |
❌ | ❌ | ❌ | ❌ | ❌ |
| Hash a byte range | ✅ --start/--length |
❌ | ❌ | ❌ | ❌ | ❌ |
| Hash a file inside an archive | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Header and byte-order variants | ✅ all detected headers, plus trim boundaries 2 | ⚠️ N64 only | ❌ | ❌ | ❌ | ❌ |
1 chdman
verifyand Dolphin toolverifycheck an image against its own stored hashes. Neither hashes an arbitrary file.2 This matters when a patch's readme lists a CRC32 you cannot reproduce. rom-weaver reports the hash of the raw file, the headerless file, the repaired-header file, and each N64 byte order at once, so you can see which one the author meant. See Fix a checksum error.
Headers and byte order
| Behavior | rom-weaver | RomPatcher.js | Flips | MultiPatch |
|---|---|---|---|---|
| Header detection | ✅ 12 families 1 | ⚠️ 4 formats 2 | ⚠️ SNES copier only 3 | ❌ |
| Checksum repair | ✅ 12 platforms 4 | ⚠️ Game Boy, Mega Drive | ❌ | ❌ |
| Header strip mode | ✅ auto, keep, or strip, per patch |
⚠️ manual on/off | ⚠️ auto-detect, --exact to force |
❌ |
| Output header mode | ✅ separate auto, keep, or strip |
⚠️ follows the input choice | ⚠️ restores what it stripped | ❌ |
| N64 byte order | ✅ converts to match the patch, writes back in the original order | ⚠️ detects .z64 for its CRC display |
❌ | ❌ |
1 A78, LNX, NES and FDS, SNES copier and SMC variants, PCE copier formats, Game Boy and GBA, Mega Drive, SMS and Game Gear, all N64 byte orders, NDS, Neo Geo Pocket, and MSX.
2 iNES (
.nes), fwNES (.fds), LNX (.lnx), and SNES copier (.sfc,.smc,.swc,.fig), picked by file extension and file size.3 The 512-byte SNES copier header and nothing else.
4 SNES, NES, Game Boy/GBA, Mega Drive, SMS/Game Gear, N64, Atari 7800/Lynx, PCE/TurboGrafx-16, Virtual Boy, Neo Geo Pocket, MSX, and NDS. FDS, Atari Jaguar, ColecoVision, Watara Supervision, and Intellivision headers are validated but not rewritten.
Patching features
| Feature | rom-weaver | RomPatcher.js | Flips | MultiPatch | xdelta3 |
|---|---|---|---|---|---|
| Apply one patch | ✅ | ✅ | ✅ | ✅ | ✅ |
| Chain several patches in order | ✅ repeat --patch |
❌ 1 | ❌ 1 | ❌ 1 | ❌ 1 |
| Validate without writing | ✅ patch validate |
❌ | ⚠️ --info |
❌ | ⚠️ printhdr |
| Check each patch independently | ✅ --independent |
❌ | ❌ | ❌ | ❌ |
| Find patches beside the ROM in an archive | ✅ | ❌ | ❌ | ❌ | ❌ |
| Bake in Game Genie / GameShark codes | ✅ --code |
❌ | ❌ | ❌ | ❌ |
| Undo a PPF3 patch | ✅ tools ppf-undo |
❌ | ❌ | ❌ | ❌ |
| Override a failed checksum | ✅ --ignore-checksum-validation |
✅ | ✅ --ignore-checksum |
❌ | ❌ |
| Patch metadata on create | ⚠️ SOLID fields only 2 | ✅ RUP description, EBP JSON | ✅ BPS manifest | ❌ | ✅ -A app header |
| Machine-readable output | ✅ --json |
❌ | ❌ | ❌ | ❌ |
1 These apply exactly one patch per run. Hacks that ship a base patch plus an update need two passes, and you have to keep the intermediate file yourself.
2
--solid-system,--solid-game,--solid-hack,--solid-version,--solid-author,--solid-contact, and--solid-comment. RUP and EBP patches are written with an empty description and a placeholder JSON block respectively; neither can be set.
Beyond patching
| Command | rom-weaver | Anything else here |
|---|---|---|
| Trim and restore | ✅ NDS, GBA, 3DS, XISO, and RVZ scrub 1 | ❌ |
| Compress | ✅ ZIP, 7z, CHD, RVZ, Z3DS | ⚠️ chdman for CHD, Dolphin tool for RVZ/GCZ/WIA/ISO |
| Probe | ✅ format, platform, and header, including from stdin | ⚠️ chdman info, Dolphin tool header |
| Ingest | ✅ sorts a mixed folder into ROMs and patches | ❌ |
| Bundles | ✅ rom-weaver-bundle.json recipes 2 |
❌ |
1
trim --revertpads a trimmed file back out for NDS, GBA, and 3DS, and--revert-markerstores a footer so that revert is exact rather than a guess at the padding. XISO and RVZ scrub are one-way.2 A bundle records the ROM's checksums, the patch order, and the expected result, so someone else can reproduce your build. See What a bundle is.
Delivery and platforms
| Property | rom-weaver | RomPatcher.js | Flips | MultiPatch | xdelta3 | chdman | Dolphin tool |
|---|---|---|---|---|---|---|---|
| Browser | ✅ WebAssembly | ✅ plain JavaScript | ❌ | ❌ | ❌ | ❌ | ❌ |
| Command line | ✅ native, 9 platforms | ⚠️ Node script | ✅ | ⚠️ macOS only | ✅ | ✅ | ✅ |
| Desktop GUI | ❌ | ❌ | ✅ GTK, Win32 | ✅ Cocoa | ❌ | ❌ | ❌ |
| Embed in your own page | ❌ | ✅ a stated goal | ❌ | ❌ | ❌ | ❌ | ❌ |
| Multi-threaded | ✅ -j sets the ceiling |
⚠️ one worker per job | ❌ | ❌ | ❌ | ✅ | ✅ |
| Large files | ✅ streams; disc images are normal | ⚠️ warns above 64 MB 1 | ✅ | ✅ | ✅ | ✅ | ✅ |
| Install | ✅ npm, Homebrew, Docker, or a binary | ⚠️ copy files, or npm install |
⚠️ binary or build | ⚠️ app download | ⚠️ package or build | ⚠️ part of MAME tools | ⚠️ part of Dolphin |
| Language | Rust | JavaScript | C++ | Objective-C, C++ | C | C++ | C++ |
1 The warning is advisory, not a block. It reflects that RomPatcher.js loads whole files into JavaScript arrays.
Which one should you use?
RomPatcher.js when you are publishing a hack and want a patch button on your own site. It embeds in a page, has no build step, and handles IPS, BPS, or UPS on a cartridge ROM in a few kilobytes of script.
Flips when you only touch IPS and BPS and want the reference BPS encoder with both delta and linear strategies, plus a desktop GUI.
MultiPatch when you are on macOS and want a native app covering seven families, including real xdelta3.
xdelta3 when the files are not ROMs. It is a general delta compressor and knows nothing about headers, byte order, or consoles.
chdman or Dolphin tool when you want the reference converter itself, or need an output rom-weaver does not write — Dolphin tool writes GCZ and WIA.
rom-weaver when the job is bigger than one patch and one ROM: a disc image inside a CHD, an .xdelta patch with secondary compression, a chain of patches, an N64 ROM in the wrong byte order, a checksum you need to explain, or a scripted batch you want to run the same way twice.
These are not exclusive. Publishing a BPS patch with a RomPatcher.js button on your page, and a rom-weaver bundle for people who want the checksums recorded, covers both audiences.
How this page was checked
Every claim was read out of each tool's source or official documentation, not out of a feature list.
| Tool | Checked at | What was read |
|---|---|---|
| rom-weaver | 0.12.2 | Supported formats, CLI reference |
| RomPatcher.js | commit aef583b, v3.0.0 |
RomPatcher.js format registry and header logic, modules/ parsers, index.js CLI |
| Flips | master |
flips.cpp patch identification and create paths, libips/libbps/libups, CLI options |
| MultiPatch | master |
MPPatchWindow.mm apply dispatch, MPCreationWindow.mm create list, adapters/, XDeltaAdapter.m |
| xdelta3 | master |
Command line syntax documentation |
| chdman | current MAME docs | The chdman command list |
| Dolphin tool | master |
ToolMain.cpp subcommands, ConvertCommand.cpp output formats, Blob.cpp readable formats |
All projects move. If a row here is stale, check the rom-weaver side against Supported formats, and each other tool's side against the repository linked from the tools.