The Problem

Running Windows productivity and creative applications on a GNU/Linux desktop without dual‑booting or losing native integration. Users typically face broken file‑type associations, absent taskbar pinning, and disjointed alt‑tab behavior when using static RDP windows. This repo addresses the gap by bringing Windows apps into the Linux desktop as first‑class citizens, with Nautilus integration and seamless window management.

What This Does

WinApps runs Windows inside a Docker, Podman, or libvirt VM, queries the Windows registry for installed applications, and generates host‑side .desktop shortcuts. The app catalog lives in apps/ (177 entries), each with an info file and icon.svg (e.g., apps/photoshop-2024/icon.svg, apps/word-o365/info). Rendering is handled by FreeRDP, which streams the Windows UI to the host compositor so applications appear alongside native Linux windows. Nautilus right‑click integration and a desktop widget (referenced from the README) enable file‑type–based launching and centralized subsystem management. The .github/ directory contains workflow templates but no active CI pipeline.

How It Is Wired

Execution begins at the CLI entry point bin/winapps. The binary interrogates the running Windows VM for registry‑listed applications, matches them against the apps/ catalog, and writes desktop entries to the host menu. The heaviest maintenance burden is setup.sh (1065 code lines, max indentation depth 6): its size and nested control flow make changes ripple widely, and static analysis flags it for deep cognitive‑load risk. The import graph across the two Shell files analyzed shows zero internal modules and no circular dependencies, meaning the codebase is flat in structure but dense in setup.sh. Outside the repo, the tool depends on a hypervisor (Docker/Podman/libvirt), FreeRDP, and a Windows VM image; it writes .desktop files to the host filesystem and mounts \\tsclient\home for home‑directory access.

How To Use It

Clone the repository and provision a Windows VM:

git clone https://github.com/moses-y/winapps
cd winapps
sudo ./setup.sh  # installs dependencies, configures the VM backend
winapps start    # launches the Windows instance
winapps install <application-name>  # installs a supported app from the catalog

Configuration is minimal; environment variables for the VM path or display backend can be set in the user shell profile or adjusted in setup.sh. With the VM running, Nautilus integration activates automatically, and .desktop entries appear in the GNOME/KDE application menu.

Real-World Use

A Linux user needing Microsoft Office or Adobe Photoshop can run winapps install excel-o365 and open .xlsx files via Nautilus right‑click. The Windows instance runs in the background, and alt-tab cycles between the Linux terminal and the Office window as if it were native. File‑type handlers are registered during installation, and the UI blends with the host theme through FreeRDP.

Code Health & Issues

  • Medium – setup.sh has max indentation depth 6 and 1065 lines, making control flow hard to follow and changes risky. Fix: flatten with guard clauses and split into cohesive units by responsibility.
  • Medium – Two large binaries are tracked in Git: docs/readme/launcher.gif (9.6MB) and docs/readme/installer.gif (5.4MB), plus a 10.9MB spreadsheet in docs/. Fix: move these to Git LFS or fetch them in a setup step.
  • Observed: no test files, no CI/CD pipeline, no Dockerfile at root (provisioning documented in markdown). License present, no committed secrets, no lockfile.

The Bottom Line

WinApps delivers on its promise of integrating Windows apps into a Linux desktop, offering real Nautilus and menu integration that dual‑boot or static RDP cannot match. The codebase is functional but has a maintainability bottleneck in setup.sh and carries oversized media that hurts clone times. It’s a solid choice for Linux users who need occasional Windows app access without leaving their desktop, provided they’re comfortable managing a VM and accept the repository’s hygiene trade-offs.