A LaunchBox + BigBox plugin that lets you search ROM sources, download ROMs, and import them into your library — all without leaving LaunchBox.
Caution
Distributing or downloading copyrighted ROMs may be illegal in your jurisdiction. Loadarr is a generic search/download tool — what you do with it is your responsibility. Use it only for ROMs you legally own (homebrew, public-domain titles, your own dumps, etc.). The author of this plugin does not host, mirror, or endorse infringement of any kind.
- Search ROM sources by title from inside LaunchBox or BigBox.
- Download with a live progress bar; archives are auto-extracted (the
primary ROM is picked from inside
.zip/.7z/.rar, sidecar files for disc images come along, arcade.zipromsets are kept intact). - Auto-import into LaunchBox via the plugin API — the new game appears in your library without a restart.
- Enrich metadata from LaunchBox's bundled metadata database: release date, developer, publisher, genres, community rating, Wikipedia URL, description.
- Pick game artwork from the LaunchBox image database with a region-aware default selection (a Germany ROM defaults to the Germany boxart, etc.).
- Background queue — start a download, queue more, keep using LaunchBox.
- BigBox controller UI — a dedicated fullscreen overlay with a virtual keyboard and gamepad-driven navigation, no theme editing required.
| LaunchBox — search, results, status | Image picker — region-aware defaults, select-all/none |
![]() |
![]() |
| BigBox overlay — fullscreen, controller-driven, inline queue | |
![]() |
- Windows (LaunchBox is Windows-only).
- LaunchBox with the modern .NET-Core plugin host (any version since the Big-Box-app-store transition — basically anything from the last few years). No NuGet config or extra runtimes needed.
-
Download
Loadarr.dllfrom the latest release (or build it yourself — see Building from source). -
Drop it into:
<LaunchBox>\Plugins\Loadarr\Loadarr.dllCreate the
Loadarrfolder if it doesn't exist. -
Restart LaunchBox / BigBox.
That's it. There's only one file to ship — third-party dependencies
(HtmlAgilityPack, SharpCompress, Microsoft.Data.Sqlite, etc.) are embedded
into Loadarr.dll at build time.
- Tools → Loadarr — Find ROMs… opens the search window. (You can also right-click any game in your library and pick Search Loadarr for this title… to pre-fill the title and platform.)
- Type a title and press Search. Results from all configured sources are returned in parallel and labelled with their source.
- Pick a result and click Download & Import. The image picker opens — defaults are pre-checked based on the source's region. Confirm to download.
- The download runs in the background. Click Queue to monitor it; you can keep searching for more titles in the meantime.
- When the queue finishes, the new game is already in your library — no restart needed.
- Open the System menu in BigBox and pick Loadarr — Find ROMs…. The fullscreen overlay opens with the queue visible immediately, so you can keep an eye on in-progress downloads.
- Press A on the query field (or X anywhere) to bring up the on-screen keyboard.
- D-pad to select the key, A confirms each key.
- Press the SEARCH key to run the search.
- A on a result starts the download. The image picker opens — toggle selections with A, Y to select all, X to deselect all, Start to confirm.
- Press Start or B to close. BigBox returns to the platform list with your new game ready to play as soon as download and extraction are finished.
| Button | What it does |
|---|---|
| D-pad / left stick | Navigate |
| A | Confirm (type a key, queue a result, toggle a checkbox) |
| B | Back / close |
| X | Show/hide the on-screen keyboard |
| Start | Close the overlay |
| LB / RB | Tab between focusable groups |
| Source | API style | Notes |
|---|---|---|
| Vimm's Lair | HTML scrape | Curated retro ROMs. Fragile by nature — when the site changes its HTML, results may silently disappear until the parser is updated. |
More sources can be added via a small interface — see Adding a new ROM source.
On first launch, defaults are written to:
%APPDATA%\Loadarr\settings.json
Editable fields:
| Key | Default | Purpose |
|---|---|---|
DownloadDirectory |
%USERPROFILE%\LaunchBox\Loadarr\Downloads |
Where downloaded ROMs land before LaunchBox import. |
ExtractDownloadedArchives |
true |
Extract the primary ROM from .zip / .7z / .rar. Multi-file disc images (.cue + .bin, .gdi + .raw) are extracted together. Arcade platforms (MAME, etc.) keep their .zip intact — the zip itself is the romset. |
SearchTimeoutSeconds |
30 |
HTTP timeout for searches and downloads. |
EnableDebugLogging |
true |
Write per-import diagnostics to %APPDATA%\Loadarr\loadarr.log. |
If something goes wrong (a ROM doesn't import, an emulator doesn't recognize the file), the log file is the first place to look — every download, extraction, metadata lookup, and emulator binding decision is recorded.
- Vimm's Lair scraping is fragile. When the site changes its HTML, search results from Vimm's may silently disappear. Adding a more stable source means implementing one interface — see below.
- Platform names. LaunchBox doesn't standardize platform naming;
PlatformMappercovers the common consoles, but exotic platforms may need a manual mapping added. - No metadata scraping over the internet. Loadarr enriches imports from LaunchBox's local metadata database, which is what your installation already has. LaunchBox's built-in metadata refresh handles online lookups.
- BigBox theme integration. The BigBox UI is a fullscreen overlay (one-DLL drop, no setup). It doesn't reuse your active BigBox theme — see Why an overlay, not a theme element?.
A "ROM source" is anything that exposes a search API and returns downloadable ROM URLs (an HTML site you scrape, a JSON API, an Internet Archive index, etc.). Adding one is a small, isolated change.
1. Implement IRomSource
internal sealed class MyAwesomeSource : IRomSource
{
public string Name => "My Awesome Source";
public Task<IReadOnlyList<RomSearchResult>> SearchAsync(
string query, string platformHint, CancellationToken ct)
{
// Query your backend, map results into RomSearchResult objects.
// Use platformHint to filter when possible.
}
public Task<ResolvedDownload> GetDownloadAsync(
RomSearchResult result, CancellationToken ct)
{
// Resolve the actual download URL + headers + filename.
// Called when the user picks a result; lets you defer expensive
// detail-page fetches until they're needed.
}
}2. Register it in SourceRegistry
public static IReadOnlyList<IRomSource> Build(HttpClient http) =>
new IRomSource[]
{
new VimmsLairSource(http),
new MyAwesomeSource(http),
};That's it — your source is queried in parallel with the others on every
search, and its results show up labelled in the SOURCE column.
- Heavy work belongs in a separate library. Vimm's parsing logic lives
in
src/Loadarr.Sources.VimmsLair/(anetstandard2.0library), with a thinVimmsLairSourceadapter in the main plugin. This makes it unit-testable without booting LaunchBox. Mirror this layout for non-trivial sources. - Map platform names. Most ROM sites use their own platform vocabulary
(e.g. Vimm's says
N64; LaunchBox saysNintendo 64). ExtendPlatformMapperso the imported game lands under the canonical LaunchBox platform name. - Region awareness pays off. Populate
RomSearchResult.Regionwith whatever the source provides ("USA", "Europe", "Germany", …). The image picker uses it to pre-select region-appropriate artwork.
The project targets net48 (LaunchBox's plugin host) and uses
Costura.Fody to produce a single Loadarr.dll. The build works
cross-platform; only running the plugin requires Windows.
# Build only
pwsh ./build/build.ps1 -LaunchBoxPath "D:\Games\LaunchBox"
# Build and install into <LaunchBox>\Plugins\Loadarr
pwsh ./build/build.ps1 -LaunchBoxPath "D:\Games\LaunchBox" -InstallOr directly:
dotnet build src/Loadarr/Loadarr.csproj -c Release /p:LaunchBoxPath="D:\Games\LaunchBox"build/build-mac.sh # build plugin (auto-builds stub if missing)
build/build-mac.sh --rebuild-stub # regenerate the LaunchBox API stub
build/build-mac.sh --clean # wipe bin/obj first
build/build-mac.sh --config Debug # build Debug instead of ReleaseThe output is a single src/Loadarr/bin/Release/Loadarr.dll. Copy that one
file to your Windows machine to deploy.
Unbroken.LaunchBox.Plugins.dll ships only with LaunchBox itself — there's
no NuGet package and no public reference assembly. To unblock cross-platform
builds, this repo includes a tiny compile-time stub at
build/stubs/LaunchBoxStub/ that:
- Produces an assembly named
Unbroken.LaunchBox.Plugins.dll. - Declares only the types and members Loadarr actually uses.
- Has matching namespaces (
Unbroken.LaunchBox.Plugins[.Data]).
The main project references the stub with <Private>false</Private>, so it
is not copied into bin/Release. At runtime LaunchBox loads its real
DLL from <LaunchBox>\Core\ and the CLR resolves Loadarr's references
against that — the stub is purely a compile-time substitute.
You only need to touch the stub when Loadarr starts calling a LaunchBox API it doesn't currently use, or when LaunchBox itself adds members to interfaces Loadarr implements:
- Edit
build/stubs/LaunchBoxStub/Stub.cs. - Re-run
build/build-mac.sh --rebuild-stub. - (Recommended) Verify the addition matches the real SDK with one build on a Windows machine against the actual LaunchBox install.
The stub project is not part of launchbox-loadarr.sln and is never
shipped; it's strictly a build-time helper.
| File | Plugin interface | Purpose |
|---|---|---|
Plugin/LoadarrToolsMenu.cs |
ISystemMenuItemPlugin |
Tools-menu entry (LaunchBox) + System-menu entry (BigBox). |
Plugin/LoadarrGameMenu.cs |
IGameMenuItemPlugin |
Right-click on a game → search Loadarr pre-filled. |
Services/LaunchBoxImporter.cs |
uses PluginHelper.DataManager |
Creates the platform if needed, calls AddNewGame, then Save(true). |
Services/DownloadQueueService.cs |
(singleton) | Single-worker FIFO queue: download → extract → import → fetch images. |
UI/SearchWindow.xaml |
WPF window | LaunchBox desktop UI. |
UI/BigBoxSearchWindow.xaml |
WPF fullscreen overlay | BigBox UI with virtual keyboard + inline queue. |
Services/XInputController.cs |
gamepad poller | P/Invoke into xinput1_4.dll; BigBox doesn't forward gamepad input to plugin windows, so we consume it ourselves. |
IBigBoxThemeElementPlugin exists, but using it requires the user to
hand-edit their active BigBox theme's XAML files (and re-do those edits
every time they change or update the theme). There is no API to navigate
to a theme element from a menu, so even with a theme element you'd still
need an overlay-or-equivalent entry point.
Loadarr's overlay is one DLL, drops into Plugins/Loadarr/, works on every
theme without modification, and consumes XInput directly to drive its
controller-friendly UI. The price is that the overlay's visual style is its
own (dark + accent), not your theme's. That tradeoff felt right; if you
disagree, see the conversation in
the BigBox plugin forum thread
for more context on the constraint.
- Found a bug? Open an issue.
- Adding a source / fixing a parser? PRs welcome — see Adding a new ROM source.
- LaunchBox plugin questions in general: LaunchBox plugin API docs.


