top of page
loading_reduced.jpg

0.24.0 / 28-09-2026

No ratings yet

Performance

No ratings yet

Features

No ratings yet

OxyROMon

Accuracy

competition

OxyROMon is a cross-platform opinionated CLI ROM organizer written in Rust. Like most ROM managers, it checks ROM files against known good databases. It is designed with archiving in mind, as such it only supports original and lossless ROM formats. Sorting can be done in regions mode, in so-called 1G1R mode, or both. Please check Git for more details.

...

Most Recent Changes

--0.24.0--

Features

  • Added ROM sorting to the web UI, for a single system or all of them at once

  • Added an integrity check to the web UI, for a single system or all of them at once

  • Added a purge dialog to the web UI, for missing, orphan, trashed, and foreign ROM files

  • Added ROM format conversion to the web UI, for a single system

  • Added a multiple-matches option (first match or skip) to the web UI's import dialog

  • Added patch file import to the web UI, for a single ROM

  • Added PlayStation 3 IRD import and purge to the web UI

  • Added M3U playlist generation to the web UI, for every system at once

  • Added the PREFER_FORMAT per-system setting: ROMs imported into a system are automatically converted to its preferred format, import-roms --as-is skips the conversion

  • convert-roms now accepts --save to persist the destination format as the processed systems' PREFER_FORMAT

  • Added a Prefer Format dropdown to the web UI's per-system settings dialog


Changes

  • NSP/NSZ support now comes from the nsz-rs crate instead of the external nsz tool, with a progress bar during (de)compression

  • prod.keys is now only needed to compress NSPs containing NCAs, and info says when it is missing

  • Moved the nsz-rs and xso-rs crates into this repository under crates/; their CLIs (nszrs, xsors) ship in the release archives

  • GDI conversion now comes from the new gdi-rs crate, a port of gdidrop, with a progress bar; its CLI (gdirs) ships in the release archives too

  • CSO/ZSO support now comes from the xso-rs crate instead of the external maxcso tool, with a progress bar

  • CUE/BIN to ISO conversion is now built in, ported from bchunk, which is no longer needed; a BIN too short for the track its CUE describes is an error rather than a short ISO

  • Games with one bin per track now export to ISO, keeping the first track

  • CSO conversions now use 8 KiB blocks, 16 KiB past 2 GiB, for files around 4% smaller

  • ZSO conversions stay at 2 KiB blocks, the only size Open PS2 Loader reads

  • sort-roms now accepts --system to sort named systems without an interactive prompt

  • check-roms now accepts --system to check named systems without an interactive prompt

  • import-patches now accepts --rom <ID> to select the target ROM by id, skipping the prompts

  • import-irds and purge-irds now accept --system <NAME> to run unattended; import-irds then matches each IRD to the one game of the same title, and refuses it when there is none or several


Improvements

  • Only show the IRD import and purge actions in the web UI's system menu for PlayStation 3 systems

  • Added a leading glyph to the web UI's system, game, and ROM rows, so the completion state is legible without colour

  • Grouped the purge dialog's options by risk, with a warning style on the file-deleting ones

  • Applied the orange brand colour to the web UI and set the page title to oxyROMon

  • Refined web UI copy and accessibility: a labelled games filter, clearer import and settings wording, and a page description

  • Narrowed the web UI's default pane split, giving the games list more room

  • Grouped the web UI's actions by what they act on: Upload (ROMs, DATs) and Download (DATs) menus in the navbar, a menu in the Systems panel's header for what runs on every system (check, sort, playlists, purge), and each system's own menu as before; a menu gives way to a spinner until its action has finished on the server, so actions cannot be stacked

  • Added a light-mode variant of the logo, so it stays legible on the white navbar and About dialog

  • Added a per-system completion count to the web UI's system list (e.g. "482/500")

  • Let every file picker in the web UI take a dropped file, the IRD and patch dialogs' included

  • Made the web UI's games list a WAI-ARIA listbox, navigable with the arrow, Home, End, Enter, and Space keys


Fixes

  • Fixed import-patches panicking on every CLI invocation, the patch file list was read from an undeclared argument name

  • Fixed xdelta3 patching swapping the output and patch arguments, overwriting the patch instead of producing the patched ROM

  • Fixed the web UI's sort, check, convert, and purge-system actions panicking on an unknown system_id

  • Fixed the web UI's dialogs closing as soon as a value was picked from a dropdown inside them

  • Fixed the web UI not showing what an import changed: ROM and DAT imports now refresh the selected system's games and ROMs as well as the systems list, rows whose data changed are redrawn, and actions such as sort no longer lose the selected game when they refresh

  • Fixed web UI background actions hanging forever when a database connection could not be acquired; they now emit an SSE error

  • Fixed the web UI's settings and action mutations panicking when a database connection could not be acquired

  • Fixed overlapping system name patterns (e.g. PlayStation and PlayStation 3) causing the same system to be sorted, checked, or converted twice

  • Fixed the web UI's statistics cards being cut off at the right edge at some window widths

  • Fixed GDI exports into the CUE/BIN's own directory overwriting its data tracks

  • Fixed GDI conversion of a CUE with several tracks in one bin, which wrote the whole bin for every track

  • Fixed GDI conversion placing a track at sector 45000 on comments that merely contain HIGH-DENSITY AREA, unlike gdidrop



--0.23.0--

Features

  • Added opt-in Zstandard compression for 7z and ZIP archives

  • Added ROM upload and URL download to the web UI


Changes

  • Updated shiratsu-naming to 1.1.0 (token variants are now struct variants)


Improvements

  • Merged the duplicate skip and dim progress styles into one

  • Removed the single-caller print_dependency helper from util

  • Reused the existing to_hex helper in header rule matching

  • Removed the async-once-cell dependency in favor of std::sync::LazyLock

  • Replaced the small phf setting maps in config with match statements

  • Collapsed the three identical variant validators into one generic validator

  • Collapsed the three identical DataLoader loaders into one generic loader

  • Merged the identical trashed and orphan ROM file purge paths

  • Deduplicated the prompt helpers in prompt

  • Routed all setting writers through a single upsert helper in config

  • Shrunk the tool availability checks in convert-roms and export-roms

  • Parameterized the four system size resolvers into one query

  • Routed all get_version implementations through a shared helper in util

  • Replaced the spinner begin/end boilerplate with start_action and stop_action

  • Broadcast server events through a shared sse_send helper

  • Deduplicated the convert and export pipelines with shared game-selection and rom-loading helpers


Fixes

  • Regenerated .sqlx/ offline query data to include #[cfg(test)]-gated queries

  • Restricted the web UI's URL download to http/https, with a connect timeout and a 100 GiB size cap



--0.22.0--

Features

  • Added per-system settings, with automatic fallback to the global value

  • Added -n/--system flag to config to scope operations to a specific system (supports % globs)

  • Added per-system settings to the web UI, from a dropdown on each system entry

  • Added romfile download support to the web UI

  • Added an About modal to the web UI, showing version, dependencies and statistics

  • Added DAT import to the web UI

  • Added Redump DAT download and update to the web UI

  • Added notification history to the web UI

  • Added -u/--update flag to import-dats to only import DATs for systems already in the database

  • Improved ZIP support in import-dats to find .dat files in subdirectories (supports daily dat-o-matic packs)

  • Added an optional native desktop app built with Tauri, sharing the CLI's database and settings

  • Added an optional nod feature to handle RVZ and WBFS natively instead of shelling out to dolphin-tool and wit

  • Added an optional sevenz feature to read archives and write ZIP natively instead of spawning 7-Zip

  • Added real progress bars to RVZ and WBFS conversions with the nod feature


Changes

  • Rewrote the web UI in Rust using Leptos, replacing the Svelte/Flowbite frontend

  • Rebuilt the web UI on Web Awesome components

  • Dropped Tailwind CSS, the UI is now styled by Web Awesome and a small stylesheet

  • Made the web UI's three columns resizable, positions are remembered across visits

  • Restored the per-field descriptions in the settings dialog

  • Replaced the SKIP_PNPM build environment variable with SKIP_TRUNK

  • Replaced the cdfs git dependency with a native ISO 9660 reader vendored from opticaldiscs


Improvements

  • Sizes and notification times in the web UI now follow the reader's locale

  • Notifications in the web UI now stack instead of replacing one another

  • Checking an RVZ no longer extracts it to a temporary ISO with the nod feature

  • Optimized dependencies in the dev profile, debug builds and the test suite are much faster

  • Overhauled web UI colors for improved readability in both light and dark themes

  • Fixed statistics table header color in light mode to match the systems and games table headers

  • Overhauled CLI output for a cleaner, more consistent terminal experience

  • Progress bars and log messages no longer overlap or corrupt each other

  • Standardized messaging across all commands with clear icons and color coding

  • Improved check-roms output with per-system pass/fail summary

  • Revamped statistics card in the web UI with a tiled layout

  • Revamped settings modal in the web UI with a two-column layout for easier navigation

  • Cleaned up the entire codebase to be clippy-clean (~900 warnings)

  • Modernized idioms: std::sync::LazyLock over lazy_static, no more extern crate

  • Simplified the main() subcommand dispatch using matches.subcommand() destructuring

  • Removed dead code, test-only helpers are now gated behind #[cfg(test)]

  • Migrated error handling from simple-error to anyhow, errors now carry a full context chain

  • Extracted the hashing and comparison helpers out of CommonRomfile

  • Deduplicated the partition-by-extension blocks in convert-roms and export-roms (~560 lines)

  • Unified convert-roms/export-roms CSO and ZSO handling behind a shared decoding layer (~440 lines)

  • Moved convert-roms/export-roms NSZ, RVZ and WBFS handling onto the shared decoding layer

  • Simplified convert-roms CHD handling

  • Simplified convert-roms back-to-original handling

  • Extracted CUE/BIN and CHD parsing helpers into transcode.rs

  • Added a run_tool helper that centralizes external tool invocation


Fixes

  • Fixed RVZ_COMPRESSION_ALGORITHM never having worked when set to bzip2, it was spelled bzip

  • Fixed the notification list in the web UI not opening, it was clipped by the navbar

  • Fixed the notification count badge sitting off the bell in the web UI

  • Fixed the system actions menu in the web UI being clipped by its pane, and given proper alignment and hover

  • Fixed the statistics card shifting up in the web UI whenever a modal opened

  • Fixed the server not shutting down cleanly on Ctrl+C when SSE clients were connected

  • Fixed convert-roms -f rvz --recompress leaving a stray intermediate .iso

  • Fixed convert-roms -f chd failing on standalone RIFF (LaserDisc) images

  • Fixed convert-roms -f original and export-roms -f original mispartitioning Switch files



--0.21.0--

Features

  • Added sorting options for arcade systems

  • Added -e/--extension flag to import-dats for setting custom extensions on original ROMs in the system

  • Added support for exporting Dreamcast Redump images to GDI format in export-roms (based on gdidrop, credits to feyris-tan)

  • Added -d/--delete flag to import-roms for hard deletion of unmatched and duplicate ROMs (alternative to --trash)

  • Added -s/--save flag to download-dats for optionally saving downloaded DAT files to a specified directory

  • Added purge system buttons in the frontend

  • Added automatic detection of CHD parents in import-roms, provided they are in the same directory

  • Added a romfiles card to the frontend

  • Added new purge-irds subcommand to unassociate games from IRD files

  • Moved invalid/duplicate ROM files in subdirectories of the Trash directory in import-roms

  • Appended the first computed checksum to the trashed ROM filenames in import-roms

  • Added an SSE endpoint for sending events to the web UI


Changes

  • Retired the hash algorithm override in import-roms

  • Repurposed the -a flag in import-roms to import files as-is (now supports non-original formats in DAT files)

  • Improved ROM matching in unattended mode using similarity scoring

  • Rewrote the frontend using Svelte/Flowbite

  • Expanded on the -u flag of import-roms, now provides 2 options: skip (default) and first


Fixes

  • Fixed an infinite loop when importing DAT files containing invalid parent references

  • Fixed playlist names for games having stuff after the disc number

  • Fixed JB folder game completion

  • Fixed simultaneously importing ROM files that are shared between 2 or more systems (e.g. Commodore Amiga and Atari ST)

  • Fixed importing of empty files, they are now ignored in import-roms and automatically created when a partial game needs them for completion



--0.20.2--

Add a new wanted game state in the web UI, replaces incomplete which now means games with some (but not all) its ROMs

Fix a regression when importing multi-track CHDs which contain tracks identical to other games

Fix parsing archives containing files with = signs in their names

Fix several issues affecting the import of MAME DATs

Fix regressions in rebuild-roms

Add a -f flag to rebuild-roms to force rebuilding with the same strategy



--0.20.1--

  • Fix an import issue with Progetto MAME DATs

  • Leave arcade CHDs untouched in convert-roms and rebuild-roms

  • Fix a regression preventing directory imports

  • Fix a crash in sort-roms when ROMs have no extension



--0.20--

  • Dump isoinfo in favor of the native cdfs crate to parse IRD ISO headers

  • Add a -x flag to import-roms to extract top-level archives before importing their contents

  • Allow ordering CHD compression algorithms

  • Use the new splitbin feature in chdman 0.265+, fixes Dreamcast CHD imports

  • Add a new import-patches subcommand

  • Add a new create-dats subcommand

  • Fix special chars handling in 7z

  • Make the ROM directory portable by storing relative paths internally

  • Optimize the database upon exiting

  • Add support for CHD HD and LD formats

  • Allow importing multi-track CHDs without a CUE file (requires chdman 0.265+)

  • Use mimetype infering using file magic where possible

  • Add support for disk tags in the MAME CHDs DAT

  • Apply GROUP_SUBSYSTEMS to custom system names as well

  • Autodetect MAME DATs as arcade and remove the -a flag in the import-dats subcommand

  • Iterate over all hash algorithms when matching and checking roms in all subcommands

  • Remove the HASH_ALGORITHM setting

  • Add support DATs with no size information such as the MAME CHD DATs

  • Parse CHDs data SHA1 and match against it first where applicable when importing CHDs

  • Support importing MAME CHDs based on the CHD SHA1 contained in the DAT (aka not the actual data SHA1)



--0.19.0-- 

  • Add a -n flag to import-dats to override the system name

  • Enhance the rom matching algorithm in import-roms to reduce prompts when multiple matches are found

  • Use createcd/createdvd and extractcd/extractdvd appropriately for CDs and DVDs

  • Add a -r flag to convert-roms to recompress files that already match the target format

  • Add configuration options for chdman

  • Add support for CHD parents, enable via the CHD_PARENTS settings

  • Add a -u flag to config to unset nullable settings

  • Add a -p flag to convert-roms to prompt for an optional CHD parent when converting to CHD

  • Change -s in various subcommands to accept SQL wildcards

  • Change -n to -g (for game) in various subcommands and make it accept SQL wildcards

  • Change -g to -o (for one g one r) in various subcommands

  • Add an option to scrub RVZ in export-roms

  • Fix reimporting an orphan archive containing multiple files or a CHD ROM in import-dats and download-dats

  • Sort CHD parent prompt by distance

  • Fix converting archives to another archive format

  • Fix an issue where converting an archive back to original would only delete the archive

  • Support 7zz and 7z on all systems, in that order

  • Improve the IRD game matching prompt when the IRD game name is all caps and the Redump name is not



--0.18.1--

  • Bump minimum required chdman version to 0.264 for dreamcast

  • Fix dreamcast system being skipped even with the correct chdman version



--0.18--

  • Replace async-std with tokio

  • Add an info subcommand to display basic system and dependencies information

  • Only generate playlists for complete sets of games

  • Exit gracefully in most places when missing an external program

  • Use 7zz instead of 7z on mac

  • Don't silently delete files in check-roms

  • Add support for ZSO

  • Add optional dependency on bchunk

  • Allow filtering games by name in check-roms

  • Traits! Makes parts of the code actually reusable

  • Add an optional post-conversion check

  • Fix importing a couple more bogus DAT files

  • Accept ZIP files as input for import-dats

  • Add a -u flag to import-roms to skip user prompts

  • Add a -s flag to convert-roms to select systems by name

  • Update the -s flag in import-roms to behave the same as in convert-roms

  • Add a -f flag in purge-roms to track and delete foreign files in the ROM directory

  • Add a new export-roms subcommand

  • Add support for WBFS in export-roms



--0.17--

  • Clean temporary files immediately in convert-roms

  • Include Non-Redump DATs in the grouped subsystems

  • Don't create empty directories

  • Fix paths displayed on Windows

  • Add support for importing CIA files



--0.16--

  • Use original names for PSN stuff

  • Add a language whitelist setting

  • Always name archives after the game name

  • Add support for NSZ

  • Expose most settings in the web UI

  • Make ignored status take precedence over complete status in the web UI

  • Additionally match the whole flag string to allow discarding specific flag combinations

  • Make purge-roms physically delete orphan ROMs



--0.15--

  • Use archive name and directory names in the archive when importing arcade games

  • Also use the file name in the archive when importing arcade games

  • Rework import-roms to only ask for a system when desired or necessary

  • Rework rebuild-roms to make it a lot faster

  • Fix completion computation for arcade systems

  • Don't automatically trash invalid roms, put the mechanic behind a flag

  • Add a flag to force import existing roms

  • Use native rust implementations by default (openssl-sys -> rustls, libz-sys -> miniz_oxide)



--0.14.1--

  • Fix game filtering in the web UI with the new 1G1R system



--0.14.0--

  • Add the ability to sort ROMs in alphabetical subfolders

  • Add a catch-all region ZZ in REGIONS_ALL for the sort-roms hybrid mode

  • Add a GROUP_SUBSYSTEMS toggle, if true merge variants of the same system in a single directory

  • Support MAME DAT files that use non-standard machine instead of game tags

  • Add various compression settings for 7Z, ZIP and RVZ

  • Add a new generate-playlists subcommand

  • Fix pure 1G1R sorting with parent-clone groups that have no ROMs

  • Add a REGIONS_ONE_STRICT option to switch between strict and lenient 1G1R election

  • Fix 1G1R sorting when revisions are clones

  • Display an appropriate message when a ROM has already been imported

  • Add a PREFER_FLAGS to give a boost to specific flags in the 1G1R election process

  • Add PREFER_PARENTS, PREFER_REGIONS and PREFER_VERSIONS settings to influence the 1G1R election process



--0.13.0--

  • Remove the ROM original extension from archives, it makes RetroArch name its saves differently between imported and non imported games

  • Fix the sort-roms prompt to proceed

  • Allow creating solid 7z archives

  • Skip games with unparseable names in import -dats

  • Fix successive import of invalid ROMs with the same name in import -roms

  • Greatly speed up purge -systems



--0.12.0--

  • Change --missing to --wanted in sort -roms to avoid confusion with the same purge -roms flag

  • Add a purge -systems subcommand (WIP)



--0.11.1--

  • Fix import-roms CLI flags

  • Fix import-roms 7Z CRC parsing



--0.11.0--

  • Put CHD, CSO and RVZ support behind features

  • Add support for PS3 IRD files, along with a new import-irds subcommand

  • Add support for PS3 updates and DLCs

  • Allow selecting the checksum algorithm in import-roms (useful for JB folders which only provide MD5)

  • Add a new benchmark subcommand (Linux only for now) to measure the performance of checksum algorithms

  • Support moving files across different filesystems

  • Fix a parsing issue on DAT files with duplicate "clrmamepro" fields



--0.10.1--

  • Fix RVZ conversion



--0.10.0--

  • Fix version sorting in 1G1R when parent is missing or unwanted

  • Treat the first elligible clone as parent in 1G1R when parent is missing

  • Greatly improve completion calculation in sort-roms

  • Add support for the Atari 7800 header definition

  • Embed some no-intro header definitions and use them as fallback

  • Add initial support for arcade systems

  • Add a new rebuild-roms subcommand for arcade ROM sets

  • Add support for RVZ via dolphin-tool

Show Previous Changes

--0.9.0--

  • Use transactions for increased database performance

  • Add an optional GraphQL API and a basic web UI, behind the server feature

  • Store ROM files' actual size in database

  • Store system and game completion status in database

  • Store game sorting in database (all regions, one region, ignored)



--0.8.1--

  • Use a database connection pool

  • Fix importing archives with invalid files


--0.8.0--

  • Add a new download-dats subcommand

  • Use dialoguer for prompts

  • Support importing ISO compressed as CHD

  • Support converting between ISO and CHD

  • Support converting directly between supported formats (as opposed to having to revert to original beforehand)

  • Optionally print statistics after each conversion


--0.7.0--

  • Use shiratsu_naming to parse No-Intro names

  • Drop releases, we don't need them

  • Delete obsolete roms when importing updated dats and automatically reimport orphan romfiles

  • Move failed imports to the trash directories

  • Fix headered ROMs handling

  • Add a unique constraint to the settings::key column

  • Simplify discard settings, please refer to the new documentation

  • Remove the ability to delete a setting

  • Allow purge-roms to delete orphan romfiles

  • WARNING The internal region format is now TOSEC's, all DATs need to be reimported for this change to take effect.


--0.6.0--

  • Replace refinery with sqlx migrate

  • Add a check-roms subcommand


--0.5.0--

  • None reported


--0.4.0--

  • None reported


--0.3.0--

  • None reported


--0.2.2--

  • None reported


--0.2.1--

  • None reported

bottom of page