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.
sha1 ✓patch 1 translation.bpspatch 2 bugfix.ipspatch 3 undub.xdeltaOne pass, no unpacking by hand, no intermediate files. Save it as a bundle and the order is kept for the next person.
Pick a workflow
Start from the files on your disk.
Every workflow takes files you already have and gives back one file you can keep, share, or play. A bundle is how a workflow itself gets shared.
Applymost used
- Bring
- A ROM and one or more patches, in any order you choose.
- Get
- The patched ROM with checksums checked. Save the chain as a bundle to replay or share it.
Bundle
- Bring
- A patch chain you have set up in Apply, or a
rom-weaver-bundle.jsonsomeone sent you. - Get
- One file that pins patch order, expected checksums, and output names. Open it and the workflow is ready to run.
Create
- Bring
- An original file and your modified copy.
- Get
- A patch in the format you choose, small enough to share.
Test
- Bring
- A ROM you just patched, or one from disk.
- Get
- It running in EmulatorJS in this tab, so you can check the patch before you save it.
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.
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.
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.
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.