Organize a Nintendo Switch NSP/NSZ library and convert between NSP and NSZ
Project description
nsptool
CLI to organize a Nintendo Switch NSP/NSZ library into a clean per-game layout and convert between NSP and NSZ (delegating to nsz).
Library layout
Library/
Game Name [0100XXXXXXXX0000] [US]/
Game Name [0100XXXXXXXX0000][v0] [US].nsp <- base game
Game Name [0100XXXXXXXX0800][v65536] [US].nsp <- update
Game Name (DLC Name)[0100XXXXXXXX1234][v] [US].nsp <- DLC
Files are identified by decrypting the CNMT metadata inside the container
(authoritative), falling back to filename parsing ([titleid][vN]) when the
title uses a master key that isn't in your prod.keys. Display names come
from an existing library folder for the same title first, then from
titledb.
Install
uv tool install nsptool # or: pipx install nsptool / pip install nsptool
Requirements:
prod.keysdumped from your own console (Lockpick_RCM or similar). Titles newer than your dump's highest master key can't be decrypted, so keep it current.
Setup
The first run opens a short wizard asking for your library directory, the
path to prod.keys, and the region tag, saved to
~/.config/nsptool/config.toml. Re-run it anytime with
nsptool config --setup.
nsptool config # show current settings
nsptool update-titledb # one-time (~150 MB) download, cached as a small index
nsptool links your keys file to ~/.switch/prod.keys, where nsz expects it.
Commands
# inspect files (titleid, version, type, name)
nsptool scan ~/Downloads/incoming
# add new files to the library; dry run by default, shows the full plan
nsptool library add ~/Downloads/incoming
nsptool library add ~/Downloads/incoming --apply # move for real
nsptool library add ~/Downloads/incoming --apply --copy # copy instead
nsptool library add ~/Downloads/incoming --library /path # different target
# normalize the library itself (fix drifted names/locations); dry run by default
nsptool library organize
nsptool library organize --apply
# per-game overview of the library (games, versions, DLC counts, sizes)
nsptool library list
# NSP <-> NSZ (verified by default)
nsptool compress "Game [0100...][v0] [US].nsp" --rm-source
nsptool decompress "Game [0100...][v0] [US].nsz" -o ./out
library add/library organize never overwrite: files whose titleid+version
already exist in the library are reported as duplicate, and name collisions
as conflict, both left untouched. --fast trusts filenames and skips
decryption.
Dev
uv sync
uv run pytest tests/
uv run ruff check src/ tests/
uv run ty check src/
CI (.github/workflows/ci.yml) runs the same three checks on every push.
License
MIT. Depends on nsz (MIT). This tool manages backups of games you own, dumped with your own console keys; it contains no keys and no copyrighted content.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nsptool-0.1.3.tar.gz.
File metadata
- Download URL: nsptool-0.1.3.tar.gz
- Upload date:
- Size: 19.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
96ca932ffa7e13bec6c3a4d438d7345c1aea1621eede56519bf77b773deb8854
|
|
| MD5 |
777bad5c43175f327d00cedf21b73c6b
|
|
| BLAKE2b-256 |
3483ed33987806679cce25bef9b86d75797116ba84dfdaffe302b9607e6f6083
|
File details
Details for the file nsptool-0.1.3-py3-none-any.whl.
File metadata
- Download URL: nsptool-0.1.3-py3-none-any.whl
- Upload date:
- Size: 17.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fadf956952a3d5ac32b18eded98fd407a6e7e307f3a27b2729458828ca4fd9a7
|
|
| MD5 |
87aaae2b59140cef3aeb786fdd05eff5
|
|
| BLAKE2b-256 |
7bf50689909724729e4411e2707da82ebca0b9fb44a7e2fb14c44087c306c0d1
|