A NuGet update, a Windows SDK target, and a user’s OS build answer different questions. Treating them as one version is how a clean build becomes a runtime failure.
The failure can look almost trivial: a project restores, compiles, and launches on the developer’s current PC, then reaches a newer platform API on an older supported machine and stops. Nothing about the successful build proved that the user’s operating system implemented that API. It proved only that the compiler could see it.
This guide is the postmortem for that category error. The useful model is not “Which Windows version does my app use?” It is three separate questions: which app framework did the project reference, which API declarations were visible at compile time, and which implementations exist on the machine at runtime?
Symptom: one green build, three unresolved versions
Microsoft’s Windows versions and SDK overview separates the layers directly. The Windows App SDK arrives as a NuGet package and supplies framework features such as WinUI, lifecycle, windowing, and notifications. The Windows SDK supplies the declarations your compiler can reference. Windows itself supplies the platform implementations that a process can actually call.
That separation matters because the Windows App SDK is versioned independently of both the OS and the Windows SDK. Version 2.2 was released on June 9, 2026 and supports Windows 10 version 1809, build 17763, as its minimum OS. That minimum does not make every newer Windows platform API available on 1809. It says the framework can run there, subject to the capabilities your app chooses to call.
- Framework clock — Windows App SDK: select a stable
Microsoft.WindowsAppSDKNuGet version for WinUI and framework capabilities. Its release cadence is independent. - Compiler clock — Windows SDK: select the target that exposes the Win32, WinRT, and COM surface your code may reference. A newer target broadens compile-time visibility.
- Machine clock — Windows OS: select the oldest build your audience must run. That build determines which platform APIs exist when the app executes.
Timeline: where the assumption slips
First, a developer updates the Windows App SDK package to obtain a framework feature. Next, the project compiles against a recent Windows SDK, so newer platform symbols appear in the editor. Finally, the minimum supported OS remains lower to preserve reach. Each choice is legitimate. The defect enters only when code treats compile-time visibility as runtime availability.
Microsoft’s version-specific release notes separate API additions and fixes inside a Windows App SDK train from the operating-system boundary, and the 2.0 notes document the move to a SemVer-aligned package scheme. Release notes describe what changed in a train; they do not raise the user’s OS build.
Root cause: the target was mistaken for a promise
A high Windows SDK target tells the compiler what it may build against. It does not install those APIs on older devices. Microsoft’s rule is blunt: if an API is newer than the user’s OS, the call needs a runtime availability check and a fallback. The platform analyzer can warn when the project’s compile target exceeds its declared minimum, but the shipping decision still belongs in the application.
The same distinction prevents another deployment mistake. The Windows SDK is a development-time tool; its headers and libraries are not an app runtime. Windows platform APIs stay part of the OS. Windows App SDK runtime binaries, however, can be consumed through a shared framework-dependent deployment or bundled with a self-contained app. Those options change setup, size, servicing, and isolation—not the set of Windows platform APIs implemented by the OS.
Repair: make compatibility a row, not a hunch
Record four fields for every release: Windows App SDK package and channel, Windows SDK compile target, minimum OS build, and deployment model. Then map each newer platform call to either a raised minimum or a tested fallback path. Do not write “supports Windows 10” without the build number; the label is too broad to function as an engineering contract.
For unpackaged or externally located framework-dependent apps, deployment is part of compatibility. Microsoft’s deployment guide describes installing the Windows App SDK runtime through its installer or deploying the MSIX packages through an existing setup program. The release test therefore includes clean machines, supported processor architectures, managed-device policy, missing-runtime behavior, repair, and update—not only a developer machine where the runtime already exists.
Detector: prove the lower boundary
Build on the newest supported toolchain, but run the artifact on the oldest declared OS build. Exercise every guarded branch there. For framework-dependent delivery, begin once with no qualifying Windows App SDK runtime and verify the installer or bootstrap path produces a useful, recoverable state. For self-contained delivery, verify that the expected runtime files are present and that servicing assumptions match the package you actually distribute.
Keep the matrix in release review. A package update should trigger runtime and deployment checks even when the OS minimum does not change. An OS-target update should trigger API-availability review even when the Windows App SDK package stays fixed. The detector works because it follows ownership instead of treating “Windows version” as one field.