winapp CLI gives cross-platform apps a Windows package identity
winapp, the Windows App Development CLI, is a single command-line interface for managing Windows SDKs, packaging, generating app identity, manifests, certificates, and using build tools with any app framework.
At a glance
- What is it?
- The Windows App Development CLI is a single command line tool for managing Windows SDKs, generating app identity, manifests and certificates, and packaging MSIX, usable from any framework including Electron, Rust, Qt and .NET. It is MIT licensed, marked Public Preview, and the last push was on 2026-10-15.
- Who is it for?
- winapp CLI suits a developer shipping a cross-platform app to Windows who wants notifications, shell integration, protocol handlers and on-device AI without rewriting the app for the Windows App SDK, and it is the wrong tool if you are building a native .NET or C++ Windows app that already has a working packaging pipeline.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly C#, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
Package identity is the thing being bought
winapp CLI is a single command line interface for managing Windows SDKs, packaging, generating app identity, manifests, certificates and using build tools with any app framework. The tool's stated purpose is to bridge the gap between cross-platform development and Windows-native capabilities.
The problem it solves is stated in the why section. Many Windows APIs require your app to have package identity, which is what enables access to parts of the operating system you would not otherwise have. With identity, the app gains access to user-first features like notifications, OS integration and on-device AI.
That is the whole reason a CLI exists here. Adding a package identity to an existing app is a multi-step manual process, and the README shows the before and after: without the CLI, setting up a project involves 12 manual steps, downloading SDKs, generating headers, creating manifests and more, and with the CLI it is four commands, init, create-addon, add-electron-debug-identity and pack.
The list of what identity unlocks is the best argument for the tool. Interactive native notifications and notification management. Integration with Windows Explorer, the taskbar and the share sheet. Protocol handlers, so yourapp:// URIs work. Web-to-app linking, so a website opens your app. On-device AI, with local LLM, text and image APIs. Custom CLI commands through AppExecutionAlias. Controlled access to camera, microphone and location with user consent. Background tasks that run when the app is closed. File type associations. Startup tasks that launch at login. App services to expose APIs.
Those are capabilities that are simply unavailable to an unpackaged app, and they are the reason a developer working in Electron or Rust would want this at all.
It is a Public Preview, and main is not the release
The README opens with a status warning that is worth quoting in full, because it changes how you should use the tool.
The status is Public Preview. The Windows App Development CLI is experimental and in active development, and the project asks for feedback through issues. A second note adds that the main branch contains work that is in active development, and that documentation, features and behavior there may differ from what is publicly released. For the latest stable version, the note points at the latest release, and for the newest in-progress build it points at an install section for the main branch.
The release record is consistent with a pre-1.0 tool in active development. v0.6.1 came on 2026-08-19, v0.7.0 on 2026-09-24 and v0.7.1 on 2026-10-01, and the last push was on 2026-10-15. The repository is not archived.
The distinction between main and a release matters more here than it would for a stable library, because this tool writes files into your project and generates manifests that affect how Windows runs your app. A change in behaviour on main can mean a different manifest, a different identity or a different packaging outcome, and a CI pipeline tracking main would pick that up without a version bump.
The practical rule is to pin. The README offers both a stable path and a latest build path, and the difference between them is exactly the difference between reproducible and not.
Four distribution channels, and the project can be used as a tool
The distribution options cover the different ways a Windows developer already works, and there is a fourth option that is unusual for a CLI.
The badges at the top of the README point to a WinGet package under Microsoft.WinAppCli, an npm package at @microsoft/winappcli, a NuGet package at Microsoft.Windows.SDK.BuildTools.WinApp, and GitHub releases. So a machine with winget, a Node toolchain, a .NET toolchain, or nothing but a browser and a download can all get the tool.
The NuGet package name is worth noting, because it explains the relationship to the rest of the Windows developer tooling. The package sits under the Microsoft.Windows.SDK.BuildTools namespace, which suggests it is positioned as part of the Windows SDK build tools family rather than as a standalone utility, and there is a nuget.config in the repository.
The fourth channel is the plugins/ directory and the plugin.json file at the top level. Together with the .claude-plugin/ directory and the AGENTS.md file, this suggests the tool exposes itself to coding agents as well, which is a growing pattern for developer tooling. The scripts/ directory and global.json suggest a .NET based implementation, which matches the primary language being C#.
There is also a winapp.example.yaml at the top of the repository, which is the configuration file, and llms.txt for machine readable documentation. The samples/ directory is the most telling part, and it is covered separately below.
The samples directory is the real documentation of framework support
The samples/ directory lists a project for every framework the tool claims to work with, and reading the list is the fastest way to understand what the tool actually does.
There are samples for cpp-app, cpp-app-winui, cpp-winui-app, dotnet-app, dotnet-file-app, electron, electron-winml, flutter-app, maui-app, node-winui, rust-app, sparse-app, tauri-app, winui-app, winui-solution, winui-unpackaged-app, wpf-app, and packaging-cli, plus a SampleTestHelpers.psm1 PowerShell module.
Two of these names carry the most information. electron-winml suggests a path for adding Windows Machine Learning to an Electron app, and winui-unpackaged-app suggests the tool handles the unpackaged case, where the app runs without an MSIX package but still wants some of the modern APIs.
The presence of a sample for each framework is what makes the claim usable. A CLI that says it works with any app framework is only credible if you can see a working example for the framework you use, and here each framework gets its own directory with its own build file. The sparse-app and packaging-cli samples are the two that tell you the tool is not only about full application packaging.
The sample names also reveal the scope of the surface. WinUI, WPF, MAUI, .NET, C++ with Win32, Flutter, Electron, Tauri, Rust and Node each get different treatment, because the amount of work to give an Electron app an identity is different from the work to package a C++ WinUI app that was already designed for it. The samples are where those differences are visible.
What the tool does not do, and where the friction remains
The first limit is that it does not remove the requirement to understand Windows packaging. The CLI takes you from twelve manual steps to four commands, and the four commands are init, create-addon, add-electron-debug-identity and pack. Each of those still has a manifest, an identity, a certificate and a set of assets behind it, and the tool generates them rather than explaining them. For a developer who will maintain the app for years, that is usually the right trade. For a developer who just wants to ship a build once, it may be more than they need.
The second is that the tool is Windows only, and there is no way around that. The value it delivers, package identity and the APIs that come with it, is a Windows concept, so the cross-platform part of the project means your app stays cross-platform and the Windows-specific parts are handled by this tool and whatever the framework needs.
The third is the Preview status. The README says the behaviour on main may differ from what is released, which means a CI pipeline that upgrades winapp can change how your app is packaged. That is manageable with a pinned version, and it is a real risk without one.
The fourth is that the features are Windows-version dependent. The README links each capability to Microsoft documentation for a specific API, and those APIs are not all present in every Windows release, so a packaged app that calls an on-device AI API needs a minimum OS version in its manifest and a fallback path for older systems.
The repository does have a benchmarks/ directory, which is unusual for a packaging tool and suggests the team cares about how long the commands take, and there is a tests/ directory plus a SUPPORT.md and SECURITY.md for the process around it.
Editorial conclusion
winapp CLI suits a developer shipping a cross-platform app to Windows who wants notifications, shell integration, protocol handlers and on-device AI without rewriting the app for the Windows App SDK, and it is the wrong tool if you are building a native .NET or C++ Windows app that already has a working packaging pipeline. Before relying on it, note that the tool is a Public Preview and the main branch is explicitly in active development, so pin a release rather than tracking main. Verify first that the framework you use has a sample in the samples/ directory, since the listed frameworks each get their own sample and the difference in how each one is packaged is where the friction will be.
Frequently asked questions
What is the winapp CLI?
It is a single command line interface for managing Windows SDKs, packaging, generating app identity, manifests and certificates, and using build tools with any app framework. The goal is to bridge the gap between cross-platform development and Windows-native capabilities.
What can package identity give my app?
The README lists native notifications, Explorer, taskbar and share sheet integration, protocol handlers such as yourapp:// URIs, web-to-app linking, on-device AI with local LLM and text and image APIs, AppExecutionAlias commands, controlled camera, microphone and location access, background tasks, file type associations, startup tasks and app services.
How do I install the winapp CLI?
The README badges point to a WinGet package under Microsoft.WinAppCli, an npm package at @microsoft/winappcli, a NuGet package at Microsoft.Windows.SDK.BuildTools.WinApp, and GitHub releases. There is also an install-from-latest-build path for the main branch.
Is winapp CLI stable?
The README marks it as Public Preview, experimental and in active development, and warns that the main branch contains work in active development whose documentation, features and behavior may differ from what is publicly released. The last release was v0.7.1 on 2026-10-01 and the last push was on 2026-10-15.
Which frameworks does winapp CLI support?
The samples directory holds a project per framework, including cpp-app, dotnet-app, electron, electron-winml, flutter-app, maui-app, node-winui, rust-app, sparse-app, tauri-app, winui-app, winui-unpackaged-app, wpf-app and packaging-cli, each with its own build file.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/microsoft-winappcli)Was this useful?