Please report issues on the GitHub Issues page.
A Nintendo Switch homebrew that browses and downloads game files from
archive.org into its own centralized ROM library at
sdmc:/roms/<console>/, decompressing archives along the way. Point your
emulators at that folder and your games show up. Built for the devkitPro /
libnx toolchain using Claude Code. Yes, this is 100% AI created, but it
works.
HaulNX ships no ROMs, no collections, and no credentials — it's an empty downloader. You provide your own archive.org item ids (and optionally your own archive.org keys for restricted items). No links to any content are bundled.
Disclaimer: This project does not condone piracy or copyright infringement in any form. The screenshots shown use placeholder file names for illustration only. Please do not discuss piracy, ROM sources, or copyrighted content in issues, pull requests, or discussions — such will be removed. You are responsible for complying with the laws that apply to you.
HaulNX is a background download manager for archive.org game files that installs
them into one central ROM library — sdmc:/roms/<console>/ — across 53
supported console folders. You point your emulators at that folder once, and
everything you download from then on just appears.
Browse & search
- Archive.org collections grouped by console, with full console names; a console can hold several repos when one set is incomplete
- Global search across every cached repo — results tagged with their console,
marked
*if you already have the file, and queueable straight from the results - Filter and sort any file list, pin favourites to the top, and show or hide consoles you don't collect for
Bulk downloads
- Mark files with Y, then queue the whole set with A. The selection is keyed to the file rather than the row, so you can filter, mark, change the filter and mark again to build one set across several passes
- Before anything starts you get the totals: how many files, how many bytes, free space, what the queue already owes, and how many were skipped as already installed. If the set doesn't fit you can take only what fits, or queue it anyway
- Skip installed (default on) drops files you already have from a marked selection — a single deliberate A on one file is never filtered
Download queue
- Holds 256 items and runs up to 10 at once by default; change the limit and it applies immediately — lowering it pauses the excess, which resume where they stopped as slots free up
- Resumable, and persists across app restarts — interrupted downloads pick up automatically on the next launch
- Network-loss aware: if the connection drops, active downloads pause keeping their partial files, and everything resumes in order when it comes back
- Waits for free space instead of failing item after item as the card fills, and retries transient server errors with backoff
- Pipelined extraction — the next download starts while the previous archive unpacks
- Progress, speed, ETA, cancel, reorder; a Y menu to retry every failed item or clear the finished ones at once
- Download history with one-press re-download from the log
Extraction & verification
.zip/.7z/.rar/.tar.*unpacked into the console folder; plain files moved as-is- Verified by size and MD5 where the source publishes them, so a corrupt or truncated download is rejected rather than installed
Installed library
- Browse what you have by console, sorted by name or size with pinned folders on top
- Search installed games across every ROM folder; open a result to jump to it
- Multi-select to delete, or rename in place
In-app self-update
- Settings → Check for updates pulls the newest release from GitHub in one tap
- Or push a build over Wi-Fi from the App Utility — no USB cable, and the same version as installed is accepted so you can test new builds
- Either way the build is validated and staged, so an interrupted install can't corrupt the app
Custom install folders
- The whole library lives at
sdmc:/roms/<console>/by default, but you can move it anywhere (Settings → Storage → ROM Download Folder) or send individual consoles to their own folders while the rest stay put (Settings → Storage → Install folders → Custom per console). Handy when one emulator insists on its own directory or you keep a system on a separate card. Full walkthrough on the Custom Folders wiki page.
Also — an optional card view, full touch control, 25 languages, light and dark themes, and a live network/space/battery header. Settings → Manage data refreshes or clears cached metadata, cleans up the temporary downloads folder, and takes a collection sent over Wi-Fi from the App Utility.
HaulNX doesn't play anything — it fills a library that your emulators read from.
Every download lands in sdmc:/roms/<console>/:
sd:/roms/snes/ sd:/roms/psx/ sd:/roms/gba/ sd:/roms/nds/ ...
Point each emulator at sd:/roms rather than moving downloads to suit one
emulator — that way a single library is shared by all of them.
The HaulNX wiki has a setup page per emulator: install steps, where it expects ROMs, and how to line that up with HaulNX's folder names.
| System(s) | Emulator | Setup |
|---|---|---|
| Nearly everything — NES through PS1, arcade, handhelds | RetroArch | guide — scan sd:/roms once and it builds a playlist per system |
| Multi-system frontends | TICO, Lakka, SCCM-Retro | TICO · Lakka · SCCM-Retro |
| PlayStation | DuckStation | guide |
| PSP | PPSSPP | guide |
| GBA / GB / GBC | mGBA | guide |
| Nintendo DS | melonDS or DraStic | melonDS · DraStic |
| Nintendo 3DS | Raikopon or Dekopon | Raikopon · Dekopon |
| Dreamcast / NAOMI / Atomiswave | Flycast | guide |
| Saturn | Yaba Sanshiro | guide |
| PlayStation 2 | NetherSX2 | guide — lighter titles only |
| Wii U | Cemu | guide — brand new, expect rough edges |
| Arcade / Neo Geo | MAME, pFBN | MAME · pFBN |
| SNES / NES standalones | pSNES / pNES | guide |
| GameCube, Wii | — | not realistically playable — the folders exist for organization |
The wiki also covers the cross-cutting things:
BIOS files (which
systems need firmware and the exact filenames),
disc images
(.cue/.bin/.chd and multi-disc .m3u),
overclocking,
and troubleshooting.
Two things trip up almost everyone:
- RetroArch doesn't notice new files by itself — rescan
sd:/romsafter a HaulNX session or the playlists won't show what you just downloaded. - NetherSX2, DraStic and Cemu won't launch from the homebrew menu normally. They need the full memory of a game override: hold R while opening an installed game, then start the emulator from the menu that appears.
Coming soon.
A Nintendo Switch running custom firmware (Atmosphère) with the homebrew menu, and an emulator or two — see using it with your emulators above.
- Download
HaulNX.nrofrom the latest release. - Copy it to your SD card at:
sdmc:/switch/HaulNX/HaulNX.nro - Launch it from the homebrew menu.
Each release also attaches appUtility-<version>.html — the companion
App Utility you open in a browser on your
computer to build collections and push files to the console.
On first run it seeds an empty dl_sources.json containing only the list of
supported console folders — no collections or links are included. Add your
own collections in-app (press Y and enter an archive.org item id) or by
editing dl_sources.json on your SD card.
HaulNX starts empty — you add your own collections before anything shows up.
A collection is an archive.org item that holds the game files for a system.
Each item has an item id — the last part of its URL, e.g. for
https://archive.org/details/MyExampleItem the id is MyExampleItem.
- On the Browse tab, press Y (add).
- Choose the console the files belong to — this is the
sdmc:/roms/<console>folder your emulators read from. (The selectable list comes fromconsoles; you can't pick an unsupported folder.) - Enter a name for the repo — any label, e.g.
My SNES set. - Enter the archive.org item id (the
<id>fromarchive.org/details/<id>).
The console now appears on the Browse tab. Open it with A, pick the repo, and you'll see its file list. Repeat Y to add more collections — a console can hold several.
Building more than a couple of these? Use the App Utility instead. Typing item ids on the Switch's on-screen keyboard gets old fast. The utility is a single HTML file that ships with every release — open it in a browser on your PC, build the whole collection with a real keyboard, preview any item's file list before you commit to it, and send the result straight to the console over your network. No SD card swapping, and no re-typing. It can also pull the collection the console is currently running back into the editor, so you can fetch, edit and send it on again.
(You can also edit dl_sources.json on the SD card by hand — see
Configuration on
the wiki.)
Public collections download anonymously and need no keys. You only need keys for restricted items that require an archive.org account.
- On a computer, sign in at archive.org and open your S3 keys page: https://archive.org/account/s3.php. You'll get an access key and a secret key.
- In HaulNX, switch to the Settings tab (L/R).
- Open Advanced → Archive.org credentials.
- Edit the Access key and Secret — the edit field is pre-filled with the current value so it's easy to change.
Keys live only on your SD card (sdmc:/switch/HaulNX/config/credentials.json) and
are sent only to archive.org hosts, and only over HTTPS.
- On Browse, open a console (A) and pick a repo to browse its files. (Repo metadata loads in the background with a brief "Loading…" indicator.)
- Highlight a file and press A to queue it. For more than one, mark files with Y and then press A — you'll get the totals (files, bytes, free space) before anything starts. X opens the filter, sort, and select all shown.
- Switch to the Queue tab (L/R) to watch progress. Completed downloads
extract/move into
sdmc:/roms/<console>/automatically.
Downloads are now in sdmc:/roms/<console>/. Set your emulator's ROM folder to
sd:/roms (or the per-system subfolder it wants) and your games appear — see
using it with your emulators for the per-app
steps.
You add collections in-app (Y on the Browse tab), but the easy way is the App Utility — a self-contained HTML file, attached to every release, that you open in a browser on your PC to build collections with a real keyboard and send them to the console over Wi-Fi.
The wiki has the details:
- App Utility — building collections on a PC, sending them across, and updating the app.
- Configuration —
the
dl_sources.jsonschema,credentials.json, the 53 supported console folders, and every file HaulNX keeps on the card.
Restricted archive.org items need your own S3 keys (https://archive.org/account/s3.php); public collections need none. Keys live only on your SD card and are sent only to archive.org, only over HTTPS — none are bundled.
Settings → Check for updates pulls the newest release from GitHub in one tap, or accepts a build pushed over Wi-Fi from the App Utility (no USB cable). The build is validated and staged with a backup, so an interrupted install can't corrupt the app; you get a Restart now option to relaunch straight into it. Full walkthrough on the App Utility wiki page.
Most people just want HaulNX.nro from the
latest release. To compile it
yourself you need the devkitPro toolchain (devkitA64 + libnx) and a handful of
portlibs; Plutonium is a submodule and builds automatically:
git clone --recursive https://github.com/digdat0/HaulNX
cd HaulNX
make # builds the Plutonium submodule, then HaulNX.nroThe prerequisites, the Windows/MSYS2 shell invocation, a note on why networking only works on real hardware, and a map of the source tree are on the Building from Source wiki page.
Translations are the most useful contribution — HaulNX ships 25 languages, all
plain JSON in romfs/lang/. See
Contributing for how to
fix a string or add a language (and how to test one on the console without
rebuilding). Bug reports and PRs go to
Issues.
Released under the MIT License — free to use, modify and redistribute. The only condition is that the copyright notice and license stay included, so please keep the credit.
HaulNX's own code and the Plutonium UI
library it builds on are both MIT-licensed, so the project is cleanly permissive.
Third-party license notices (Plutonium © XorTroll, jsmn, and the bundled Noto
Sans font subset under the SIL Open Font License) are collected in
THIRD-PARTY-NOTICES.md; the full OFL text ships at
licenses/OFL-1.1.txt. These accompany any
distribution.
- Built with devkitPro / libnx, libcurl, and libarchive. JSON parsing via the vendored jsmn tokenizer (MIT).
- Graphical UI powered by Plutonium by XorTroll.
- Inspired by TicoBro — I wanted a simple downloader whose only job was to download, with some enhancements.