Skip to content

Releases

nxformat 1.0.3

Choose a tag to compare

@github-actions github-actions released this 11 Nov 17:25
208b815

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 with os error 24.
  • Recognize bounded AppleDouble ._name sidecars when the corresponding
    name exists beside them, and Finder .DS_Store database 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-nup reads the metadata of NUP files made by nup versions 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_FOLDER and the Extract all… button
    write every snapshot in the layout of a dump: base/, updates/<version>/
    and dlc/<title>/<version>/, with exefs/ and romfs/. 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 (CMake nxformat::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-firmware leaves it out.
  • read() returns a PartialRead, Session decodes on a worker pool, the
    block cache no longer serializes readers, and Archive::lookup uses a
    binary search.
  • Robustness fixes: no recursion on snapshot trees, I/O errors on the newest
    generation are reported, and add with 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.toml

The 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

Choose a tag to compare

@github-actions github-actions released this 10 Nov 20:53

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-nup reads the metadata of NUP files made by nup versions 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_FOLDER and the Extract all… button
    write every snapshot in the layout of a dump: base/, updates/<version>/
    and dlc/<title>/<version>/, with exefs/ and romfs/. 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 (CMake nxformat::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-firmware leaves it out.
  • read() returns a PartialRead, Session decodes on a worker pool, the
    block cache no longer serializes readers, and Archive::lookup uses a
    binary search.
  • Robustness fixes: no recursion on snapshot trees, I/O errors on the newest
    generation are reported, and add with 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.toml

The 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

Choose a tag to compare

@github-actions github-actions released this 09 Nov 14:59
7534937

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. rebuild gives 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() and read_file() return a PartialRead: verified blocks go
    straight into the caller's buffer, with no staging copy.
    OpenOptions::atomic_reads keeps the 1.0.0 all-or-nothing behaviour.
  • Session decodes 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 pack publishes a single generation, even when it adds updates or
    recipes.
  • add with 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.toml

The 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

Choose a tag to compare

@github-actions github-actions released this 08 Nov 18:34

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.toml

The 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.