github Djihads80/Eglantine build-188
Eglantine nx2 build 188 (79c4f82)

latest release: build-189
pre-release2 hours ago

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 .nup in the game list and it is extracted back into base/, updates/<version>/ and dlc/<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 .nup in 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 .nup packed 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>/ and dlc/<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 .nup with 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.cpp no longer trips -Werror=maybe-uninitialized on 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.h gains ExtractNup, DefaultExtractPath, EditNupMetadata and ProbeNupMetadata, plus MetadataEdit (each field an optional: nullopt keeps, empty removes) and the ExtractResult / EditResult enums (Success, Cancelled, InvalidSource, IoError, NoChange).
  • Metadata gained publisher and localized_titles; NupContainer::PackageInfo gained publisher and source_dump, and GetPackageDir gives the extractor a per-package directory view.
  • loader/nup.cpp builds the NACP from the effective title (stored name, else dump name), writes the publisher into developer_name, and keeps the icon even when there is no NACP to hold it.
  • game_list.cpp only adds the two entries when the path ends in .nup and is not a dump root, and disables them while a NUP conversion is running; launch_params.cpp grew the eight new long options (0x100–0x107) and switched the switch to the raw int option value so they can be handled.
  • icon_search.cpp uses common/httplib.h against switchiconshowdown.com and steamgriddb.com/api/v2, with a host allow-list and the client's own cancel error mapped to Cancelled.

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.

Don't miss a new Eglantine release

NewReleases is sending notifications on new releases.