rom-weaver

Local-first ROM and disc image toolkit

Patch, pack, and prove your ROMs. Nothing leaves your machine.

rom-weaver reads every common cartridge and disc container, chains patches in the order you choose, and saves the whole recipe as a bundle: patch order, checksums, and output names, so anyone can replay it exactly. Use it in the browser or in the terminal.

New here? Walk through the sample: a tiny homebrew NES ROM and two patches, already in order.

apply · 3 patches · in order
source Original ROM · sha1 ✓patch 1 translation.bpspatch 2 bugfix.ipspatch 3 undub.xdelta

One pass, no unpacking by hand, no intermediate files. Save it as a bundle and the order is kept for the next person.

One engine, two frontends

The same Rust core, in a tab or in a shell.

Pick the one that fits the job. Output bytes are identical either way.

Webapp

  • No install, no account. Open a page and drop files in.
  • Install it from the browser menu and it keeps working offline.
  • Files are read and written on your device. No upload ever happens.
  • Open a bundle link and the patch chain is staged for you.
Open
https://rom-weaver.com/apply

Want your own copy? Host it yourself from static files or a Docker image.

Command line

  • Native builds for Linux, macOS, and Windows.
  • Every command can print line-delimited JSON for scripts.
  • Batch a whole folder: convert, verify, and patch in one run.
Install with one of
brew install rom-weaver/tap/rom-weaver
npm install --global rom-weaver
cargo install rom-weaver-cli
docker run ghcr.io/rom-weaver/rom-weaver-cli

Every install method, with checksums and shell completions, is in the install guide.

What it reads and writes

Every console generation brought its own format. Bring all of them.

Containers reads
ZIP7zRARtarCHDRVZZ3DSCSOPBPGCZWIAWBFSand nested archives
Containers writes
ZIP7zCHDRVZZ3DSwith codec-aware compression settings
Patches reads and writes
IPSBPSUPSxdeltaPPFRUPBDFAPSDPSBSPHDiffPatchfull table
Checksums
CRC32MD5SHA-1SHA-256BLAKE3with copier-header detection and repair

Why local-first

Your collection is yours. The tool should act like it.

Files stay on the device

The webapp runs the same engine as the CLI, compiled to WebAssembly and running in worker threads. There is no server to send anything to.

The bundle is the proof

A bundle records the input checksum, every patch in order, and the expected output. Months later you can show where a file came from, or hand the bundle to someone and they get the same bytes.

Open source, forever

AGPL-3.0 licensed. Read the code, build it yourself, or host the webapp on your own domain.