WinAppMigrator

Requirements and Testing

This page says what WinAppMigrator needs, and, honestly, how far its testing goes. The testing part follows the README's own list, What it has been tried on.

What It Needs

Need The app (old PC) An installer (new PC)
Windows Windows 10 or 11 is what it is for. The drive or image it reads can have Windows 7, Vista, 8, or 8.1. Windows 10 or 11
Processor x64, or Windows 11 on Arm through emulation. Not 32-bit Windows, and not Windows 10 on Arm, which cannot run x64 programs. The same. The installer refuses an app whose programs cannot run on that PC.
Administrator rights Always. It asks when it starts. Always. It asks when it starts.
Direct3D 12 For its window. It has no other way to run. For its window. Without it, use the command line.
Internet Optional. Used to download runtimes to put inside the installer. Not needed for runtimes inside the installer. Needed for a runtime installed with winget, for the DirectX End-User Runtime, and maybe for .NET Framework 3.5.
Room For the installer and the build's working files. The screen says how much. For the unpacked package and the app. The window says how much.

Reading an old PC over the network needs WinAppMigrator Client running there. It needs Windows 7, 8, 10, or 11, 32-bit or 64-bit, administrator rights, which it asks for, and the same local network as the PC the app runs on. It needs no internet. See Moving from a PC over the network.

Windows Versions

Windows 10 and 11 are what WinAppMigrator is for. But the tests on GitHub's machines run on Windows Server 2022, Windows Server 2025, and Windows 11 on Arm. Neither desktop Windows 10 nor desktop Windows 11 on an x64 PC has been run there.

One thing differs on older Windows: a file named like a device, such as aux.h, cannot be installed before Windows 11, because older Windows opens that name as the device. An installer holding one stops and says so, before installing anything. This was run on Windows Server 2022, build 20348, where it is refused, and on builds 26100 and 26200, where the file installs. Windows 10 itself has not been run. WinAppMigrator assumes the change came with build 22000, the first Windows 11.

An installer also compares the Windows it runs on with the one the app came from. If the new PC's Windows is older, it says so in the list before you install: the app's programs may start, and still rely on something the older Windows does not have.

The PC an app comes from can have an older Windows than 10. A drive or an image from Windows 7, Vista, 8, or 8.1 is read as such, and so is a PC with Windows 7 or later read over the network. Installers built from them are made for Windows 10 and 11. The app itself still runs only on Windows 10 or 11. See Apps from Windows 7, Vista, 8, or 8.1.

Processors

The app and the installers are x64 programs. On an Arm PC, Windows runs them through emulation. An installer checks what each of the app's programs is built for:

How It Is Tested

Every push to the project's main branch, and every pull request, runs a set of tests on GitHub's own machines, called runners. They are thrown away afterward, so the tests are free to change them. The full list is in CI jobs.

Five real open-source apps are moved between machines on every push: 7-Zip, PuTTY, Eclipse Mosquitto, windows_exporter, and Git LFS. They are installed by their publishers' own setups, which between them are a custom one, MSI, NSIS, and Inno Setup. The installers built from them go to fresh machines on Windows Server 2022, Windows Server 2025, and Windows 11 on Arm, both where each app was and in a folder of another name. Then Windows is asked to really use what was restored:

Each check is first shown to fail without the app. After an uninstall, the registry values, services, tasks, firewall rules, and folders it compares are as they were.

Fake apps are also built, installed, and taken back out in three ways: by an uninstall, by a failure late in an install, and by killing an installer part-way.

What Has Not Been Tested

Those are small, well-behaved apps on clean machines. This is how far that goes:

Area What has been run What has not
Which Windows Windows Server 2022 and 2025 on x64, and Windows 11 on Arm through emulation Desktop Windows 10, and desktop Windows 11 on x64. Only by hand have installers been run on Windows 11 25H2: see below.
A drive from another PC A virtual drive (VHD) built on the test machine, made to look like another PC's, including hostile on purpose A real drive from another PC
A disk image Nothing on GitHub's machines. By hand, .vhdx images of Windows 7 virtual machines: see below. Any image on GitHub's machines. A .vhd, and an image made by Disk2vhd or by Windows 7's own backup.
Windows 7, Vista, 8, and 8.1 Nothing on GitHub's machines. By hand, Windows 7 SP1, 32-bit and 64-bit: see below. Any of it on GitHub's machines. A real Windows 7 PC, rather than a virtual machine. Vista, 8, and 8.1.
Another PC over the network On GitHub's machines, only the app paired with the client's own code on one machine. By hand, the client on Windows 7 SP1 virtual machines and on Windows 11 25H2: see below. Windows 8 and 10 as the old PC. A real network between two separate PCs.
Runtimes The x64 Visual C++ 2015 and later, installed for real, on a machine it was first taken off. Every other runtime is downloaded and checked as Microsoft's. Installing any other runtime. The winget route and the Windows feature route.
Real windows The app, an installer, and an uninstaller opened on test machines that use a software renderer and a 1024x768 screen. Clicking through the screens is only done with no real window. A real graphics card, display scaling, and more than one monitor
Uninstalling The quiet command an entry in Settings records, QuietUninstallString. The windowed uninstaller is only opened. Clicking Uninstall in Settings, or in the uninstaller's window
Signing 0.5.0 is the first release whose app is signed, and 0.6.0 the first whose client is, run on Windows 7 SP1 with none of its later updates. A certificate of your own on an installer, only with a throwaway test certificate. The UAC prompt for the signed client on Windows 7. A real certificate of your own on an installer.
Anything at all An app with online activation, a driver being loaded, an app the size of an office suite, an app's own updater after a move, and a restart afterward

So try an installer before you rely on it. Install it on a spare PC, or a virtual machine with Direct3D 12, and check the app works, before you wipe the old PC.

Windows 7, by Hand

This was run by hand, away from GitHub's machines, and is not repeated on every push.

Two Windows 7 SP1 virtual machines, one 32-bit and one 64-bit, had 7-Zip 9.20, Notepad++, VLC 2.2.8, and two small test apps of the Windows XP era installed. One test app, LegacyNotes, keeps its settings beside itself, so Windows 7 kept them in its VirtualStore. The other, RetroBlocks, uses DirectX 9. Each machine's disk was exported as a .vhdx, read with the code behind Disk Image…, and built into installers that passed their checks.

LegacyNotes, RetroBlocks, and Notepad++ were installed on Windows 11 25H2, run as a person would, and uninstalled. Each started with what it had on Windows 7. 7-Zip and VLC were built but not installed, as that PC has newer ones. See Apps from Windows 7, Vista, 8, or 8.1.

Network PC, by Hand

This was also run by hand, away from GitHub's machines.

WinAppMigrator Client was run on the same Windows 7 virtual machines, 32-bit and 64-bit, and on Windows 11 25H2. All five apps were built over the network from the 64-bit machine, each in a few seconds, with the same files and settings as from its disk image. LegacyNotes, RetroBlocks, and Notepad++ from those installers were installed and run on Windows 11, as above. The client was also run on Windows 7, 32-bit and 64-bit, with Windows' own DLLs planted beside it: none were loaded into it, before it copied itself to a folder only an administrator can change or after, through pairing and a whole build.

Windows 8 and 10 as the old PC have not been run, and neither has a real network between two PCs: the virtual machines were on a network of their own, inside the PC that built. The signed client was run on Windows 7 SP1 virtual machines, 32-bit and 64-bit, with none of its later updates. It worked, and Windows read its signature as untrusted, because they lacked Microsoft's 2020 root certificate. With that root added, the 64-bit one read it as valid. See Moving from a PC over the network.

Other Things Worth Knowing

Last changed 2026-11-11. Describes WinAppMigrator as of its latest release, 0.6.0.