Skip to main content
Any Framework

dnx for native tools packaged as NuGet packages.

Published
Aug 27, 2026
1mo ago
Total Downloads
391
391

Install

dotnet add package ndx.osx-arm64 --version 1.0.0

No framework information available.

README

OSS GitHub

ndx (native dotnet execute) is dnx for native tools packaged and distributed as NuGet packages. Same one-shot CLI, same PACKAGE[@VERSION] identity, same restore flags, same global packages folder.

If you can dnx stop, you can ndx stop. dotnet dnx and dotnet tool exec are the same command; ndx speaks that protocol, including RID-specific Native AOT tools (stop, go, winget) and ordinary framework-dependent tools (dotnetsay).

A first run downloads into the NuGet cache. A later ndx tool@version starts the cached binary — no SDK, no restore.

Install

macOS / Linux:

curl -fsSL https://github.com/devlooped/ndx/releases/latest/download/install.sh | sh

Windows (PowerShell):

irm https://github.com/devlooped/ndx/releases/latest/download/install.ps1 | iex

Alternatively (perhaps of debatable utility), you can install using the .NET SDK too: dotnet tool install -g ndx

Update

Self-update the installed binary (optional version, including downgrades):

ndx --update
ndx --update 0.1.0

Uninstall

macOS / Linux:

curl -fsSL https://github.com/devlooped/ndx/releases/latest/download/uninstall.sh | sh

Windows (PowerShell):

irm https://github.com/devlooped/ndx/releases/latest/download/uninstall.ps1 | iex

Usage

ndx

Same shape as dnx / dotnet dnx / dotnet tool exec:

dnx stop -- --help
ndx stop -- --help

dnx [email protected] -- --help
ndx [email protected] -- --help

dnx [email protected] -- Hello
ndx [email protected] -- Hello

Pin a feed the same way (here the CI feed used for the timings below):

dnx --source https://kzu.blob.core.windows.net/nuget/index.json [email protected] -- --help
ndx --source https://kzu.blob.core.windows.net/nuget/index.json [email protected] -- --help

stop is a Native AOT RID tool. dotnetsay is a classic framework-dependent tool. Both are just NuGet packages; ndx picks the host RID and starts Runner=executable binaries directly, or dotnet exec for Runner=dotnet.

An exact version already in the cache (NUGET_PACKAGES, then nuget.config's globalPackagesFolder, then ~/.nuget/packages) is not downloaded again. A first tool@version run builds the nupkg URL from the service index (cached for the process) and lists versions only if that GET is 404. Packages written by dnx or dotnet restore are reused; packages written by ndx are visible to them.

A floating version — unspecified, @*, @*-*, or a NuGet range — stays current. ndx starts the latest match, watches the feed, downloads a newer matching version before stopping the child, then sends SIGINT / Ctrl+C (and WM_CLOSE if the tool is a GUI) and restarts. Short tools still exit as soon as the child exits. Pin an exact version ([email protected]) to disable that loop.

The poll interval defaults to 5 seconds and can be set in .netconfig:

[ndx]
    interval = 5

ndx walks from the working directory up, then ~/.netconfig. --verbosity quiet hides the Updating … line.

Shared flags: --source, --add-source, --configfile, --version, --prerelease, --yes/-y, --allow-roll-forward, --verbosity/-v, --disable-parallel, --ignore-failed-sources, --no-http-cache, --interactive.

Startup time

Cold is empty-cache download → start; cached is start only (tool@version so neither runner resolves latest). linux-x64 (WSL2) is SDK 10.0.110; win-x64 is SDK 10.0.303.

Tool Runner Cold linux-x64 Cold win-x64 Cached linux-x64 Cached win-x64
[email protected] (native AOT) dnx 2.2 s 2.1 s 580 ms 520 ms
ndx 1.2 s 1.5 s 10 ms 34 ms
[email protected] (framework-dependent) dnx 1.6 s 1.8 s 570 ms 545 ms
ndx 849 ms 1.1 s 12 ms 50 ms
winget (native AOT TUI, Windows) dnx — 2.7 s — 820 ms
ndx — 1.2 s — 275 ms

Isolated NUGET_PACKAGES. stop / dotnetsay from https://kzu.blob.core.windows.net/nuget/index.json; winget from nuget.org. Cold is the median of 3 empty-cache runs. Cached is the median of 10 runs after one seed. stop invoked as -- --help; dotnetsay as -- ndx. winget is a TUI so it does not exit on its own: cold is winget (latest), cached is [email protected]; each run waits until winget-tui is up, then ndx [email protected] signals that PID and the clock stops when the runner exits. dnx is the SDK script (dotnet dnx). winget timings are win-x64 SDK 11.0.100-preview.

Sponsors

Clarius Org MFB Technologies, Inc. SandRock DRIVE.NET, Inc. Keith Pickford Thomas Bolon Reuben Swartz Jacob Foshee Eric Johnson Jonathan Ken Bonny Simon Cropp agileworks-eu Zheyu Shen Vezel ChilliCream 4OTC domischell Adrian Alonso torutek Ryan McCaffery Seika Logiciel Andrew Grant eska-gmbh Geodata AS Jiri Slachta

Sponsor this project

Learn more about GitHub Sponsors

Adoption Assessment

Assess this package against its supported frameworks, license, maintenance signals and dependency graph before making it a project standard.

No target framework metadata is available. Confirm compatibility in a representative project before standardising on this package.

Related Guides & Workflows

Learn how to evaluate, integrate, or audit this package in your .NET project.