Ninja Patch Tool creates and applies self-contained Ninja Patches (Diff Patches) using HDiffPatch. Use Ninja Capture Tool instead when a normal Update Patch can be created; Ninja Patch Tool is intended as a fallback.
A base is a clean, unmodified Warframe installation from a known Steam manifest. Select the Warframe installation root, where at least Cache.Windows, Tools, and Warframe.x64.exe are directly located.
Warframe Content depot manifests can be found on SteamDB.
- Windows 10 (64-bit) or newer
- Python 3.14 (not required for release executables)
Ninja Patch Tool targets Windows. On non-Windows systems, use the Windows release executables through Wine; native Linux/macOS source execution is not supported. Wine compatibility is not yet officially verified.
Install dependencies with:
py -3.14 -m pip install -r requirements.txt
Building a release additionally requires PyInstaller.
The commands below use the release executables. When running from source, prefix the corresponding .py script with py -3.14; for example, py -3.14 add_base.py ....
Path arguments may be absolute or relative to the current working directory. For example, if U43.5.1 is a folder in the directory where the command is run, U43.5.1 can be used instead of its full path.
Update options available on all main executables:
-a, --auto-update- Force an automatic update check/install for this run, overridingdata/update.jsonand update-check cooldowns-n, --no-auto-update- Disable automatic updating for this run, overridingdata/update.json-u, --check-update- Check GitHub Releases for a newer version without installing it; use this option without operation arguments-v, --version- Show the installed Ninja Patch Tool version
Add a clean, unmodified Steam manifest base to data/index.json. Pre-release manifests can use names such as Pre-U43.0.0.
add_base path name manifest_id [-a | -n]
path- Path to the clean Steam manifest basename- Warframe version, for exampleU43.5.1orPre-U43.0.0manifest_id- Steam manifest ID of the base
Example:
add_base "D:\WF\U43.5.1" U43.5.1 4895911296145320793Verify a Steam manifest base against its entry in data/index.json. This is optional before creating a patch because make_patch verifies the selected base automatically.
verify_base path name [-a | -n]
path- Path to the Steam manifest basename- Indexed Warframe version, for exampleU43.5.1orPre-U43.0.0
Create one self-contained Ninja Patch (Diff Patch) from a clean indexed Steam manifest base.
Before using an installation as new, fully download all language files and both DirectX 11 and DirectX 12 files in the Warframe Launcher, then open the launcher settings, click Optimize, and let the process finish.
Close Warframe and the Warframe Launcher before creating the patch.
make_patch base new output base_name [-c PRESET] [-a | -n]
base- Clean indexed Steam manifest basenew- Newer installationoutput- Patch filename or output path;.patchis appended automatically. A bare filename is saved in the tool'soutputfolder.base_name- Base name fromdata/index.json, for exampleU43.5.1orPre-U43.0.0-c, --compression PRESET- Compression preset (default:normal):normal,high,higher,maximum
Example:
make_patch "D:\WF\U43.5.1" "D:\WF\U43.5.2" "U43.5.2.patch" U43.5.1An existing patch is never overwritten automatically.
Apply a Ninja Patch (Diff Patch) from a file. By default, the base is left untouched and a separate installation is created next to the base, named after the patch.
apply_patch base patch [-o OUTPUT | -i] [-a | -n]
base- Base installationpatch- Patch filename or path;.patchis appended automatically. A bare filename is looked up in the tool'soutputfolder.-o, --output OUTPUT- Create a separate installation atOUTPUT; the path may not exist yet or may already be a truly empty directory (cannot be used with--in-place)-i, --in-place- Modify the base installation instead (cannot be used with--output)
Example:
apply_patch "D:\WF\U43.5.1" "U43.5.2.patch"Close Warframe and the Warframe Launcher before applying a patch, especially when using --in-place.
In-place mode creates a recovery backup of only the files the patch may modify or remove before changing the base. Interrupted operations are cleaned up or recovered automatically when possible.
Set VERSION in common.py, then run:
py -3.14 -m pip install pyinstaller
py -3.14 build_release.pyAdd -e / --extract to also extract the completed release ZIP beside the archive while still producing the normal ZIP and SHA-256 checksum:
py -3.14 build_release.py -eUpload both generated files to the matching GitHub Release (vVERSION):
NinjaPatchTool-vVERSION-Windows-x64.zip
NinjaPatchTool-vVERSION-Windows-x64.zip.sha256
The updater requires both release assets.