Release highlights
Each release of Igir strengthens my belief that it continues to be the most powerful, flexible, and feature-rich ROM manager available. This release includes probably 100 hours of effort, which I hope is visible.
Almost every page of documentation has been updated for accuracy, completeness, and clarity. A new page with guiding principles has been added to better explain the intentions of Igir and its behavior.
Thank you to everyone who contributes to the project in any way. Thank you to long-time sponsors @dcramer, @rommapp, and @chrisdrackett; and thank you to everyone who sponsors privately or one-off. Thank you to users who submit detailed bug reports respectfully, and thank you to users who submit thoughtful feature requests.
As is tradition, I like to include some Igir by the numbers on major version releases:
- 38k lines of code and documentation changed since v4.3.2
- 16 community members have contributed code or documentation (+7/+78% from v4.0.0)
- 803 stars on GitHub (+260/+48% from v4.0.0)
- 52k lifetime downloads across all channels (+15.5k/+42% from v4.0.0)
Now, onto the good stuff...
⛓️ Modern compilation
The binaries included in GitHub releases are now compiled with Bun. Bun is a JavaScript runtime and bundler recently acquired by Anthropic (the makers of Claude Code). Bun outperforms Node.js/V8 on most startup time and execution speed benchmarks, and crucially, has native tools to bundle JavaScript into executables.
Igir will remain compatible with Node.js, no Bun-exclusive libraries will be used.
🏎️ Huge performance improvements
Making Igir compatible with Bun unlocked the ability to use Bun's profiler, which is much easier to work with than Node.js'. The profiler helped provide insight into wasted CPU cycles and memory allocations. This release should make Igir the fastest it's been in a long time, no matter what runtime is used.
Many of the speedups are coming from optimizations in concurrency/promise management. To keep contention (and I/O thrash) low, the default reader thread count has been reduced 8→6, and the reader thread count has been reduced 4→3.
All of this performance profiling also led to...
🗄️ Cache performance, structure improvements
Some major improvements have been made to caching behavior:
- These calculations are now stored under file checksum(s) rather than file paths, eliminating cache misses due to file moves:
- ROM headers
- File signatures (for extension correction, trim detection)
- ROM paddings (of trimmed files)
- TorrentZip validations are now cached, speeding up candidate generation.
- File checksums calculated when testing output files are now stored in the cache, speeding up subsequent scans. Thank you, @noah978, for the suggestion!
- ROM headers, file signatures, and ROM paddings are now keyed in a way that won't invalidate existing cache entries when support for more headers, signatures, and paddings is added.
Unfortunately, to support Bun, the cache format needed to change, so your existing cache files can't be used and will be overwritten. But the new, standardized format can now be analyzed by humans, and it's better documented.
Other features
Several new CLI options have been added:
- A
--playlist-mode <mode>option was added to allow creating playlists of single-disc games. Thank you, @dmitriibaboshin, for the suggestion! - Some new options were added to control input file preference. Thank you, @chrisdrackett, for the suggestion!
--prefer-filetype <mode>will prioritize "plain" files over archived files, or vice versa.--prefer-filename-regex <pattern>will prioritize some filenames over others.
- An
--output-console-tokens <path>option was added to allow users to define their own output path tokens. Thank you, @d0k3, for the suggestion!
Other improvements
Many improvements and bug fixes have been implemented, some notable ones being:
.7zand.gzarchives are now parsed & extracted without using an external7zabinary. This was somewhat necessary to unlock executable bundling with Bun.- Per-file progress bars have been added to DAT/ROM/patch scanning, ROM trim detection, raw archive checksum calculation, output testing, and directory cleaning.
- DAT files can be downloaded from
http://URLs in addition tohttps://now. Thank you, @Ooopz, for the bug fix! - Multi-disc games in HTGD DATs won't have their output paths needlessly nested. Thank you,@JosVerheij, for the bug fix!
All changes
20 April 2026 - 9a0e251 - v5.0.0 (#2201)
20 April 2026 - c1f5ca2 - Chore: update dependency dolphin-tool to v0.2603.3 (#2200)
20 April 2026 - ef08dc4 - Chore: update dependency maxcso to v0.1130.15 (#2199)
20 April 2026 - eb42002 - Chore: update dependency typescript to v6.0.3 (#2197)
19 April 2026 - 18051ae - CI: fix: Bun bundling external executables (#2196)
19 April 2026 - e693cc6 - CI: fix: Bun compilation on Linux (#2195)
19 April 2026 - 21f2c63 - Docs: page moves (#2194)
19 April 2026 - 71a8cd3 - Refactor: Bun compilation tweaks (#2192)
19 April 2026 - 68a9389 - Chore: pin dependency click to ==8.2.1 (#2193)
19 April 2026 - e00e7b3 - Docs: major update (#2131)
19 April 2026 - 204aa76 - Feature: add additional patch logging (#2190)
19 April 2026 - df34641 - Refactor: don't lock anything if cache key is present and doesn't need recomputing (#2191)
19 April 2026 - 1749a72 - Fix: exclude duplicate "duplicate" and "unused" file paths from reports (#2189)
18 April 2026 - 026721f - Refactor: prevent mutex deadlocking, pending mutex eviction (#2188)
18 April 2026 - 05f5edb - Refactor: cache type version to reduce cache busting (#2187)
18 April 2026 - 2268f42 - Chore: update dependencies (#2186)
18 April 2026 - 560ede1 - Fix: DirectoryCleaner, ROMTrimProcessor progress bars (#2185)
18 April 2026 - 349ab82 - Feature: cache TorrentZip validation (#2184)
18 April 2026 - 0055424 - Fix: increase XML entity expansions for MAME DATs (#2182)
18 April 2026 - d29d33f - Fix: don't block archive raw-writing because of patching (#2183)
18 April 2026 - 73ef448 - Fix: zip moved input files, don't delete moved output files (#2181)
17 April 2026 - 48f9121 - Fix: don't duplicate output path for multi-roms that include path (#1864)
17 April 2026 - 0cefe2b - Fix: cache ROM signatures, headers under trimmed checksums (#2180)
17 April 2026 - c91d74e - Refactor: cache ROM signatures, headers under trimmed checksums (#2179)
17 April 2026 - 01913c0 - Refactor: cache ROM paddings under trimmed checksums (#2178)
16 April 2026 - 03b50a8 - Chore: update dependency typescript to v6 (#2138)
16 April 2026 - f26669e - Refactor: don't block archive raw-writing because of patching (#2174)
16 April 2026 - 870ceae - Refactor: breaking: store modified time seconds in cache (#2177)
16 April 2026 - f93af77 - Fix: MAME DAT props, entity processing (#2176)
16 April 2026 - 2471372 - Feature: add more option combination warnings (#2172)
16 April 2026 - 667a5fd - Feature: exclude junk files from DAT, ROM, & patch scanning (#2171)
15 April 2026 - 0210358 - Refactor: progress bar efficiency, consistent colors (#2170)
15 April 2026 - defa7e0 - Feature: progress bars for zip testing and trim detection (#2169)
15 April 2026 - 95e3484 - Refactor: eliminate needless nested semaphores (#2175)
15 April 2026 - 2f6cb83 - Fix: only sometimes normalize path separators before glob interpretation (#2167)
15 April 2026 - 8d1b685 - Refactor: increase trace log detail in CandidateGenerator (#2173)
15 April 2026 - ee180b6 - Fix: language & region preferences with multiple values (#2168)
14 April 2026 - 4dc91b9 - Chore: Bump vite from 8.0.3 to 8.0.8 (#2165)
14 April 2026 - 08d9d0a - Chore: update dependency Pillow to v12.2.0 [SECURITY] (#2166)
10 April 2026 - ea25618 - Chore: update dependency eslint-plugin-unicorn to v64 (#2164)
10 April 2026 - f1a2462 - Chore: update Bun to v1.3.12 (#2162)
4 April 2026 - 72871cf - Chore: update volta-cli/action action to v5 (#2159)
2 April 2026 - db9705b - Chore: update ESLint (#2158)
1 April 2026 - fa22d6e - Feature: progress bars for archive entry checksum calculation (#2154)
31 March 2026 - 2cc5516 - Chore: update dependency chdman to v0.287.0 (#2156)
31 March 2026 - a060e76 - Chore: update Node.js to v24.14.1 (#2152)
31 March 2026 - aff53e5 - CI: fix: install current version of Go (#2157)
29 March 2026 - 37f9bb5 - Chore: update codecov/codecov-action action to v6 (#2153)
28 March 2026 - 4dc38af - Chore: update lockfile (#2151)
28 March 2026 - d83825a - Refactor: log unused archives with every file (#2150)
28 March 2026 - 50b2d8e - Chore: update lockfile (#2149)
28 March 2026 - 50d89c7 - Refactor: precompile some commonly used regex (#2148)
28 March 2026 - 4643205 - Chore: update dependency @vitest/eslint-plugin to v1.6.13 (#2147)
28 March 2026 - 3f121a4 - Refactor: normalize path separators consistently (#2139)
28 March 2026 - 16f91bf - Chore: update dev dependencies (#2145)
28 March 2026 - f682027 - CI: make the conventional commit error clearer (#2146)
28 March 2026 - 5fe7255 - Chore: update ESLint (#2144)
28 March 2026 - 65a8b9e - Chore: update dependencies (#2142)
27 March 2026 - 32294e2 - Chore: update dependency mkdocs-material to v9.7.6 (#2143)
27 March 2026 - d0c17d1 - Chore: update GitHub Actions (#2136)
27 March 2026 - 90fe978 - Chore: pin dependencies (#2137)
27 March 2026 - d6800ab - Refactor: cache Intl.NumberFormat (#2135)
27 March 2026 - f12a68e - Refactor: breaking: use seconds for modified times in cache (#2134)
27 March 2026 - 8d0d628 - Chore: update dependency dolphin-tool to v0.2603.2 (#2141)
25 March 2026 - 5c0b6a8 - Chore: update Bun to v1.3.11 (#2132)
25 March 2026 - 9b7f88a - Chore: update EndBug/version-check action to v3 (#2133)
24 March 2026 - 9fd3f7f - Refactor: custom ESLint rules (#2114)
24 March 2026 - 9b6d5a0 - Refactor: breaking: scan & match the output directory when necessary (#2129)
24 March 2026 - a6c6b62 - Feature: support http protocol (#2130)
22 March 2026 - 5552c87 - Feature: compile with Bun (#2085)
21 March 2026 - 670ac26 - Refactor: breaking: delete matched input files even if not overwriting (#2126)
21 March 2026 - 7ca27c6 - Chore: pin dependency ajv to 8.18.0 (#2128)
21 March 2026 - 595af9a - Feature: external console tokens file (#2124)
21 March 2026 - 781b5da - Fix: match ROMs/files with all available checksums (#2119)
21 March 2026 - 4a4c247 - Fix: don't extract when an archive can't be used as-is (#2127)
20 March 2026 - 457ab6d - Chore: update dependency dolphin-tool to v0.2603.1 (#2125)
20 March 2026 - c60068c - CI: implement missing tests (#2118)
20 March 2026 - 0319201 - Feature: filename & file type preference options (#2123)
20 March 2026 - 4688424 - Chore: update dependency fast-xml-parser to v5.5.7 [SECURITY] (#2122)
19 March 2026 - 8de6983 - Feature: option to write a debug log file (#2110)
19 March 2026 - 1b38e54 - Feature: input checksumming & output testing progress bars (#2121)
18 March 2026 - 21b4b7f - Refactor: only repaint changed log lines (#2117)
18 March 2026 - 2138ce8 - Chore: update dependency fast-xml-parser to v5.5.6 [SECURITY] (#2116)
17 March 2026 - cc65928 - Chore: update dependency dolphin-tool to v0.2603.0 (#2115)
16 March 2026 - d1595df - Chore: update release-drafter/release-drafter action to v7 (#2113)
16 March 2026 - 33360b7 - Chore: update dorny/paths-filter action to v4 (#2112)
15 March 2026 - 8b16a3e - CI: run tsc --noEmit when linting (#2111)
14 March 2026 - 63531b9 - Refactor: progress bar & logging tweaks (#2109)
14 March 2026 - b5d665e - Feature: allow merged disc games to have separate raw-copied archives (#2108)
13 March 2026 - 7f07414 - Chore: update dependency CairoSVG to v2.9.0 [SECURITY] (#2107)
13 March 2026 - bf76358 - Feature: playlist mode for single-disc games (#2104)
13 March 2026 - a092370 - Fix: allow "raw" CHD candidates for CD-ROM and GD-ROM (#2100)
12 March 2026 - def9e50 - Chore: update ESLint (#2103)
12 March 2026 - f456962 - Refactor: breaking: use a portable cache serialization format (#2097)
12 March 2026 - 7b4507b - Refactor: native addon code optimizations (#2101)
12 March 2026 - 6b0a944 - Feature: cache the checksums of tested output files (#2098)
12 March 2026 - 7abf26a - CI: rename "requests-for-comment" label to "comments-requested" (#2102)
12 March 2026 - 8ed8e77 - Refactor: optimize TorrentZip & zip code (#2099)
11 March 2026 - 81954cb - Refactor: delete DriveSemaphore (#2095)
11 March 2026 - 0a42400 - Chore: update dependency chdman to v0.286.2 (#2096)
11 March 2026 - ad125c0 - Chore: update dependency maxcso to v0.1130.13 (#2094)
11 March 2026 - 037b60f - Chore: update dependency tar to v7.5.11 [SECURITY] (#2092)
11 March 2026 - f5a52d9 - Refactor: StreamPoly cleanup (#2091)
11 March 2026 - db7c295 - Refactor: increase KeyedMutex efficiency (#2090)
11 March 2026 - 4786d95 - CI: add 'request-for-comment' GitHub label (#2089)
10 March 2026 - 1877fc7 - Chore: pin oven-sh/setup-bun action to ecf28dd (#2088)
10 March 2026 - e7a91a2 - Feature: clearer update checker instructions (#2087)
10 March 2026 - f8b0a4a - Refactor: address possible promise leaks (#2086)
10 March 2026 - d581b7a - CI: run tests with Bun (#2082)
9 March 2026 - 7d81bee - Fix: npm run start not working with import attributes (#2084)
8 March 2026 - 32df813 - Refactor: use static import paths for native addons (#2038)
8 March 2026 - 03731e8 - Fix: set LZMA_NATIVE_DISABLE=1 at runtime (#2083)
8 March 2026 - 10efea9 - Refactor: graceful-fs cleanup (#2081)
8 March 2026 - d4adeec - Refactor: use native Node.js code for extracting 7z (#2068)
8 March 2026 - de8eb89 - Chore: update dependency maxcso to v0.1130.12 (#2079)
8 March 2026 - 7293f70 - Chore: update dependency dolphin-tool to v0.2512.1 (#2078)
8 March 2026 - 4d570df - Chore: update dependency chdman to v0.286.1 (#2077)
8 March 2026 - c43df2a - Chore: update docker/setup-qemu-action action to v4 (#2076)
5 March 2026 - e68591c - CI: don't comment dependency hold if none are held (#2075)
5 March 2026 - 7e7d089 - Chore: update dependency tar to v7.5.10 [SECURITY] (#2074)
5 March 2026 - d190e64 - CI: replace Jest with Vitest (#2031)
5 March 2026 - d842d14 - Refactor: remove util.promisify(fs.*)() calls (#2073)
5 March 2026 - 7f68595 - Refactor: replace graceful-fs with custom code (#2071)
3 March 2026 - 5c92a4d - Chore: update dependency chdman to v0.286.0 (#2070)
3 March 2026 - 48eddb1 - Docs: add examples for other CRC32s in patch filename formats (#2069)
3 March 2026 - 358662c - Refactor: use native Node.js libraries for extracting gzip (#2066)
1 March 2026 - 311a2b3 - Chore: update actions/upload-artifact action to v7 (#2062)
1 March 2026 - 0bfc23f - Chore: update lockfile (#2064)
1 March 2026 - bcd88fb - Chore: update Node.js to v24.14.0 (#2063)
28 February 2026 - 0e7fd2e - Chore: update lockfile (#2061)
28 February 2026 - 43b7e37 - Chore: update actions/download-artifact action to v8 (#2052)
28 February 2026 - ee75583 - Chore: update dependency fast-xml-parser to v5.3.8 [SECURITY] (#2057)
28 February 2026 - 3de302a - Chore: update lockfile (#2060)
27 February 2026 - 25c0927 - Chore: update ESLint (#2055)
27 February 2026 - 2cd7d30 - Chore: update dependency mkdocs-material to v9.7.3 (#2058)
27 February 2026 - bf08b4c - Chore: update docs dependencies (#2056)
27 February 2026 - 9a98a2e - Chore: update dev dependencies (#2054)
27 February 2026 - e949d61 - Chore: update GitHub Actions (#2051)
27 February 2026 - cf9a021 - Chore: update dependencies (#2053)
24 February 2026 - a71c631 - CI: upload compiled binaries to draft release (#2050)