rom-weaver

Identify and hash ROMs from the CLI

Match a ROM to an exact dump name with rom-weaver identify.

Use probe to inspect the file type. Use checksum to prove which bytes it holds.

Identify a ROM title

rom-weaver identify --input game.nes

The command checks the packaged Libretro data and OpenGood fallback data. It also checks common header, trim, and byte-order variants.

Point it at an archive to identify the ROM inside:

rom-weaver identify --input games.zip

Use --select when the archive holds more than one candidate.

Use a locally built pack instead of the built-in data:

rom-weaver identify --input game.iso --database playstation.pack

Repeat --database to search more packs. --database accepts RWFP1 packs.

Install the default identify data

Release packages include the default local database. After a Cargo or binary-only install, install the same versioned archive:

rom-weaver identify database install-all

Then identify as usual; the command finds the installed pack on its own:

rom-weaver identify --input game.bin

Check what is installed with rom-weaver identify database list. A result with "condition": "database_required" means the detected platform's pack is not installed; identify never downloads one itself. Install the database with rom-weaver setup, or point --database-dir at an existing one.

Install an optional group

Choose optional-arcade, optional-computers, optional-engines, optional-fantasy, optional-mobile, or optional-extended.

The optional-computers group contains computer systems and DOS. The optional-fantasy group contains MicroW8, PICO-8, TIC-80, and WASM-4. LowRes NX stays installed by default.

Install one group:

rom-weaver identify database install-group optional-computers

Use --from ARCHIVE to import a downloaded group archive without network access.

Force a system

Search one system's pack only, by canonical name or alias:

rom-weaver identify --input dump.bin --system psx

Use it when detection picks the wrong platform, or when a headerless dump detects nothing. rom-weaver identify database list prints the accepted names.

Inspect a file

rom-weaver probe --input game.iso

probe reports the detected format, platform, and copier header. It also answers to rom-weaver inspect.

Point it at an archive and it looks inside:

rom-weaver probe --input games.zip

--select picks one member by name, prefix, or glob. --no-extract treats the archive itself as the file to identify.

Hash a file

rom-weaver checksum --input game.sfc --algo sha256

--algo is repeatable and comma-separable, so one read produces several hashes:

rom-weaver checksum --input game.sfc --algo crc32,md5,sha1

Hash the ROM inside an archive

rom-weaver checksum --input game.zip --select 'game*.sfc' --algo crc32

This is the checksum a patch author usually means: the ROM's bytes, not the archive's.

Hash part of a file

Skip a copier header, or hash only the region a patch touches, with a byte range. rom-weaver checksum --help lists the range flags for your version.

Read from a pipeline

identify, probe, and checksum accept - as the input. Thus, they can read stdin:

curl -sL https://example.com/game.gba | rom-weaver checksum --input - --algo sha256
xz -dc game.iso.xz | rom-weaver probe --input - --json

Get machine-readable output

Add --json to a command for one JSON object per line:

rom-weaver probe --input game.sfc --json | jq

JSON mode turns off interactive selection, so scripts never block on a prompt.