What's new in this build
Build 188 of nx2 (79c4f82) is build 187 plus the NUP editor: a .nup can now be unpacked back into a loose dump, and its metadata — name, icon, version, publisher and per-language names — can be edited in place, from the game list or from the command line. It fixes #385.
19 files, +2,593/−26, and none of it is emulation: games run exactly as they do in build 187. What changed is what you can do with the dumps themselves.
In short
- Dump NUP… — right-click a
.nupin the game list and it is extracted back intobase/,updates/<version>/anddlc/<titleid>/<n>/, with a progress window and a cancel button. The default output is a folder named after the archive, next to it. - Edit NUP Metadata… — change the title, publisher, version, icon and per-language names of an existing
.nupin place, with a progress window. Only the fields you touch are rewritten; the packages' contents are copied untouched. - Find Icon Online — in the metadata editor, pulls a square icon from
switchiconshowdown.com, with SteamGridDB as a fallback when you supply a free API key. The whole search has a 10-second deadline and can be cancelled. - Command line —
--unpack-nup <file.nup> [<out_dir>]and--edit-nup <file.nup> --nup-name … --nup-icon … --nup-version … --nup-publisher … --clear-nup-name/--clear-nup-icon/--clear-nup-version/--clear-nup-publisher, both in--help. - Safer by default — an existing non-empty output folder is never overwritten or cleaned away, and a metadata edit replaces the archive atomically.
- Menu order — Dump NUP… sits above Dump RomFS, and Edit NUP Metadata… above Configure Game.
- Smaller thing you will notice: a
.nuppacked from a dump whose metadata was never filled in now shows the dump's name and icon in the list instead of an empty entry.
Dump NUP: unpacking back into a loose dump
Right-clicking a .nup in the game list now offers Dump NUP… (only for actual .nup archives — a loose dump has no such entry). It writes the same layout a .nup packs from:
- a container with updates and DLC becomes
base/,updates/<version>/anddlc/<titleid>/<n>/; - a base-only container is written bare, without the
base/wrapper, so it round-trips into the layout it came from.
The extraction runs in a window with a progress bar, the byte and file counts, and a cancel button; Ctrl-C cancels the CLI version. An existing non-empty output folder is refused rather than merged into or wiped, which is also what the cleanup skip added in this build guards.
Returning to the list after a dump no longer freezes the window: it rescans once instead of twice and no longer re-reads the firmware on the UI thread.
Edit NUP Metadata: name, publisher, version, icon, per-language names
Edit NUP Metadata… opens on an existing .nup, prefilled from what is stored in it:
- Name, and next to it a button that reveals one field per language for the localized titles;
- Publisher (stored as the NACP's developer name);
- Version;
- Icon: the current one is shown, a new one can be dropped on it or picked from a file, and Find Icon Online searches for one;
- every field can be cleared, which removes it. Language tags the console has no field for are kept as stored.
The rewrite touches only the target package's metadata TLVs — the base package, or the first package when there is no base. Extents are copied untouched, the table-of-contents hash and the file size are updated, and the replacement is atomic, so an interrupted edit cannot leave a half-written archive behind. A field you leave alone keeps its stored value, and if nothing changed the writer reports no change instead of rewriting the file.
Editing used to look like it did nothing, because the UI stayed in its "NUP running" state while the archive was rewritten; it now has the same progress window as extracting.
Find Icon Online
The icon panel's Find Icon Online replaces Use Current and asks switchiconshowdown.com first, matching on the title and the title id. If that finds nothing and a SteamGridDB API key is set, it searches SteamGridDB instead; several hits open a chooser. Without a key it explains what is missing and links the SteamGridDB API preferences page, where a free key is created; the key is saved as steamgriddb_api_key in the UI settings. The search shares one 10-second deadline between both sources, so the fallback always gets some of the time, and the whole search can be cancelled.
From the command line
eden-cli (and the GUI's --help) gained:
--unpack-nup <file.nup> [<out_dir>]— extracts and exits; the output directory defaults to the archive's name next to it.--edit-nup <file.nup> [--nup-name NAME] [--nup-icon PATH] [--nup-version VER] [--nup-publisher NAME] [--clear-nup-name] [--clear-nup-icon] [--clear-nup-version] [--clear-nup-publisher]— rewrites the default-language metadata and exits.
Both print progress and errors on stderr and can be interrupted with Ctrl-C. The CLI edits the default language; per-language names are a GUI-only field for now.
Smaller fixes in this build
- A
.nupwith no title stored now falls back to its dump's name, and its icon is used even when there is no NACP, so an unedited archive is no longer a blank row in the list. - The extraction cleanup no longer deletes the contents of a non-empty directory.
nup_writer.cppno longer trips-Werror=maybe-uninitializedon the newest update index (GCC), which builds with the tests enabled.- Over 300 lines of new tests round-trip a packed dump through extract and repack, and cover the metadata edit paths.
Coming from build 187?
You keep everything 187 brought: NVIDIA DLSS in the Windows MSVC zip, the -pgo builds trained on Eglantine's own profile, and the AMD sparse-tile revert. This build adds only the NUP tools above.
Coming from build 181 or 177?
Build 187's notes cover what you gain there — DLSS is the big one — and build 181's the Wayland-capable AppImages.
How it works, for the technically curious
nup_writer.hgainsExtractNup,DefaultExtractPath,EditNupMetadataandProbeNupMetadata, plusMetadataEdit(each field anoptional:nulloptkeeps, empty removes) and theExtractResult/EditResultenums (Success,Cancelled,InvalidSource,IoError,NoChange).Metadatagainedpublisherandlocalized_titles;NupContainer::PackageInfogainedpublisherandsource_dump, andGetPackageDirgives the extractor a per-package directory view.loader/nup.cppbuilds the NACP from the effective title (stored name, else dump name), writes the publisher intodeveloper_name, and keeps the icon even when there is no NACP to hold it.game_list.cpponly adds the two entries when the path ends in.nupand is not a dump root, and disables them while a NUP conversion is running;launch_params.cppgrew the eight new long options (0x100–0x107) and switched the switch to the rawintoption value so they can be handled.icon_search.cppusescommon/httplib.hagainstswitchiconshowdown.comandsteamgriddb.com/api/v2, with a host allow-list and the client's own cancel error mapped toCancelled.
Automatic build of nx2 at 79c4f82.
Linux
Linux packages come as an AppImage (self-contained, needs glibc 2.39 or newer: Ubuntu 24.04, Fedora 40, Debian 13, Arch) and a tar.gz (uses your system libraries, so Qt 6 and the usual libraries must be installed).
| Build Type | Standard | PGO (Recommended) | Notes |
|---|---|---|---|
| amd64 | AppImage · tar.gz | AppImage · tar.gz | Make the AppImage executable (chmod +x) and run it
|
| ARM (aarch64) | AppImage · tar.gz | AppImage · tar.gz |
Windows
Windows packages are in-place zip files: extract and run eglantine.exe, or eden-cli.exe from a terminal.
| Build Type | Standard | PGO (Recommended) | Notes |
|---|---|---|---|
| amd64 / x86_64 (MSVC) | MSVC zip | Use if you run into graphical issues on other builds | |
| amd64 / x86_64 (MinGW) | PGO zip | Built with MinGW clang; bundles its own DLLs, no Visual C++ redistributable needed |
macOS
| Build Type | Standard | PGO (Recommended) | Notes |
|---|---|---|---|
| arm64 (Apple Silicon) | zip | macOS 15 or newer. Not notarized: right-click and choose Open the first time, or run xattr -dr com.apple.quarantine eglantine.app. eden-cli is inside the app, in Contents/MacOS
|
The PGO builds are the same programs compiled with profile-guided optimization (clang plus Eglantine's profile); prefer them when your CPU supports it.