A YUMI/Ventoy-style multiboot USB creator for Windows: pick one or more ISOs, pick a USB drive, and it formats the drive, installs a bootloader that works on both legacy BIOS and UEFI firmware, and builds a boot menu that chains into each ISO.
- Windows 10/11
- .NET 10 SDK to build/run from source
- Administrator privileges at runtime (the app writes raw disk sectors and runs
diskpart/syslinux)
| Project | Purpose |
|---|---|
src/BootUSBit.Core |
Disk enumeration/formatting, bootloader install, ISO mounting + boot-menu templates, orchestration (UsbBuilder) |
src/BootUSBit.Wpf |
WPF desktop UI |
tests/BootUSBit.Tests |
xUnit tests |
dotnet build BootUSBit.sln
dotnet test tests/BootUSBit.Tests/BootUSBit.Tests.csprojRun the app (elevation prompt is expected — it's required by the app manifest):
dotnet run --project src/BootUSBit.Wpf/BootUSBit.Wpf.csprojGitHub Actions workflows live in .github/workflows:
build-test-sbom.yml— reusable workflow: restores/builds/tests the solution, checks for known- vulnerable NuGet packages (dotnet list package --vulnerable), generates a CycloneDX SBOM, and scans it with Grype (fails on high/critical vulnerabilities; results are also uploaded to the repo's Code Scanning tab).ci.yml— runs the above on every push/PR tomainorbeta.release.yml— runs only when manually dispatched frommainorbeta, uses Conventional Commits to determine the next version, then publishes a self-containedwin-x64build with its SBOM attached to the generated GitHub Release. Runs dispatched frombetacreate prereleases.conventional-commits.yml— lints every commit message and the PR title against Conventional Commits on every pull request and enforces feature PRs intobetawith onlybetaallowed to targetmain; see Commit message format below.
Dispatch the Release workflow manually from main to cut a stable release or from beta to cut a beta
prerelease. Every Conventional Commit type creates at least a patch release; feat commits create a minor
release, and BREAKING CHANGE commits create a major release.
This repo enforces Conventional Commits — <type>(<scope>): <description>,
e.g. feat(core): add Fedora dracut template or fix(wpf): handle cancelled builds. Common types: feat,
fix, docs, refactor, test, chore, ci, build, perf. conventional-commits.yml lints every
commit message in a PR (via commitlint, config in commitlint.config.js) and the PR
title itself, failing the check if either doesn't conform.
assets/bootloaders/ ships the syslinux binaries the app needs to make a drive bootable (BIOS boot sector,
MBR code, and syslinux's own UEFI application). Every file is checksum-verified against
assets/bootloaders/manifest.sha256 before each disk write — see
assets/bootloaders/README.txt for what's there and how to regenerate the
manifest if you replace a file.
- BIOS:
syslinux64.exeinstalls the boot sector on the USB's FAT32 partition; a generic MBR (mbr.bin) is written to the disk's first 440 bytes. - UEFI: syslinux's own prebuilt EFI64 application is staged at
\EFI\BOOT\BOOTX64.EFIon the same partition. Since syslinux's BIOS and EFI builds read the identicalsyslinux.cfgformat/search path, one config drives both boot modes — no GRUB2 needed. - ISO templates (
src/BootUSBit.Core/Isos/Templates) copy the kernel/initrd (and, for live distros, the whole ISO foriso-scan/filename) onto the drive and append a menu entry. Built-in templates cover Ubuntu/Debian (casper), Fedora (dracut), and memtest86+. ISOs none of these recognize can instead be written raw to the whole disk (single ISO, no multiboot menu) via the "Write raw ISO image" option.
The app logs to both the UI and a rolling file, configured in src/BootUSBit.Wpf/appsettings.json:
{
"Logging": {
"MinimumLevel": "Info",
"FilePath": "logs/bootusbit.log",
"MaxFileSizeBytes": 5242880,
"RetainedFileCount": 5
}
}MinimumLevel accepts Trace, Debug, Info (default), Warn, Error, or Fatal.
- Only USB-attached, removable disks are ever listed or written to; the app re-verifies a disk is still a USB drive immediately before wiping it.
- All external process calls (
diskpart,syslinux64.exe, PowerShell disk-image cmdlets) use explicit argument lists or environment variables — never string-concatenated shell commands — to avoid injection via file paths. - Bundled bootloader binaries are checksum-verified before use; the app refuses to proceed if a file is
missing or doesn't match
manifest.sha256.
- Distro template coverage is currently limited to Ubuntu/Debian (casper), Fedora (dracut), and memtest86+; other distros will fall back to raw/DD mode unless a matching template is added.
- Not yet verified against real hardware/VM boots — treat as unverified until you've tested it on your own target machines.