Batch Convert to CHD is a high-performance cross-platform desktop utility designed to streamline the conversion of various disk image formats into the Compressed Hunks of Data (CHD) format.
- Dual-Pane Interface: View your settings and file list on the left, while monitoring real-time process logs on the right.
- Interactive File Selection: Automatically scans folders and allows you to manually pick exactly which files to process via a detailed file list.
- Optimized File Loader: Utilizes a chunked loading strategy to maintain UI responsiveness even when scanning directories with thousands of files.
- Resizable Layout: Includes a built-in grid splitter to adjust the balance between the file explorer and the terminal view.
- Native ARM64 & x64: Automatically detects your system architecture and uses the matching native
chdmanbuild for conversion on Windows. - OS-Native Tool Selection: On Windows ARM64 machines the native
chdman_arm64.exeis preferred even when the app itself runs emulated as x64, and a missing preferred binary falls back to the other architecture's build instead of failing. The built-in CHDSharp encoder is managed code, so it runs natively on every architecture. - Optimized Performance: Leverages native instructions on ARM64 hardware to reduce overhead during heavy compression tasks.
- Automated Batch Processing: Convert entire directories of disk images with real-time progress monitoring and immediate cancellation response.
- chdman Primary Encoding (Windows): On Windows conversions run on the bundled
chdman, the reference MAME CHD encoder. If chdman is missing or fails, the conversion automatically falls back to the built-in CHDSharp encoder (CHDSharpLib v1.4.3) running in-process β the project's own managed CHD encoder, whose output is byte-identical tochdman(verified across a 56-disc battle corpus). On Linux and macOS the built-in CHDSharp encoder is always used. An encoder always exists, so a batch never refuses to start for a missing encoder. - Recursive Structure Preservation: Maintains your original directory hierarchy in the output folder when processing subfolders.
- Robust Extraction: Supports extracting CHD files back to .cue (CD), .iso (DVD), .gdi (Dreamcast/Naomi), and .img (HDD) with intelligent metadata auto-detection using the CHDSharp library. If the built-in reader cannot decode a CHD (corrupt file or A/V laserdisc CHD), extraction automatically falls back to
chdmanβ includingextractld(AVI) /extractrawfor laserdisc CHDs. - Archive Integration: Transparently handles
.zip,.7z, and.rararchives, extracting and processing contents automatically while respecting cancellation tokens. Includes a bundled 7-Zip fallback (7za.exeon Windows,7zzon Linux/macOS) for archives the built-in extractor cannot read, including unsupported ZIP compression methods and.7zfiles. Split 7-Zip and ZIP volume sets (.7z.001/.zip.001with later parts beside them) are extracted with that bundled 7-Zip and converted like any other input; multi-part RAR sets (.partNN.rar, sets renamed to.001, and old-style.rar+.rNN) are decoded from their first volume, whichever part the batch offers, and only the first volume stays in the list so a set is converted once. - CloneCD Support: Convert CloneCD
.ccddisc images to CHD format via the CCDSharp library. Automatically generates CUE/BIN from.ccd/.imgsets. - CSO Decompression: Built-in support for
.csoand.ciso(Compressed ISO) files via the CSOSharp library (supports deflate/zlib and LZ4). - PBP Extraction: Convert PlayStation
.pbpfiles to CHD format via the PBPSharp library. Single- and multi-disc images authored by popstation, PSX2PSP, iPoPS and pop-fe all extract β including pop-fe's multi-disc containers and uncompressed/stored blocks β and a missing or corrupt PARAM.SFO leaves the disc convertible with empty metadata. Files without a PlayStation disc image (PSP homebrew applications, unsupported or corrupt variants) are detected and skipped with a clear message instead of a generic failure. - Smart CUE Normalization: Detects the actual encoding of
.cue/.tocfiles (UTF-8, Shift-JIS, Korean CP949, Cyrillic CP1251, Latin-1 and more), strips UTF-8 BOMs (which chdman's parser cannot handle β they produced the "couldn't find bin file []" error), resolves referenced files case-insensitively and zero-padding-tolerantly ((Track 2)vs(Track 02)), and hands chdman a self-contained, canonicalized cue set β eliminating the common "couldn't find bin file" failures on non-ASCII and BOM-prefixed cues. Bins are referenced in place via relative paths when possible, so no multi-hundred-MB copies are needed for BOM-only cues. - Raw Audio Track Handling: Cue files referencing
.rawaudio tracks (common in multi-track CD audio rips) are detected viaGameFileParser; chdman derives the 2352-byte unit size from the cue's track types, and the-us 2352unit-size flag is passed only tocreateraw(which requires it). - Archive Dependency Validation: Cues, GDI and TOC files extracted from archives are validated before conversion β if the referenced data files are missing from the archive (incomplete download, separate bin archive), the entry is skipped with a clear warning instead of failing inside chdman.
- MP3 Audio Track Support: Cue sheets with MP3 audio tracks β
cue/bin/mp3andcue/iso/mp3sets (common in Neo Geo CD and older PS1 rips) β are automatically decoded to WAV before conversion, because chdman cannot read MP3 tracks. The decoded WAVs are normalized to chdman's exact requirements (44.1 kHz, stereo, 16-bit PCM), with a built-in decoder fallback for systems without Media Foundation. - bin-only Archives: Archives that contain only
.binfiles (no.cue/.isodescriptor) now get an auto-generated cue and convert automatically (MODE2/2352 with automatic MODE1/2352 fallback).
A file's extension is the least reliable thing about it. Every input is identified by its leading bytes before the extension is trusted, which turns several "corrupt file" failures into successful conversions.
- Raw CD Dumps With the Wrong Name: A 2352-bytes-per-sector CD dump saved as
.iso,.img,.binor even.iszis recognised from its sector sync mark and mode byte, and converted as the CD it is with a generated cue. Previously these went tocreatedvdorcreatehdand failed onData size ... is not divisible by sector size. - Disc Images Wearing an Archive Extension: A
.raror.zipthat is really a plain disc image, or a byte-split set that was never an archive, is detected and converted instead of being reported as corrupt. - Bare
.binFiles: A raw.binwith no descriptor is accepted as an input and given a generated cue. When a sibling.cue/.ccd/.mdsalready covers it, the.binis dropped from the batch so the disc converts once, through its descriptor. - Honest Reporting: A truncated download, a file with the wrong extension and a genuinely unsupported format read differently in the log, each naming what was found and what to do about it.
- Alcohol 120% / Daemon Tools:
.mds/.mdfsets convert directly. The descriptor's track table is parsed to build a matching cue, descriptors that record pregaps getINDEX 00(or have the missing pregap sectors rebuilt as zeros), descriptors naming several data files are joined in track order, images storing 2448 or 2368 bytes per sector have their subchannel tail stripped first (chdman cannot read those), and a.mdfthat is really an ISO is converted as a DVD image. MDS v2 images are decrypted and decompressed in-process (AES-256 + LRW, zlib), including single-file.mdxcontainers whose whole image is embedded, with the footer's real stored track length used so pregaps kept in the data file are preserved. - ISZ Decompression: UltraISO
.iszimages are decompressed in-process (zlib, bzip2, stored and zero chunks), including images split across.i01/.i02or.part01.isz/.part001.iszsegments. The obfuscated tables and stripped bzip2 headers real UltraISO files carry are handled, and UltraISO's own checksum is validated when present. Segments are matched by volume serial number, a missing one is named, and an encrypted image says so rather than failing obscurely. Written against the EZB Systems ISZ File Format Specification 1.00 and checked against libMirage and isz-tool. - Split Volume Sets: Images split into
.001/.002or.i00/.i01pieces are rejoined before conversion, and a set with a missing part is reported as such instead of being handed to chdman half-complete. Split 7-Zip/ZIP archive sets (.7z.001) are extracted with the bundled 7-Zip (7za.exeon Windows,7zzon Linux/macOS) and converted rather than refused. Only the first volume appears in the file list, so a set is offered once rather than once per piece. - ECM Decoding:
.ecmfiles are decoded in-process, with no external tool to install. ECM works by discarding each sector's EDC checksum and Reed-Solomon parity, so decoding means regenerating them; the implementation is verified byte for byte against Neill Corlett's original encoder and decoder, and the checksum ECM stores for the whole image is validated at the end, so a damaged file is reported rather than turned into a plausible-looking one. - Split-Track Discs: A
(Track 1),(Track 2), ... bin set gets a multi-track cue, so discs with CDDA audio keep their audio tracks instead of converting as a single data track. - Broken Cue Descriptors: A cue whose
FILEline names something that is not there is resolved against what is actually on disk, by name beside the cue, by swapping the extension, and for a single-file cue by elimination. Audio tracks and multi-file cues are left alone, because guessing there could silently drop a track.
- A Good CHD Is Never Destroyed: Conversions are written to a staging file and moved into place only after success. Because chdman truncates its output file before it can fail, a second input that maps to the same output name can no longer wipe out the working CHD produced by the first.
- Output Collision Warnings: The output
.chdname comes from the input's base name, soGame.cue,Game.zipandGame.ccdin one folder all targetGame.chd. Inputs that would collide are reported at the start of the batch, before any time is spent on them. - Convert and Extract In Place: The output folder can be the same as the source folder, or inside it. Conversion is safe there by construction: the output is always
<name>.chd, which is never itself an input, and it is written to a staging file so an existing CHD is only replaced after success. Extraction takes the CHD's base name, so when its output would land on files that already exist, the whole disc is written to a subfolder named after it instead β existing files are never overwritten, nothing has to be confirmed, and discs with nothing in their way still land directly in the output folder. - Disk Space Preflight: Free space on the output drive is checked immediately before chdman starts. Clearly insufficient space skips the file with both figures named, rather than discovering the problem an hour into a large conversion.
- Output Folder Preflight: The destination is probed for existence and write access before a batch starts, so an unwritable folder (e.g. inside
Program Fileswithout elevation) produces one clear message instead of a run of per-file "Permission denied" failures β and a disconnected drive (unplugged USB stick, dropped network share) is reported once with reconnect guidance instead of failing every file. - chdman-Safe Path Handling: Non-ASCII characters anywhere along a path (
C:\Users\KauΓͺ Chacon\...,D:\EmulΓ‘tory\...) and paths at or beyond the 260-character MAX_PATH limit are routed through short ASCII staging directories β older chdman builds mangle or cannot open such paths and fail with a misleading "No such file or directory". Cue work directories avoid a non-ASCII system temp folder the same way. - Crash-Aware Error Reporting: When Windows kills chdman outright (e.g. exit code
-1073741795=0xC000001D, illegal instruction β typically an older CPU missing instructions the bundled build requires), the built-in CHDSharp encoder takes over automatically and the crash is decoded into plain language with actionable guidance. A startup check warns when the bundled chdman cannot run, and startup logs record the process/OS architectures plus which tool binary was selected. - Safe Deletion: Source files (and their dependencies like
.bin,.sub, etc.) are only deleted if the conversion/extraction is confirmed successful. - Batch Verification: Validate the checksums and structural integrity of existing CHD files using the CHDSharp library.
- Automated Organization: Optionally move verified or failed files into dedicated subfolders (
Success/Failed) while ignoring these special folders during subsequent scans. - Cleanup: Automatically removes empty subdirectories left behind after files are moved or deleted.
- Dependency Protection: Performs a dependency check on startup and notifies you on Windows when
chdman.exeis missing; every conversion then runs on the built-in CHDSharp encoder, so conversion never fails for a missing encoder. - File System Monitoring: Automatically monitors the input folder for file changes (deletions, renames, creations) during batch processing and provides diagnostic context when a file goes missing mid-operation.
- Corrupt Image Detection: Warns early when a disc image's size does not match any standard sector layout, so you can spot truncated or corrupt files before the conversion runs.
- Resilient File Deletion: Source-file deletion retries with backoff for up to ~45 seconds (handles transient antivirus/file-explorer locks) and automatically clears the read-only attribute when needed.
- Resilient File Copy: CloneCD
.imgβ.bincopies retry with backoff (4 attempts), preventing transient locking failures during conversion. - Clear Error Messages: Precise, actionable messages for data-side failures β missing volumes in multi-part RAR archives, disconnected network drives, and locked files β instead of generic errors.
- Real-time Telemetry: Monitor disk write/read speeds and elapsed time during operations.
- Optimized Logging: Log lines are batched and the on-screen text is capped, so a very large log never freezes the window during long-running tasks.
- AppData Storage: Logs are stored under
%LocalAppData%\BatchConvertToCHD\logsand F8 screenshots under%LocalAppData%\BatchConvertToCHD\screenshots(ascreenshotsfolder next to the app is the fallback when AppData is not writable). The title-bar AppData button opens the folder. Temporary work folders prefer the system temp directory and only fall back to aBatchConvertToCHD_Tempfolder on a drive root when the system temp path is unusable for chdman; empty fallback folders are cleaned up automatically. - Donate Button: The title bar links straight to the project's donation page, left of the About button.
- Avalonia Theming: Modern dark-themed UI powered by Avalonia 12.1 with its Fluent theme, a static dark background, rounded corners, and a custom title bar.
- Automatic Update Checks: Notifies you immediately if a newer version is available on GitHub at startup.
- Automated Bug Reporting: Built-in error reporting system helps improve the application by automatically sending crash reports (no personal data collected). Known OS-level issues and user-data conditions (corrupt files, chdman's own failures, stats API rate limits) are filtered out automatically, while genuine application defects β including CHDSharp/PBPSharp extraction failures (with debug details) β still reach the developer. A safety timer prevents the report throttle from hanging indefinitely on network issues.
| Category | Formats |
|---|---|
| Standard Images | .iso, .cue (+.bin), .img, .ccd (+.img), .raw, .toc, bare .bin |
| Console Specific | .gdi (Dreamcast), .pbp (PlayStation) |
| Compressed | .cso (Compressed ISO), .isz (UltraISO), .ecm (Error Code Modeler) |
| Alcohol 120% | .mds (+.mdf), .mdx (Daemon Tools v2 single-file), including 2448-byte subchannel sectors |
| Split Sets | .001/.002..., .i00/.i01... (add the first volume; the rest are found) |
| Archives | .zip, .7z, .rar |
| Output | .chd (Compressed Hunks of Data) |
Only the descriptor or first volume of a multi-file set is listed for conversion. The .mdf behind a .mds, the .bin behind a .cue, and the later parts of a split set are found automatically, so each disc is converted once.
The application implements priority-based logic to ensure compatibility. Content is inspected first, and the extension only decides the outcome for files whose content did not settle it:
- Content Inspection: The leading bytes are read. A raw CD image, an Alcohol descriptor, an ISZ, an ECM, an archive or an existing CHD is routed on what it is, whatever it is called. A raw CD image gets a generated cue and goes to
createcd. - Split Volume Sets: Numbered pieces are rejoined into a single image, which is then classified as above.
- Compressed Containers:
.isz,.ecmand.csoare all decompressed in-process, and the restored image is classified as above. - Descriptors:
.cue,.gdiand.tocgo tocreatecdafter cue normalization..ccdbecomes a cue via CCDSharp,.mdsvia the Alcohol parser, and.pbpis extracted to CUE/BIN via PBPSharp. - DVD Images (
.iso): Defaults tocreatedvd, once content inspection has ruled out a mislabelled raw CD dump. - Hard Disk Images (
.img): Defaults tocreatehdunless an accompanying.cuefile is detected, in which casecreatecdis used. - Raw Data (
.raw): Defaults tocreaterawwith-us 2352. Cue descriptors referencing.rawaudio tracks are converted through the cue, which carries the 2352-byte unit size in its track types.
Generated cue sheets reference the disc image where it already lies rather than copying it, because chdman resolves a cue's FILE entry against the cue's own directory. That also means such a cue has to be written on the same volume as the image, since chdman cannot follow an absolute FILE path.
Note: Users can manually override these settings via the UI to force specific modes (except for PBP which always extracts first).
- Operating System: Windows 10 / 11 (x64 or ARM64); Linux and macOS are supported from source
- Runtime: .NET 10.0 Desktop Runtime on Windows; the .NET 10.0 runtime on Linux and macOS
- Bundled Dependencies:
chdman.exe/chdman_arm64.exe(MAME Project β primary encoder on Windows, extraction fallback)7za.exe/7za_arm64.exe(Windows) or7zz(official 7-Zip 26.03, Linux/macOS) β 7-Zip fallback extraction
- Built-in Encoder: CHDSharp (CHDSharpLib 1.4.3) runs in-process on every platform β the automatic fallback behind chdman on Windows and the primary encoder on Linux/macOS.
- No Other Dependencies: every format above is handled inside the application. There is nothing else to download, and both x64 and ARM64 get the same feature set.
- Library Dependencies:
- Avalonia (v12.1.3) β Cross-platform Fluent Design UI framework and controls
- CHDSharp (v1.4.3) β Pure C# CHD reading, verification, extraction, and in-process creation (chdman byte-identical output)
- CSOSharp (v1.0.0) β Pure C# CSO/CISO decompression (deflate + LZ4)
- PBPSharp (v1.1.2) β Pure C# PBP extraction and SFO parsing
- CCDSharp (v1.0.0) β Pure C# CloneCD (.ccd/.img/.sub) parsing and conversion
- MDSSharp (v1.2.0) β Pure C# Alcohol 120% / Daemon Tools (.mds/.mdf/.mdx) parsing, v2 decryption and cue preparation
- ISZSharp (v1.0.1) β Pure C# UltraISO ISZ decompression
- SharpCompress (v0.50.4) β Archive extraction, and bzip2 decompression for ISZ images
- NAudio (v3.1.0) β MP3 audio track decoding on Windows (Media Foundation); Linux and macOS use
ffmpegfromPATH - Serilog (v4.4.0) β Structured diagnostic logging
- Download the latest binary from the Releases page.
- Extract the contents to a permanent folder.
- Important (Windows): ensure the tool
.exefiles (including ARM64 variants) remain in the same directory asBatchConvertToCHD.exe. On Linux and macOS, keep7zznext to the app; nothing else is required because the CHDSharp encoder is built in. - Launch the application.
The application also accepts a folder path as a command-line argument to quickly populate the source directory:
BatchConvertToCHD.exe "C:\ROMs\MyGames"- Navigate to the Convert to CHD tab.
- Select your Source Folder (containing images or archives).
- Select your Output Folder.
- (Optional) Check "Process smaller files first" to sort by file size.
- (Optional) Check "Force CD" or "Force DVD" to override automatic command detection.
- (Optional) Set a time limit per file to abort conversions that exceed the specified duration.
- (Optional) Enable "Delete original files" to clean up source data after a successful conversion.
- Click Start Conversion.
- Navigate to the Extract CHD Files tab.
- Select your Source Folder (containing
.chdfiles). - Select your Output Folder.
- Choose the desired output format (Auto-detect, CD
.cue, DVD.iso, Dreamcast.gdi, HDD.img). - (Optional) Enable "Include subfolders" to process nested directories.
- (Optional) Enable "Delete original CHD files" to clean up after successful extraction.
- Click Start Extraction.
- Navigate to the Verify CHD Files tab.
- Select the folder containing your
.chdfiles. - Configure folder organization options (Success/Failed folders).
- Click Start Verification.
The full project documentation (user guide, architecture, developer references, and troubleshooting) lives in the docs/ wiki:
- Project Overview
- Getting Started
- Architecture
- User Guide
- Conversion Pipeline
- Extraction & Verification
- Services Reference
- Utilities Reference
- Bug Reporting System
- Embedded Libraries
- Testing
- Application Data
- Troubleshooting
The changelog for each release lives in WhatsNew.md.
If you encounter issues or have feature requests, please use the GitHub Issues tracker.
Support the Project: If this tool saves you time, consider supporting further development:
- β Star this repository on GitHub.
- β Donate: www.purelogiccode.com/donate
This project is licensed under the GNU General Public License v3.0. See the LICENSE.txt file for details.
Acknowledgements:
- MAME Team for
chdman. - CHDSharp by Peterson Fernandes β Pure C# CHD library supporting V1-V5, all 10 codecs, parent/child chaining, parallel verification, and CHD creation that is byte-identical to
chdman(verified across a 56-disc battle corpus). - Avalonia by the Avalonia community β Cross-platform .NET UI framework powering the application front end.
- CSOSharp by Peterson Fernandes β Pure C# CSO/CISO decompression library.
- PBPSharp by Peterson Fernandes β Pure C# PlayStation PBP extraction library.
- CCDSharp by Peterson Fernandes β Pure C# CloneCD disc image parsing and conversion library.
- SharpCompress for archive handling and bzip2 decompression.
- EZB Systems for publishing the ISZ File Format Specification, which the ISZ decompressor is written against.
- libMirage by Henrik Stokseth and isz-tool by Olivier Serres, whose independent ISZ readers the decoder was checked against for the behaviours the specification omits (obfuscated tables, stripped bzip2 headers, the checksum calculation).
- Neill Corlett for ECM. His GPL-2.0-or-later reference implementation defines the format the in-process
.ecmdecoder implements, and was used to verify it byte for byte. - NAudio by Mark Heath β MP3 decoding via Windows Media Foundation.
- Serilog for structured logging.
- Igor Pavlov for the 7-Zip command-line tools (
7za.exe/7zz).
Developed by Pure Logic Code



