MCPcopy Index your code
hub / github.com/emmercm/igir

github.com/emmercm/igir @v5.3.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v5.3.0 ↗ · + Follow
1,732 symbols 6,845 edges 276 files 568 documented · 33% updated todayv5.3.1 · 2026-07-07★ 85821 open issues
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

igir logo

Pronounced "eager," Igir is a zero-setup ROM collection manager that sorts, filters, extracts or archives, patches, and reports on collections of any size on any OS.

npm: version npm: downloads GitHub: downloads GitHub: stars GitHub: discussions

Snyk: vulnerabilities codecov: coverage Maintainability license

See the project website for complete documentation, installation & usage instructions, and examples!

What does Igir do?

A video of an example use case:

asciicast

With Igir you can manage a ROM collection of any size:

  • 🔍 Scan for DATs, ROMs, and ROM patches—including those in archives (see scanning & archive docs)
  • 📂 Organize ROM files by console (see DAT docs)
  • 🪄 Name ROM files consistently, including the right extension (see DAT docs)
  • ✂️ Filter out duplicate ROMs, or ROMs in languages you don't understand (see filtering docs)
  • 🗜️ Extract or archive ROMs in mass (see archive docs)
  • 🔢 Create playlists for multi-disc games in mass (see playlist docs)
  • 🩹 Patch ROMs automatically in mass (see scanning & patching docs)
  • 🎩 Parse ROMs with headers and optionally remove them (see header docs)
  • ↔️ Build & re-build (un-merge, split, or merge) MAME ROM sets (see arcade docs)
  • 🔮 Report on what ROMs are present or missing for each console and create fixdats for missing ROMs (see reporting & DAT docs)

How do I run Igir?

Either download the latest version for your OS from the releases page, or if you have Node.js installed you can use npx to always run the latest version from the command line:

npx igir@latest [commands..] [options]

Here is the full help message which shows all available options and a number of common use case examples:

```help $ igir --help

@@@@@@ @@@@@@ @@@@@@ @@@@@@@@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ ROM collection manager @@@@@@ @@ @@@@@@ @@@@@@@@@ https://igir.io/ @@@ @@@@ @@@ @@ @@ @@ @@ @@ @@ v5.3.0 (Node.js v26.4.0) @@ @@ @@ @@ @@ @@ @@ @@@@@@@@@@@@ @@ @@ @@

Usage: igir [commands..] [options]

Commands (can specify multiple): igir copy Copy ROM files from the input to output directory igir move Move ROM files from the input to output directory igir link Create links in the output directory to ROM files in the input directory igir extract Extract ROM files in archives when copying or moving igir zip Create zip archives of ROMs when copying or moving igir playlist Create playlist files for multi-disc games igir test Test ROMs for accuracy after writing them to the output directory igir dir2dat Generate a DAT from all input files igir fixdat Generate a fixdat of any missing games for every DAT processed (requires --dat) igir clean Recycle unknown files in the output directory igir report Generate a CSV report on the known & unknown ROM files found in the input directories (requires --dat)

ROM input options: -i, --input Path(s) to ROM files or archives (supports globbing) [array] -I, --input-exclude Path(s) to ROM files or archives to exclude from processing (supports globbing) [array] --input-checksum-quick Only read checksums from archive headers, don't decompress to calculate [boolean] --input-checksum-min The minimum checksum level to calculate and use for matching [choices: "CRC32", "MD5", "SHA1", "SHA256"] [default: "CRC32"] --input-checksum-max The maximum checksum level to calculate and use for matching [choices: "CRC32", "MD5", "SHA1", "SHA256"] [default: "SHA1"] --input-checksum-archives Calculate checksums of archive files themselves, allowing them to match files in DATs [choices: "never", "auto", "always"] [default: "auto"]

DAT input options: -d, --dat Path(s) to DAT files or archives (supports globbing) [array] --dat-exclude Path(s) to DAT files or archives to exclude from processing (supports globbing) [array] --dat-name-regex Regular expression of DAT names to process [array] --dat-name-regex-exclude Regular expression of DAT names to exclude from processing [array] --dat-description-regex Regular expression of DAT descriptions to process [array] --dat-description-regex-exclude Regular expression of DAT descriptions to exclude from processing [array] --dat-combine Combine every game from every found & filtered DAT into one DAT [boolean] --dat-ignore-parent-clone Ignore any parent/clone information found in DATs [boolean]

Patch input options: -p, --patch Path(s) to ROM patch files or archives (supports globbing) (supported: .aps, .bps, .dps, .ebp, .ips, .ips32, .ppf, .rup, .ups, .vcdiff, .xdelta) [array] -P, --patch-exclude Path(s) to ROM patch files or archives to exclude from processing (supports globbing) [array] --patch-only Only write patched ROMs to the output directory [boolean]

ROM output path options (processed in order): -o, --output Path to the ROM output directory (supports replaceable symbols, see below) [string] --dir-mirror Use the input subdirectory structure for the output directory [boolean] --dir-dat-mirror Use the DAT subdirectory structure for the output directory [boolean] -D, --dir-dat-name Use the DAT name as the output subdirectory [boolean] --dir-dat-description Use the DAT description as the output subdirectory [boolean] --dir-letter Group games in an output subdirectory by the first --dir-letter-count letters in their name [boolean] --dir-letter-count How many game name letters to use for the subdirectory name [number] [default: 1] --dir-letter-limit Limit the number of games in letter subdirectories, splitting into multiple subdirectories if necessary [number] --dir-letter-group Group letter subdirectories into ranges, combining multiple letters together (requires --dir-letter-limit) [boolean] --dir-game-subdir Append the name of the game as an output subdirectory depending on how many ROMs a game has [choices: "never", "multiple", "always"] [default: "multiple"] --output-console-tokens Path to a JSON file of custom console token definitions to use instead of the built-in definitions [string]

ROM writing options: --fix-extension Read files for known signatures and use the correct extension (also affects dir2dat) [choices: "never", "auto", "always"] [default: "auto"] -O, --overwrite Overwrite any files in the output directory [boolean] --overwrite-invalid Overwrite files in the output directory that are the wrong filesize, checksum, or zip contents [boolean] --write-retry Number of additional retries to attempt when writing a file has failed (0 disables retries) [number] [default: 2]

move command options: --move-delete-dirs Delete empty subdirectories from the input directories after moving ROMs [choices: "never", "auto", "always"] [default: "auto"]

clean command options: -C, --clean-exclude Path(s) to files to exclude from cleaning (supports globbing) [array] --clean-backup Directory to move cleaned files to (instead of being recycled) [string] --clean-dry-run Don't clean any files and instead only print what files would be cleaned [boolean]

zip command options: --zip-format The structure format to use for written zip files [choices: "torrentzip", "rvzstd"] [default: "torrentzip"] -Z, --zip-exclude Glob pattern of ROM filenames to exclude from zipping [string] --zip-dat-name Group all ROMs from the same DAT into the same zip archive, if not excluded from zipping (enforces --dat-threads 1) [boolean]

link command options: --link-mode File linking mode [choices: "hardlink", "symlink", "reflink"] [default: "hardlink"] --symlink-relative Create symlinks as relative to the target path, as

Extension points exported contracts — how you extend this code

ParsedPathWithEntryPath (Interface)
* A ParsedPath that carries ArchiveEntry path information. [1 implementers]
src/modules/candidates/utils/outputFactory.ts
ZstdBinding (Interface)
* Interface for the zstd native binding and high-level API.
packages/zstd-1.5.5/index.ts
OptionsProps (Interface)
(no doc) [1 implementers]
src/models/options.ts
ICentralDirectoryFileHeader (Interface)
(no doc)
packages/zip/src/centralDirectoryFileHeader.ts
CHDInfo (Interface)
(no doc)
packages/chdman/index.ts
ZlibBinding (Interface)
(no doc)
packages/zlib-1.1.3/index.ts
LocalFileHeader (Interface)
(no doc)
packages/torrentzip/src/tzWriter.ts
TestOutput (Interface)
(no doc)
test/igir.test.ts

Core symbols most depended-on inside this repo

parse
called by 842
src/modules/argumentsParser.ts
map
called by 531
src/async/mappableSemaphore.ts
rm
called by 323
src/utils/fsUtil.ts
getName
called by 302
src/modules/candidates/utils/outputFactory.ts
getTempDir
called by 282
src/globals/temp.ts
get
called by 243
src/cache/cache.ts
filter
called by 243
src/modules/dats/datFilter.ts
mktemp
called by 237
src/utils/fsUtil.ts

Shape

Method 1,132
Class 313
Function 206
Interface 81

Languages

TypeScript95%
C++5%

Modules by API surface

src/models/options.ts143 symbols
src/models/dats/game.ts56 symbols
src/models/files/file.ts44 symbols
src/utils/fsUtil.ts42 symbols
packages/chdman/binding.cpp39 symbols
src/models/patches/vcdiffPatch.ts29 symbols
packages/zstd-1.5.5/binding.cpp27 symbols
src/modules/candidates/utils/outputFactory.ts26 symbols
src/models/files/archives/archiveEntry.ts26 symbols
src/console/singleBar.ts26 symbols
src/cache/cache.ts21 symbols
src/modules/candidates/candidateWriter.ts20 symbols

For agents

$ claude mcp add igir \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact