项目文件夹
First run opened the full eight-page dashboard for someone with nothing set up, then dropped a bare QMessageBox on top of it 2.3s later. That dialog aligned its options with padding spaces (which misaligns in a proportional font), pointed GUI users at `winpodx setup` in backticks, showed no host state at all, and its "Customize" button could not ask anything without a tty. The wizard replaces it: Welcome, Prerequisites, Configuration, Review, Install, Finish, with a step rail in the 0.11.0 Settings style. Prerequisites renders the seven HostState checks as pass/fail rows and fixes the repairable ones through a single `apply_via_pkexec` prompt -- kvm group, subuid, subgid and module persistence in one polkit authorisation. Required failures disable Next; `kvm_module_persistent` is marked optional and does not block. Configuration pre-fills from the same detectors the CLI uses, and Install embeds the existing BringUpProgressDialog rather than growing a second progress UI. The collected answers go to `handle_setup` non-interactively via the preset seam, so the GUI and CLI share one install path. Tools gains "Reinstall Windows", which opens the same wizard pre-filled from the current config behind a destructive-action confirmation. Verified by running the GUI against an isolated XDG root: the wizard opens first, the prerequisite page detects this host's missing kvm group membership, and Next stays disabled until it is resolved. Left out: no tuning_profile widget yet (the namespace always sends "auto"), and the ja/zh/de/fr/it catalogues carry the short keys only, so long wizard copy falls back to English.
Click an app. Word opens. That's it.
Windows apps as native Linux windows — real icons, real WM_CLASS, pin-to-taskbar.
FreeRDP RemoteApp over dockur/windows. No permanent full-screen desktop, no manual setup.
# Install (latest stable release)
curl -fsSL https://raw.githubusercontent.com/kernalix7/winpodx/main/install.sh | bash
# Development branch (may be unstable)
curl -fsSL https://raw.githubusercontent.com/kernalix7/winpodx/main/install.sh | bash -s -- --main
# Uninstall (keeps the Windows VM; add --purge to wipe everything)
curl -fsSL https://raw.githubusercontent.com/kernalix7/winpodx/main/uninstall.sh | bash -s -- --confirm
Windows About / Task Manager / PowerShell, each in its own Linux window, next to the WinPodX Dashboard.
Works on
English · 한국어 · Install · Usage · Features · Architecture · Comparison
Contents: Requirements · Install · Launch · Desktop app · Key features · Documentation · Testing · Contributing
Status: Beta
WinPodX is in active development, v0.11.0.
- A Windows 11 Settings-style desktop app: adaptive navigation, custom window chrome, and a theme that follows your desktop's light or dark scheme
- Dashboard for pod state, resource use, running apps, and pinned apps in one view
- dockur HTTP provisioning progress in the CLI and GUI, with a log-based fallback
winpodx launchas a compact Start-style flyout, plus a refreshed tray launcher- Python 3.10 is the new minimum
Full detail in the CHANGELOG.
What you get
Each Windows app opens as its own Linux window, keeping its icon, taskbar entry, and file associations. Clipboard, audio, printers, and your home directory are shared both ways. You only see a full Windows desktop when you ask for one with winpodx app run desktop.
WinPodX runs Windows in a container in the background and starts it on demand — the pod pauses when idle and wakes on your next launch.
Requirements
Virtualization must be available before Windows can boot. These three checks catch almost every "installed fine but Windows never started" report:
| Requirement | Check | Fix |
|---|---|---|
| Intel VT-x or AMD-V enabled | lscpu | grep -i virtualization |
Enable Intel Virtualization Technology, SVM Mode, or VT-x in firmware. |
| KVM module loaded | lsmod | grep kvm |
sudo modprobe kvm_intel or sudo modprobe kvm_amd. |
| Your user can reach KVM | id -nG | tr ' ' '\n' | grep kvm |
sudo usermod -aG kvm $USER, then log out and back in. |
Hardware: x86_64 or aarch64 with virtualization extensions, 8 GB RAM (12 GB recommended), and room for the 64 GB default Windows disk plus an installer ISO.
Software: FreeRDP 3+ and Podman with a compose provider, or Docker. Rootless Podman also needs /etc/subuid and /etc/subgid entries. Run winpodx setup-host to fix the group and subuid setup in one prompt, and winpodx doctor any time to see what is still missing.
Install
The curl one-liner in the header works on every supported distribution and finishes setup for you. Native packages are also available:
# openSUSE Tumbleweed / Leap / Slowroll
sudo zypper addrepo https://download.opensuse.org/repositories/home:/Kernalix7/openSUSE_Tumbleweed/home:Kernalix7.repo
sudo zypper install winpodx
# Fedora 42 / 43 / 44 (dnf5 — Fedora 41+)
sudo dnf config-manager addrepo --from-repofile=https://download.opensuse.org/repositories/home:/Kernalix7/Fedora_43/home:Kernalix7.repo
sudo dnf install winpodx
# Debian / Ubuntu — the matching .deb from the latest release
sudo apt install ./winpodx_<version>_all_debian13.deb
# AlmaLinux / Rocky / RHEL 9 / 10 — the matching .rpm
sudo dnf install ./winpodx-<version>-0.noarch.el10.rpm
# Arch
yay -S winpodx
# Nix
nix run github:kernalix7/winpodx
# AppImage — one file, any x86_64 distro
chmod +x winpodx-x86_64.AppImage
./winpodx-x86_64.AppImage setup
After a package, AppImage, source, or wheel install, run setup once. Package installs deliberately ship the binary only, so apt install never triggers a long Windows download on its own:
winpodx setup # host-detected defaults, no prompts
winpodx setup --customize # pick backend, cores, RAM, edition, language, timezone, debloat
Setup writes the configuration, verifies the host, provisions Windows, discovers your apps, and registers desktop entries.
Updating: re-run the curl installer to upgrade a curl install in place, keeping your config and VM (this works on Bazzite and other rpm-ostree hosts too). Package and AppImage installs update through whatever you installed them with.
On RHEL 9, AlmaLinux 9, and Rocky Linux 9 the default python3 is older than WinPodX supports; the el9 package pulls in the Python 3.11 stack from AppStream automatically.
Offline and air-gapped installs, building from source, Nix, and full uninstall are covered in INSTALL.md.
Launch
winpodx app run word # Launch Word
winpodx app run word ~/doc.docx # Open a file with it
winpodx app run desktop # Full Windows desktop
winpodx launch # Searchable Start-style app picker
winpodx gui # Desktop app
Or just click a Windows app in your application menu — WinPodX installs real desktop entries for everything it discovers. Bind winpodx launch to a custom shortcut (KDE: System Settings → Shortcuts; GNOME: Settings → Keyboard) for a system-wide hotkey.
Desktop app
winpodx gui opens a Windows 11 Settings-style shell with eight pages:
| Page | What it holds |
|---|---|
| Dashboard | Pod state with Start/Stop, RAM / CPU / disk rings, quick actions, running sessions, pinned apps |
| Applications | Start Menu tiles with search, category counts, grid or list view, and per-app actions |
| Settings | Connection, hardware, Windows Update, integration, and language, grouped by intent, with a marker until you save |
| Tools | Pod and guest operations — suspend, resume, grow disk, debloat, apply fixes |
| Terminal | Pod and app logs with a filtered command bar |
| Info | Version, health checks, and one-click copyable diagnostics |
| Devices | USB and PCI passthrough, grouped by bus, with risky assignments flagged |
| License | License text and third-party acknowledgements |
The navigation pane is 320 px wide normally and collapses to a 48 px icon rail below 1100 px, where the hamburger button overlays it on top of the content. The theme follows your desktop's light or dark preference; set WINPODX_COLOR_SCHEME=light|dark to override it, or WINPODX_NATIVE_TITLEBAR=1 to use your window manager's decorations instead of the built-in title bar. See the GUI tour for the rest.
Key features
| Area | What it does |
|---|---|
| Seamless apps | RemoteApp opens each app as a native window with real icons, WM_CLASS, taskbar integration, file associations, multi-monitor support, and up to 50 concurrent RDP sessions. |
| App discovery | Imports Start Menu-visible Win32 and UWP apps with their icons. Rescan with winpodx app refresh or from Applications. |
| Sharing | Two-way clipboard, audio, printers, \\tsclient\home, removable media, and USB or PCI passthrough. |
| Reverse-open | Linux apps appear in the Windows Open with menu and receive files back on the host through a controlled listener. |
| Pod operation | Podman by default, with Docker and manual RDP supported. Auto-pauses when idle, recovers a stalled guest, rotates passwords, and grows the Windows disk. |
| Privacy and tuning | Optional Windows debloat, host-adaptive KVM tuning, DPI detection, an allowlist for FreeRDP flags, time sync, and optional bare-metal disguise. |
| Languages | CLI, tray, and desktop app in English, Korean, Chinese, Japanese, German, French, and Italian. |
Documentation
| Document | Contents |
|---|---|
| INSTALL.md | Every install path, updating, offline, source, Nix, uninstall |
| USAGE.md | CLI reference, GUI tour, health checks, configuration |
| FEATURES.md | RemoteApp, reverse-open, peripherals, discovery, passthrough |
| ARCHITECTURE.md | System diagram, source tree, data flows |
| COMPARISON.md | WinPodX vs winapps, LinOffice, winboat, and Wine |
| CHANGELOG.md | Version history |
| CONTRIBUTING.md | Development setup and workflow |
| SECURITY.md | Security reporting process |
Testing
export PYTHONPATH="$PWD/src"
python3 -m pytest tests/ -n auto # 4000+ tests, seconds in parallel
ruff check src/ tests/
ruff format --check src/ tests/
Contributing and license
Read CONTRIBUTING.md before sending a change; security reports follow SECURITY.md. WinPodX is MIT licensed, Kim DaeHyun.
Star History
Support
If WinPodX makes your Linux desktop a little nicer:
GitHub Sponsors handles recurring or one-time sponsorship, Ko-fi covers international cards and PayPal, and fairy.hada.io is a Korean tipping platform. Bug reports, PRs, and stars are just as welcome — and free.