[0.7.4] - 2026-06-23
Added
install.sh --storage-dir <path>(andwinpodx setup --storage-path) chooses where the Windows VM lives (#646, thanks @realahmed7777). Put the VM disk + ISO on a roomier partition instead of~/.local/share/winpodx/storage— the directory is created with the same prep as the default (chattr +Con btrfs so the raw disk doesn't fragment, SSD emulation when the target is non-rotational). Fresh installs only; relocating an existing install stayswinpodx setup --migrate-storage --migrate-storage-target.- Fresh installs on a 24 GB+ host now default the VM to 8 GB RAM instead of 6 (#630, thanks @ismikes). Windows 11 runs noticeably smoother with 8 GB, and a host with ≥24 GB can spare it — the auto-tier that pre-fills
pod.ram_gbduringwinpodx setupbumps the mid tier from 6 to 8 GB on those hosts (CPU sizing unchanged; ≥32 GB / ≥12-thread hosts still get the 12 GB high tier). Existing installs keep your configured value; change it any time in Settings or withwinpodx config set pod.ram_gb 8. install.sh --win-iso <path>installs from a local Windows ISO instead of downloading (#647, thanks @ismikes). Point the installer at a Windows ISO you already have and it's staged into the storage dir as dockur'scustom.iso, so the install skips the ~5-8 GB Microsoft download — handy for repeated purge/reinstall cycles. Reflink-copied where the filesystem supports it (btrfs/xfs), so it costs no extra disk. (You could already drop acustom.isointo the storage dir by hand; this wires it to a flag and documents it in--help.)
Fixed
- The Windows password is no longer written to the log in cleartext. The "Launching RDP" / "Relaunching RDP" log lines printed the full
xfreerdpargv, which includes/p:<password>. Password tokens (/p:,/gp:) are now masked to/p:***before logging. (Local-only logs; pre-existing — hardened during the 0.7.4 security review.) - The Logs tab's Status / Pod logs / Inspect buttons now use the selected container backend instead of always running
podman(#658). On a Docker-backend install, the Terminal-tab diagnostics buttons shelled outpodman ps/podman logs/podman inspectregardless ofpod.backend, so they failed (or probed the wrong runtime) whenever podman wasn't the active backend. They now honourcfg.pod.backend—dockerwhen Docker is selected (manualfalls back topodman, where the container commands are inert). The pod-log tail's on-screen$ …echo was also corrected to print the real backend instead of a hardcodedpodman. - Opening a second document in an already-running Windows app now works instead of silently doing nothing (#657). With an app already open (e.g. Word), launching a second file for it — a second
gio launch, or right-click → Open with → the app — dropped the file: the live session was reused but the path was discarded. The file is now delivered into the running session — mapped to its\\tsclientUNC path and opened viaStart-Process, sent over the guest agent with a FreeRDP RemoteApp fallback when the agent is unreachable. Best-effort: failures are logged and never block the launch. - Right-click → Open with a Windows app now works on desktops that launch with a stripped PATH (e.g. Deepin) (#657). Generated
.desktopfiles used a bareExec=winpodx …, which fails withexec: winpodx: not foundwhen the desktop environment runs the launcher as a systemd transient unit that drops~/.local/binfrom PATH (Deepin'sdde-application-manager). Launching viagio launchfrom a terminal worked because it inherited the shell PATH, which masked the bug. The entry now embeds winpodx's absolute path, resolved withshutil.which()at install time (falling back to the bare name when it can't be resolved). - A missing RDP password now fails with a clear error instead of an unanswerable prompt (#569, thanks @biskasarchaniotakis). When neither
rdp.passwordnorrdp.askpasswas set, xfreerdp fell back to an interactive password prompt that can't be answered under a GUI launch, so the launch failed only with the opaqueInappropriate ioctl for device/ERRCONNECT_CONNECT_CANCELLED.build_rdp_commandnow raises up front, naming the missing setting. - Password rotation now surfaces a rejected
net userinstead of reporting success (#569). The guest-side PowerShell printedpassword setregardless of thenet userexit code, so a rejected change left the stored and actual Windows passwords out of sync while reporting rc=0 — which then shows up downstream as failed RDP auth / apps not opening. It now checks$LASTEXITCODEand exits non-zero on failure. /kbdis now an allowed FreeRDP extra flag (#657). Pass a keyboard-layout override viardp.extra_flags(e.g./kbd:layout:0x409) to work around FreeRDP keycode-scanning warnings on some layouts.- The Debian/Ubuntu
.debnow pulls inpodman-compose, and a missing compose provider fails loudly instead of cryptically (#644, thanks @paolodongilli). On Debian 13 the.debinstalled winpodx + podman but notpodman-compose, sowinpodx setupcouldn't create the container and died downstream withno such container "winpodx-windows".podman-composeis now a packageRecommends(apt installs it by default), and if no compose provider is present at setup time winpodx prints an actionable error naming the package to install per distro instead of silently skipping container creation. (Thecurl … install.shpath already installed it — this closes the.debgap.) - The maintenance task dialog (Debloat, Grow Disk, Sync Guest, …) no longer opens cramped (#550, thanks @ismikes). The
BusyDialogprogress window had only a 380px minimum width and sized its height to content, so it came up around 392×139 — too small to read comfortably, most visibly on the Debloat Speed run. Given a 480×168 floor. (The picker-window size and the fast-op auto-close were already addressed in 0.7.2.)
Contributors
Thanks to @cxgreat2014 for the code contributions (PRs #657, #658), and to @ismikes (#630, #550), @realahmed7777 (#646), @paolodongilli (#644), and @biskasarchaniotakis (#569) for the reports and suggestions that drove this release.