Repository navigation
Releases
nxformat 1.0.3
NXFormat 1.0.3
NXFormat 1.0.3 fixes importing extracted game folders copied through macOS and
large conversions that failed with "Too many open files" on macOS.
The fix applies to NXConvert's desktop application, command-line tool and C API.
The NX wire formats and C/C++ reader API are unchanged.
What is new in 1.0.3
- Raise the process's open-file limit at startup (macOS defaults to 256), close
each NUP or source file as soon as it is read, and bound the pinned directory
handles of extracted-tree imports on Unix. Large packages and dumps, such as
a NUP of over 150000 files, no longer fail withos error 24. - Recognize bounded AppleDouble
._namesidecars when the corresponding
nameexists beside them, and Finder.DS_Storedatabase headers. These
host metadata files no longer block root-folder imports or become game files
inside RomFS. Original source files remain untouched. - Preserve similarly named ordinary game files, orphan sidecars, directories
and malformed metadata instead of excluding files by name alone. - Apply the same secure directory listing to CLI discovery, progress totals,
memory estimates, content import and source verification. - Add regression tests that compare the complete archive bytes and progress
totals with a clean source tree, check source verification and preserve
actual game files whose names start with._.
Changes in 1.0.2
NUP metadata
pack-nupreads the metadata of NUP files made bynupversions whose
metadata types are shifted by one (NPDM = 0, NACP = 1, ...). Before, such
games got the publisher as title, the build ID as publisher and the title as
display version. Files with the specified types are read as before.
NXConvert
- Metadata sidebar to edit the title, publisher and icon, and restore the
original icon. - Large NUP sources are supported, the source size is shown apart from the
estimated progress, and a conversion cancels faster. - Folders of the same dump dropped one by one become a single NX.
nxconvert extract ARCHIVE.nx NEW_FOLDERand the Extract all… button
write every snapshot in the layout of a dump:base/,updates/<version>/
anddlc/<title>/<version>/, withexefs/andromfs/. Each file is
checked with SHA-256. Content kept as NCA files only gives its ExeFS.
Smaller C library
- The C API is built for size: about a third smaller. Zstandard and SHA-256
keep full optimization, so conversion runs at the same speed. - Release archives add
nxformat_static_nozstd(CMakenxformat::static_nozstd):
the static library without Zstandard, for programs that already link
libzstd 1.5.7 or later. The program then holds a single copy of zstd.
Changes in 1.0.1
- DXCI/DNSP packs keep the bundled system update as a Source Resource (NX 0.3,
readable from 1.0.1 only);--omit-firmwareleaves it out. read()returns aPartialRead,Sessiondecodes on a worker pool, the
block cache no longer serializes readers, andArchive::lookupuses a
binary search.- Robustness fixes: no recursion on snapshot trees, I/O errors on the newest
generation are reported, andaddwith recipes is atomic.
Features
- Convert supported already-decrypted DNSP/DXCI packages, extracted trees and
NUP v1 archives into NX. - Add updates and DLC, remove snapshots and compact unused space.
- Store new game-data blocks without compression using CLI
--no-compress
or the desktop Non preset. Remove existing game-data compression with
compact ARCHIVE.nx --no-compress. Deduplication and integrity checks remain active. - Read independent RAW/Zstandard blocks with per-slice CRC-32C checks; verify
archive metadata, Media payloads and logical files with SHA-256. - Keep supported native-package reconstruction recipes by default; exact
rebuilding requires the recipe and all referenced file content. - Embed commands through the C API, including callback-backed plaintext sources,
progress reporting and cancellation.
NXConvert does not decrypt content or provide keys or game files. Emulator
compatibility depends on the emulator integration and the selected content.
This release is NXFormat / NXConvert 1.0.3, with separate 4096-byte header
pages. The exact binary header fields are defined in the format specification.
Packages
| Package | Contents |
|---|---|
| Windows x64 | NXConvert app, shared/static libraries and headers |
| Linux x64 / arm64 | NXConvert app, shared/static libraries and headers |
| macOS universal | NXConvert app bundle, CLI, shared/static libraries and headers |
| Android arm64 | Shared/static libraries and headers, no desktop app |
Release archives include CMake package configuration. SHA256SUMS is published
as a separate attachment. nxformat-xmake-1.0.3.zip contains the xmake package
repository populated with those archive hashes. Extract it and register the
local directory with xmake. Publication adds no commits to the source repository.
Build NXConvert from source with Rust 1.95 or newer:
cargo build --release --locked --manifest-path app/Cargo.tomlThe Rust writer and C API support Rust 1.80 or newer. The independent C++ reader
requires C++17 and a caller-supplied Zstandard decoder for compressed blocks.
See the README, CLI guide, reader guide
and format specification for usage and integration.
nxformat 1.0.2
NXFormat 1.0.2
NXFormat 1.0.2 fixes the titles of games converted from recent NUP files,
improves NXConvert, adds full NX extraction and makes the C library smaller. It includes the NXConvert desktop application and
CLI, the Rust archive writer, the C API and the header-only C++17 reader. The
NX format is unchanged: archives stay readable by 1.0.1 readers, and by 1.0.0
readers when they hold no firmware.
What is new in 1.0.2
NUP metadata
pack-nupreads the metadata of NUP files made bynupversions whose
metadata types are shifted by one (NPDM = 0, NACP = 1, ...). Before, such
games got the publisher as title, the build ID as publisher and the title as
display version. Files with the specified types are read as before.
NXConvert
- Metadata sidebar to edit the title, publisher and icon, and restore the
original icon. - Large NUP sources are supported, the source size is shown apart from the
estimated progress, and a conversion cancels faster. - Folders of the same dump dropped one by one become a single NX.
nxconvert extract ARCHIVE.nx NEW_FOLDERand the Extract all… button
write every snapshot in the layout of a dump:base/,updates/<version>/
anddlc/<title>/<version>/, withexefs/andromfs/. Each file is
checked with SHA-256. Content kept as NCA files only gives its ExeFS.
Smaller C library
- The C API is built for size: about a third smaller. Zstandard and SHA-256
keep full optimization, so conversion runs at the same speed. - Release archives add
nxformat_static_nozstd(CMakenxformat::static_nozstd):
the static library without Zstandard, for programs that already link
libzstd 1.5.7 or later. The program then holds a single copy of zstd.
Changes in 1.0.1
- DXCI/DNSP packs keep the bundled system update as a Source Resource (NX 0.3,
readable from 1.0.1 only);--omit-firmwareleaves it out. read()returns aPartialRead,Sessiondecodes on a worker pool, the
block cache no longer serializes readers, andArchive::lookupuses a
binary search.- Robustness fixes: no recursion on snapshot trees, I/O errors on the newest
generation are reported, andaddwith recipes is atomic.
Features
- Convert supported already-decrypted DNSP/DXCI packages, extracted trees and
NUP v1 archives into NX. - Add updates and DLC, remove snapshots and compact unused space.
- Store new game-data blocks without compression using CLI
--no-compress
or the desktop Non preset. Remove existing game-data compression with
compact ARCHIVE.nx --no-compress. Deduplication and integrity checks remain active. - Read independent RAW/Zstandard blocks with per-slice CRC-32C checks; verify
archive metadata, Media payloads and logical files with SHA-256. - Keep supported native-package reconstruction recipes by default; exact
rebuilding requires the recipe and all referenced file content. - Embed commands through the C API, including callback-backed plaintext sources,
progress reporting and cancellation.
NXConvert does not decrypt content or provide keys or game files. Emulator
compatibility depends on the emulator integration and the selected content.
This release is NXFormat / NXConvert 1.0.2, with separate 4096-byte header
pages. The exact binary header fields are defined in the format specification.
Packages
| Package | Contents |
|---|---|
| Windows x64 | NXConvert app, shared/static libraries and headers |
| Linux x64 / arm64 | NXConvert app, shared/static libraries and headers |
| macOS universal | NXConvert app bundle, CLI, shared/static libraries and headers |
| Android arm64 | Shared/static libraries and headers, no desktop app |
Release archives include CMake package configuration. SHA256SUMS is published
as a separate attachment. nxformat-xmake-1.0.2.zip contains the xmake package
repository populated with those archive hashes. Extract it and register the
local directory with xmake. Publication adds no commits to the source repository.
Build NXConvert from source with Rust 1.95 or newer:
cargo build --release --locked --manifest-path app/Cargo.tomlThe Rust writer and C API support Rust 1.80 or newer. The independent C++ reader
requires C++17 and a caller-supplied Zstandard decoder for compressed blocks.
See the README, CLI guide, reader guide
and format specification for usage and integration.
nxformat 1.0.1
NXFormat 1.0.1
NXFormat 1.0.1 keeps the cart's bundled system update inside the archive, so a
packed DXCI can be rebuilt byte for byte, and makes reads faster and more
robust, especially when several threads read at once. It includes the NXConvert
desktop application and CLI, the Rust archive writer, the C API and the
header-only C++17 reader.
Compatibility: archives that contain firmware use NX 0.3 and only open in
1.0.1 or later readers. All other archives stay NX 0.2 and still open in 1.0.0.
Update your emulator before sharing archives with firmware.
What is new in 1.0.1
Firmware preservation
- DXCI/DNSP packs keep the bundled system update (
partition.hfs0) by default,
as a Source Resource.rebuildgives back the exact original package. --omit-firmware, or the per-game choice in the desktop app, leaves it out.- Identical firmware shared by several packages is stored once.
- In the desktop app, recipe and firmware options only appear for DXCI/DNSP
packages, and the firmware option only when the package has one.
Faster reads
read()andread_file()return aPartialRead: verified blocks go
straight into the caller's buffer, with no staging copy.
OpenOptions::atomic_readskeeps the 1.0.0 all-or-nothing behaviour.Sessiondecodes split Zstandard reads on a small worker pool
(decode_workers, up to 4 by default): 1.6x to 2.8x faster sequential reads
of compressed files on Switch 2 games.- The block cache no longer serializes concurrent readers. With 8 threads,
cached 4 KiB reads have a 0.9 µs p99 instead of 17 µs, with up to 3.5x the
throughput. Archive::lookup(directory, name)finds a path by binary search
(about 0.2 µs instead of 1 to 4 µs for a scan).
More robust
- Snapshot trees are checked without recursion, and the directory depth limit
is 256 in every implementation. No archive can exhaust a thread stack. - An I/O error while reading the newest generation is reported, instead of a
silent fallback to an older generation. - A fresh
packpublishes a single generation, even when it adds updates or
recipes. addwith recipes is atomic: the content and its recipes are published
together, or not at all.- The session worker keeps running after a user cancellation callback fires.
Features
- Convert supported already-decrypted DNSP/DXCI packages, extracted trees and
NUP v1 archives into NX. - Add updates and DLC, remove snapshots and compact unused space.
- Store new game-data blocks without compression using CLI
--no-compress
or the desktop Non preset. Remove existing game-data compression with
compact ARCHIVE.nx --no-compress. Deduplication and integrity checks remain active. - Read independent RAW/Zstandard blocks with per-slice CRC-32C checks; verify
archive metadata, Media payloads and logical files with SHA-256. - Keep supported native-package reconstruction recipes by default; exact
rebuilding requires the recipe and all referenced file content. - Embed commands through the C API, including callback-backed plaintext sources,
progress reporting and cancellation.
NXConvert does not decrypt content or provide keys or game files. Emulator
compatibility depends on the emulator integration and the selected content.
This release is NXFormat / NXConvert 1.0.1, with separate 4096-byte header
pages. The exact binary header fields are defined in the format specification.
Packages
| Package | Contents |
|---|---|
| Windows x64 | NXConvert app, shared/static libraries and headers |
| Linux x64 / arm64 | NXConvert app, shared/static libraries and headers |
| macOS universal | NXConvert app bundle, CLI, shared/static libraries and headers |
| Android arm64 | Shared/static libraries and headers, no desktop app |
Release archives include CMake package configuration. SHA256SUMS is published
as a separate attachment. nxformat-xmake-1.0.1.zip contains the xmake package
repository populated with those archive hashes. Extract it and register the
local directory with xmake. Publication adds no commits to the source repository.
Build NXConvert from source with Rust 1.95 or newer:
cargo build --release --locked --manifest-path app/Cargo.tomlThe Rust writer and C API support Rust 1.80 or newer. The independent C++ reader
requires C++17 and a caller-supplied Zstandard decoder for compressed blocks.
See the README, CLI guide, reader guide
and format specification for usage and integration.
nxformat 1.0.0
NXFormat 1.0.0
NXFormat 1.0.0 includes the NXConvert desktop application and CLI, the Rust
archive writer, the C API and the header-only C++17 reader.
Features
- Convert supported already-decrypted DNSP/DXCI packages, extracted trees and
NUP v1 archives into NX. - Add updates and DLC, remove snapshots and compact unused space.
- Store new game-data blocks without compression using CLI
--no-compress
or the desktop Non preset. Remove existing game-data compression with
compact ARCHIVE.nx --no-compress. Deduplication and integrity checks remain active. - Read independent RAW/Zstandard blocks with per-slice CRC-32C checks; verify
archive metadata, Media payloads and logical files with SHA-256. - Keep supported native-package reconstruction recipes by default; exact
rebuilding requires the recipe and all referenced file content. - Embed commands through the C API, including callback-backed plaintext sources,
progress reporting and cancellation.
NXConvert does not decrypt content or provide keys or game files. Emulator
compatibility depends on the emulator integration and the selected content.
This release is NXFormat / NXConvert 1.0.0, with separate 4096-byte header
pages. The exact binary header fields are defined in the format specification.
Packages
| Package | Contents |
|---|---|
| Windows x64 | NXConvert app, shared/static libraries and headers |
| Linux x64 / arm64 | NXConvert app, shared/static libraries and headers |
| macOS universal | NXConvert app bundle, CLI, shared/static libraries and headers |
| Android arm64 | Shared/static libraries and headers, no desktop app |
Release archives include CMake package configuration. SHA256SUMS is published
as a separate attachment. nxformat-xmake-1.0.0.zip contains the xmake package
repository populated with those archive hashes. Extract it and register the
local directory with xmake. Publication adds no commits to the source repository.
Build NXConvert from source with Rust 1.95 or newer:
cargo build --release --locked --manifest-path app/Cargo.tomlThe Rust writer and C API support Rust 1.80 or newer. The independent C++ reader
requires C++17 and a caller-supplied Zstandard decoder for compressed blocks.
See the README, CLI guide, reader guide
and format specification for usage and integration.