3e779be6f3
CI / lint (push) Failing after 13m4s
CI / test (3.11, ubuntu-latest) (push) Failing after 2m4s
CI / test (3.13, ubuntu-latest) (push) Successful in 13m30s
CI / test (3.14, ubuntu-latest) (push) Successful in 17m21s
CI / test (3.12, ubuntu-latest) (push) Successful in 17m55s
CI / discover-apps-ps (push) Successful in 1m56s
CI / test (3.9, ubuntu-latest) (push) Successful in 13m17s
CI / test (3.10, ubuntu-latest) (push) Successful in 26m21s
CI / audit (push) Successful in 13m38s
Deploy site / deploy (push) Has been cancelled
CI / test (3.14, ubuntu-24.04-arm) (push) Has been cancelled
1037 lines
54 KiB
Plaintext
1037 lines
54 KiB
Plaintext
winpodx (0.9.0) unstable; urgency=medium
|
||
|
||
* Feature + hardening release: Windows apps can now be registered as URL-scheme
|
||
handlers on Linux — clicking a `mailto:` (or app-scheme like `slack:` /
|
||
`vnc:`) link opens it in the Windows app, auto-harvested during discovery
|
||
(#421, #694). Security hardening: a discovered guest app can no longer
|
||
silently seize the host's default `http`/`https` handler (opt-in only), and
|
||
the session window-reaper no longer mis-kills a just-relaunched app nor
|
||
mass-kills sessions on a transient scan failure (#680 follow-up). Fixes:
|
||
kio-fuse detection on multiarch/KF6 layouts (#697), the reverse-open listener
|
||
autostarting with the tray (#691), the PrepareForSleep D-Bus subscription
|
||
(#690), and the install one-liner auto-installing `git` (#705). The optional
|
||
debloat pass opts out of more ads/telemetry (#669, #684). See CHANGELOG.md.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Sat, 11 Jul 2026 09:00:00 +0000
|
||
|
||
winpodx (0.8.0) unstable; urgency=medium
|
||
|
||
* Feature + bug-fix release: app discovery now defaults to Start-Menu-only
|
||
(only what the Windows Start Menu shows, grouped into nested folder
|
||
sub-groups) with a `desktop.full_app_scan` opt-in for the old scan-everything
|
||
behaviour (#581); the `[pod] keyboard` setting is passed to FreeRDP as the
|
||
session layout (#660); `--win-iso` is now staged before compose-up so dockur
|
||
installs from it instead of downloading (#647); the reverse-open listener
|
||
self-heals on app launch; bundled rdprrap 0.1.3 -> 0.3.0. Fixes the
|
||
"Refresh Apps" SIGSEGV, the off-thread display-scale SIGABRT, the Debloat
|
||
task dialog not auto-closing (#550), the layout-recursion SIGSEGV with long /
|
||
CJK app names (#553), and a hermetic-build test failure on NixOS (#659).
|
||
See CHANGELOG.md.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Tue, 30 Jun 2026 09:00:00 +0000
|
||
|
||
winpodx (0.7.4) unstable; urgency=medium
|
||
|
||
* Feature + bug-fix release: choose the VM storage location with
|
||
`install.sh --storage-dir` (#646) and install from a local Windows ISO
|
||
with `--win-iso` (#647), a 24 GB+ host now defaults the VM to 8 GB RAM
|
||
(#630); fixes opening a second document in an already-running app, "Open
|
||
with" on stripped-PATH desktops (Deepin), a clear error on a missing RDP
|
||
password + rejected `net user` rotation (#569), the `/kbd` extra flag, the
|
||
GUI Logs-tab buttons honouring the Docker backend, the `.deb` pulling in
|
||
`podman-compose` (#644), and the maintenance task dialog size (#550).
|
||
See CHANGELOG.md.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Tue, 23 Jun 2026 09:00:00 +0000
|
||
|
||
winpodx (0.7.3) unstable; urgency=medium
|
||
|
||
* Feature + bug-fix release: reverse-open now opens files on the Windows VM
|
||
itself via an SMB share + kio-fuse mount (#616), optional idle auto-stop to
|
||
free the VM's RAM (#622), +multitouch / stylus passthrough flag (#623),
|
||
discovery timeout unified + raised so `app refresh` doesn't time out (#619),
|
||
Dashboard RAM/Disk gauges no longer stick on "n/a" (#634), removed the USB
|
||
drive-letter auto-mapper that destabilized installs (#613, #638), more
|
||
debloat telemetry/ad surfaces (#590), per-distro usbredir hint (#593),
|
||
quoted urlacl SDDL (#614), guest agent token self-heal (#615), and an
|
||
install.sh `--ref` fix so a re-run installs the branch's latest commit.
|
||
See CHANGELOG.md.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Sat, 20 Jun 2026 09:00:00 +0000
|
||
|
||
winpodx (0.7.2) unstable; urgency=medium
|
||
|
||
* Bug-fix release: GUI Refresh crash (#567), tray submenus open on Plasma
|
||
(#573), CJK app names discovered (#553), pod stop keeps the container,
|
||
clear error on missing credentials (#569), FreeRDP-3 cache flags (#380),
|
||
-gfx workaround (#393), debloat dialog UX (#550). See CHANGELOG.md.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Mon, 15 Jun 2026 05:50:03 +0000
|
||
|
||
winpodx (0.7.1) unstable; urgency=medium
|
||
|
||
* Auto file associations for discovered apps ("Open with"); GUI app
|
||
reset/custom-icon/multi-select; quick app launcher; doctor warns on old
|
||
FreeRDP; install.sh honours --main on Atomic Fedora; gui detaches from the
|
||
terminal. See CHANGELOG.md for details.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Sat, 13 Jun 2026 14:24:21 +0000
|
||
|
||
winpodx (0.7.0) unstable; urgency=medium
|
||
|
||
* Bare-metal disguise (VM-detection avoidance): an opt-in hardened level
|
||
that makes the Windows guest read as a physical machine to VM-detection
|
||
software (Nvidia GPU-passthrough "code 43", launch-gate VM checks).
|
||
Plus the symlinked-$HOME file-open fix (#547), the dockur v5.16
|
||
USB-monitor fix (#286), the Devices-panel flicker fix, and the dockur
|
||
v5.16 image pin. See CHANGELOG.md for the full list (#246).
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Thu, 11 Jun 2026 12:00:00 +0000
|
||
|
||
winpodx (0.6.0) unstable; urgency=medium
|
||
|
||
* Consolidation + UX release. Host USB / PCI device passthrough (CLI +
|
||
GUI + tray), Start-menu GUI with a resource Dashboard, multi-monitor
|
||
RAIL (window keeps working on a second monitor), and a website at
|
||
winpodx.org. The libvirt backend was dropped (breaking) -- the dockur
|
||
QEMU/KVM-in-a-container backend now covers passthrough too. See the
|
||
CHANGELOG / GitHub release notes for the full list (#286, #300, #460+).
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Fri, 05 Jun 2026 12:00:00 +0000
|
||
|
||
winpodx (0.5.9) unstable; urgency=medium
|
||
|
||
* feat: selectable, fully translated UI in 7 languages
|
||
(en/ko/zh/ja/de/fr/it) -- `winpodx language` + GUI dropdown, system
|
||
locale by default (#335).
|
||
* feat: Windows disk auto-grow + manual `pod grow-disk` / `pod
|
||
disk-usage`, extending C: past dockur's WinRE recovery partition (#318).
|
||
* feat: guest sync -- push host updates (agent / fixes / binaries) into a
|
||
running guest without a reinstall (`pod sync-guest`, auto on pod start,
|
||
also via `winpodx migrate`).
|
||
* feat: opt-in pod auto-start on login (`winpodx autostart on|off|status`).
|
||
* fix: RemoteApp painting the logon/lock screen (#332); AppImage
|
||
`podman-compose ModuleNotFoundError` on atomic distros (#322); first-run
|
||
setup prompt firing on every invocation (#341); USB shortcut erroring /
|
||
a late-inserted USB now showing on refresh; guest version stamp over the
|
||
windowless agent channel; upgrade re-install hanging at wait-ready [4/4].
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Tue, 27 May 2026 12:00:00 +0000
|
||
|
||
winpodx (0.5.8) unstable; urgency=medium
|
||
|
||
* fix(oem): #269 agent 8765 HttpListener bind failed with "conflicts
|
||
with an existing registration" on the non-admin autologon User.
|
||
install.bat now reserves the urlacl via sddl=D:(A;;GX;;;WD) (World
|
||
SID, locale-proof) + deletes overlapping reservations first;
|
||
agent.ps1 retries the bind + dumps urlacl state on persistent
|
||
failure. OEM bundle 24 -> 25. Diagnosed with @ismikes.
|
||
* feat(packaging): #227 fat AppImage bundling FreeRDP + Podman +
|
||
podman-compose + a python3 -m launch shim, plus `winpodx
|
||
setup-host` pkexec wizard for kvm group / subuid. Tag pushes
|
||
auto-build + attach it to the release. Requested by @leandromqrs.
|
||
* fix(install): #288 require podman-compose proper instead of
|
||
trusting `podman compose` delegation (which routes through
|
||
docker-compose and breaks the keep-groups extension). Reported by
|
||
@magicdiablo.
|
||
* feat(pod): #287 `winpodx pod recover-oem` re-stages C:\OEM + runs
|
||
install.bat when dockur's first-boot OEM copy fails. Driver:
|
||
@ankranidiotis.
|
||
* feat(pod): #126 wait-ready deadline auto-extends from dockur's
|
||
wget ETA so slow ISO downloads don't trip the 60min timeout;
|
||
other fixed timeouts widened + compose-up made activity-based.
|
||
Reported by @xiyeming.
|
||
* feat(setup): #255 `winpodx setup --customize` wizard now walks
|
||
edition / language / region / keyboard / tuning; a standalone
|
||
`winpodx setup` runs the full provision flow (wait-ready +
|
||
discovery + reverse-open) like install.sh.
|
||
* feat(tuning): #245 extended profile (hv-* enlightenments,
|
||
virtio-rng, nested-virt autodetect) + `performance` profile.
|
||
Suggested by @ismikes.
|
||
* fix(rpm): #301 License tag widened to MIT AND Apache-2.0 for the
|
||
bundled rdpwrap (Apache-2.0) inside rdprrap.
|
||
* Plus #254 locale/timezone wiring, #247 debloat picker, #255
|
||
doctor / uninstall consolidation / first-run prompt, and the
|
||
QEMU 10 / dockur v5.15 compose fixes (-no-hpet drop, CPU_FLAGS
|
||
refactor).
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Sun, 24 May 2026 12:00:00 +0000
|
||
|
||
winpodx (0.5.7) unstable; urgency=medium
|
||
|
||
* feat(debloat): #247 four-phase rollout of the per-item debloat
|
||
picker. data/debloat/items.toml catalog (11 items, 4 presets),
|
||
per-item .ps1 scripts + undo siblings under
|
||
scripts/windows/debloat/, %ProgramData%\winpodx\debloat-applied.json
|
||
state tracking. CLI flags --list / --preset / --items / --undo /
|
||
--menu. Qt picker dialog at gui/debloat_picker.py with risk
|
||
badges + preset radios + Custom override. Text-mode picker via
|
||
--menu for headless / SSH installs.
|
||
* feat(locale): #254 three-phase wiring of cfg.pod.timezone +
|
||
Windows-guest TZ. Now redesigned (#267) around dockur's native
|
||
TZ env var so the OEM dir doesn't need per-config files. Host
|
||
detection via timedatectl / readlink /etc/localtime / /etc/timezone
|
||
fallback chain (utils/locale.py). GUI Settings -> Container/VM
|
||
gains Language / Region / Keyboard / Timezone dropdowns with
|
||
Auto-detect first option. CLI: winpodx config set pod.timezone
|
||
--auto, winpodx pod recreate [--wipe-storage].
|
||
* fix(compose): OEM cp Permission denied cascade on umask 077 hosts
|
||
(#267). #254 P1's always-copy OEM dir path re-introduced the
|
||
parent-dir traversal trap PR #95 originally dodged. Reverted to
|
||
bundle-direct fast path now that the TZ env var route eliminates
|
||
the need for always-copy.
|
||
* fix(config): Config.save() now persists pod.language / pod.region
|
||
/ pod.keyboard / pod.timezone / pod.tuning_profile. Pre-this
|
||
fix those five fields were loaded but never written back, so
|
||
'winpodx config set pod.<field> ...' silently dropped on next
|
||
save. Hand-edited values survived because nothing overwrote
|
||
them.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Thu, 21 May 2026 22:30:00 +0000
|
||
|
||
winpodx (0.5.6) unstable; urgency=medium
|
||
|
||
* fix(rdp): drop podman unshare --rootless-netns wrap so FreeRDP
|
||
runs on the host loopback where the rootless publish is actually
|
||
reachable (#214, reported by @ismikes on Kubuntu 26.04 + Plasma 6
|
||
+ FreeRDP 3.24, diagnosed by @smoore100). The wrap put xfreerdp3
|
||
inside the container's network namespace where the host-side
|
||
publish was invisible, so app launches printed "Launching..."
|
||
but no RDP window ever appeared. Side benefit: FreeRDP launch
|
||
path no longer needs the podman binary on PATH (flatpak-only
|
||
FreeRDP setups now work).
|
||
* fix(info): VNC reachability probe switched from check_rdp_port
|
||
(X.224 handshake) to check_tcp_port (plain TCP accept). VNC
|
||
speaks RFB, not RDP, so the handshake probe always returned
|
||
False and "winpodx info" printed "VNC unreachable" even while
|
||
NoVNC was serving. Reported via #214.
|
||
* fix(uninstall): final tray/GUI sweep right before the summary,
|
||
so processes that came up *during* the uninstall window (other-
|
||
terminal GUI launches, XDG-autostart races, dbus activation)
|
||
still get killed. WINPODX_NO_TRAY_SPAWN + section-0a pkill cover
|
||
the case where uninstall.sh is the only thing touching the tray
|
||
but miss races against the uninstall window itself.
|
||
* internal: packaging/obs/obs-publish.yml anchors the download
|
||
grep to the current tag version so stale older RPMs left in the
|
||
OBS publish index by rolling-release repos (Tumbleweed / Slow-
|
||
roll lazy GC) don't get re-uploaded as release assets. v0.5.5
|
||
surfaced this with two stale 0.5.4 RPMs that had to be deleted
|
||
by hand from the Release page.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Thu, 21 May 2026 06:00:00 +0000
|
||
|
||
winpodx (0.5.5) unstable; urgency=medium
|
||
|
||
* winpodx setup rerun no longer silently overwrites the Windows
|
||
password and locks users out of the guest account (#216,
|
||
reported by @tolistim). Re-running setup on an existing install
|
||
used to reprompt for the Windows password and write whatever was
|
||
entered into winpodx.toml; because dockur honors USERNAME /
|
||
PASSWORD env vars only on first boot, the host config silently
|
||
desynced from the actual Windows guest account and the next RDP
|
||
launch failed with LOGON_FAILED_BAD_PASSWORD. The interactive
|
||
prompt now detects an existing config with populated
|
||
cfg.rdp.user / cfg.rdp.password, preserves them, and directs the
|
||
user to `winpodx rotate-password`.
|
||
* Host-adaptive Windows-on-KVM tuning profile (#215, suggested by
|
||
@ismikes). New `cfg.pod.tuning_profile` knob with values auto |
|
||
safe | off | manual. Default `auto` probes /proc/cpuinfo,
|
||
/proc/meminfo, os.uname, os.getloadavg at compose time and turns
|
||
on `+invtsc` on x86_64 hosts that expose invariant TSC.
|
||
`winpodx info` and `winpodx setup` print a [Tuning] block
|
||
showing detected capability and resolved profile. Items that
|
||
require host-side setup (hugepages, CPU pinning, VFIO) stay
|
||
documented operator tasks rather than wired into winpodx
|
||
automatically.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Wed, 20 May 2026 14:00:00 +0000
|
||
|
||
winpodx (0.5.4) unstable; urgency=medium
|
||
|
||
* Same-day hotfix for v0.5.3 Debian/Ubuntu package build failure.
|
||
Older `hatchling` (Ubuntu 24.04 ships 1.18.0) maintains its own
|
||
Trove classifier whitelist and rejects
|
||
`Programming Language :: Python :: 3.14` with
|
||
`ValueError: Unknown classifier`. The classifier line is dropped
|
||
from pyproject.toml; CI matrix still runs the Python 3.14 leg, so
|
||
functional 3.14 coverage is unchanged. RPM / OBS / AUR / GitHub
|
||
Release in v0.5.3 were unaffected.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Tue, 19 May 2026 15:00:00 +0000
|
||
|
||
winpodx (0.5.3) unstable; urgency=medium
|
||
|
||
* Compose up/down timeout is now pull-friendly (#212, reported by
|
||
@jimed-rand). Default `podman-compose up -d` / `down` timeout
|
||
bumped 120s → 1800s; honors `WINPODX_COMPOSE_TIMEOUT_SECS` env
|
||
var (`0` = no cap). First-time Windows image pulls on slow links
|
||
no longer trip the 120s wall.
|
||
* Launch surfaces FreeRDP stderr on quick-exit (#213 reported by
|
||
@mozjacksson, #214 reported by @ismikes). `launch_app` polls the
|
||
process 500 ms after spawn and raises `FreeRDP exited
|
||
immediately with rc=...` with the stderr log path; eliminates
|
||
the silent "launched but no window" failure mode on Plasma 6 /
|
||
Wayland and Python 3.14 hosts.
|
||
* Ubuntu 26.04 packaging + Python 3.14 in the CI matrix (#206).
|
||
Closes the untested-platform gap that surfaced #213 / #214.
|
||
* Windows language / region / keyboard configuration (by @juampe,
|
||
#201). New `[pod] language / region / keyboard` keys in
|
||
`winpodx.toml`; defaults stay `English` / `en-001` / `en-US`.
|
||
All three fields run through the same YAML-injection sanitiser
|
||
as `user` / `password` / `home`.
|
||
* LICENSE / README ship to `/usr/share/winpodx/` in the `.deb`
|
||
(by @juampe, #201). GUI License tab no longer hits
|
||
`FileNotFoundError` on Debian/Ubuntu installs.
|
||
* Dynamic desktop resolution: desktop sessions resize to the
|
||
FreeRDP client window size by default (by @Zeik0s, #197).
|
||
* Qt stylesheet parser warnings at GUI startup silenced
|
||
(by @juampe, #203).
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Tue, 19 May 2026 14:00:00 +0000
|
||
|
||
winpodx (0.5.2) unstable; urgency=medium
|
||
|
||
* install.sh: pick freerdp3-x11 over freerdp2-x11 when available
|
||
(reported by @basti189, #198). Fixes the hard install failure on
|
||
Debian 13 (Trixie) and recent Ubuntu (24.10 / 25.04 / 25.10)
|
||
where the stock apt repos no longer ship freerdp2-x11; pkg_name()
|
||
now probes apt-cache show and prefers freerdp3-x11, falling back
|
||
to freerdp2-x11 only on Debian <=12 / Ubuntu 22.04 stock.
|
||
* install.sh: Atomic Fedora install path (by @Zeik0s, #163).
|
||
Silverblue / Kinoite / Sericea / Bluefin / Bazzite installs now
|
||
autodetect rpm-ostree and layer winpodx via OBS in one
|
||
transaction (rpm-ostree install --apply-live --idempotent), no
|
||
per-package reboot loop. Falls back to staged install + reboot
|
||
prompt if the booted deployment rejects live apply.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Wed, 14 May 2026 13:00:00 +0000
|
||
|
||
winpodx (0.5.1) unstable; urgency=medium
|
||
|
||
* Win10+ Windows edition picker (#178). LTSC IoT, Win11 LTSC,
|
||
Tiny10/11, Server 2016-2025 selectable from GUI Settings,
|
||
`winpodx setup --win-version`, or `install.sh --win-version`.
|
||
Pre-Win10 editions excluded (out of Microsoft security support;
|
||
don't match rdprrap / agent.ps1 assumptions) but pass through to
|
||
dockur with a warning if explicitly requested. Custom Windows
|
||
ISOs documented as a manual workaround under "Advanced: Custom
|
||
Windows ISO" in docs/ARCHITECTURE.md — set
|
||
win_version = "custom" + edit compose.yaml to mount the .iso.
|
||
* FreeRDP 2/3 RemoteApp compatibility fix (#158, reported by
|
||
@poetman). `winpodx app run <app>` no longer falls back to
|
||
Microsoft Store on Ubuntu 22.04 LTS (FreeRDP 2.11.x). Win32
|
||
RemoteApp launches now use FreeRDP's separate /app: + /app-name:
|
||
+ /app-cmd: flags instead of FreeRDP 3-only combined
|
||
/app:program:X,name:Y,cmd:Z syntax that FreeRDP 2 mis-parses.
|
||
* Discovery no longer re-imports Linux reverse-open shims as
|
||
Windows apps (#182). Existing polluted entries are auto-purged
|
||
on the next `winpodx app refresh`.
|
||
* Weekly Docker Hub digest watcher (#180) — catches silent dockur
|
||
rebuilds (security patches without a tag bump) that the
|
||
release-tag watcher alone misses.
|
||
* Internal refactor: WinpodxWindow Qt class split from 2745 lines
|
||
into a 148-line orchestrator + 10 single-responsibility mixins
|
||
(#181). No user-visible change.
|
||
* Docs: contributor attribution convention documented in
|
||
CONTRIBUTING (#187). Korean CHANGELOG / INSTALL / ARCHITECTURE /
|
||
USAGE mirrors updated to match.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Thu, 14 May 2026 12:00:00 +0000
|
||
|
||
winpodx (0.5.0) unstable; urgency=medium
|
||
|
||
* Reverse-open feature (#48) ships end-to-end as the headline of
|
||
this release. Linux apps now appear in the Windows guest's
|
||
right-click "Open with..." menu by default — no opt-in flag, no
|
||
Settings toggle required — with correct per-app icons in both
|
||
the short menu and the long "Choose another app" dialog. Phase 2
|
||
series complete (a discovery + ICO + CLI, b listener daemon +
|
||
lifecycle, c guest handlers + sync transport + default-on, d Qt
|
||
Settings card), plus the full fix-forward stack.
|
||
* Chooser entry icons render correctly via embedded EXE icon
|
||
resource. Each per-slug `winpodx-<slug>.exe` is an independent
|
||
copy of the Rust shim whose PE resource section carries the
|
||
matching `<slug>.ico`, patched via vendored rcedit
|
||
(electron/rcedit v2.0.0, MIT). The Win10/Win11 Open With chooser
|
||
ignores `Applications\<exe>\DefaultIcon` and per-ProgID
|
||
`DefaultIcon`; the embedded EXE icon is the only surface that
|
||
works. PR #165's hard-link inode-sharing optimisation is dropped
|
||
(~500 KB × N apps on disk) since there's no chooser-icon path
|
||
that also preserves shared inodes on stock Windows.
|
||
* Per-app `.cmd` wrappers, Rust `.exe` shim, short-menu visibility,
|
||
Firefox handoff, multi-resolution ICOs, Desktop folder shortcut
|
||
+ Quick Access pin, and `--purge` skip-guest-scrub all land in
|
||
the fix-forward stack (PRs #164 → #171).
|
||
* `winpodx pod start` auto-spawns the host-side reverse-open
|
||
listener daemon; `winpodx pod stop` tears it down before stopping
|
||
the pod itself.
|
||
* `winpodx host-open refresh` scans `$XDG_DATA_HOME/applications`
|
||
+ `$XDG_DATA_DIRS`, applies allow / denylist, rasterises icons to
|
||
multi-resolution ICO, stages a manifest under
|
||
`~/.local/share/winpodx/reverse-open/`, and pushes everything to
|
||
the guest via the bearer-authed `/exec` endpoint when the agent
|
||
is reachable.
|
||
* On the guest, per-app `HKCU\\Software\\Classes\\winpodx-<slug>`
|
||
ProgIDs are attached to each applicable extension's
|
||
`OpenWithProgids` subkey; clicking a Linux app from "Open
|
||
with..." invokes the Rust shim which atomically writes a
|
||
request JSON into the host listener's incoming dir.
|
||
* Self-contained sync — all three guest scripts
|
||
(`register-apps.ps1`, `unregister-apps.ps1`, the shim) plus the
|
||
vendored `rcedit.exe` are base64-embedded into the sync payload,
|
||
so existing pods get the feature on first sync without depending
|
||
on dockur having staged the OEM bundle.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Wed, 13 May 2026 00:00:00 +0000
|
||
|
||
winpodx (0.4.4) unstable; urgency=medium
|
||
|
||
* Patch release. Restores real-time `pod wait-ready --logs` output that
|
||
was inadvertently buffered in v0.4.3 (the `tee` pipe added for
|
||
half-uninstalled-state diagnostics flipped Python's stdout to
|
||
4 KB-block-buffered; install.sh now prepends `PYTHONUNBUFFERED=1` to
|
||
the wait-ready invocation to force line-buffered output).
|
||
* Carry-over from the v0.4.3 dev cycle: half-uninstalled-state
|
||
self-heal in `winpodx setup --non-interactive`; cachyos rotate-
|
||
password / sync-password agent-first preference; codec-flag
|
||
allowlist correction (drop OPTIONAL-typed `+/-gfx-h264` etc. that
|
||
FreeRDP rejects); `winpodx app run --extra-args` per-launch escape
|
||
hatch; btrfs warning suppression in `wait-ready --logs`; dormant
|
||
Phase 1 foundations for the agent-first install + reverse-open
|
||
initiatives.
|
||
* Smoke-tested end-to-end on openSUSE Tumbleweed (2026-05-10):
|
||
Password sync OK via agent transport, apply chain via agent
|
||
transport, discovery 1-retry-deferred (normal), 56 apps in menu;
|
||
multi-session verified (qwinsta showed two active User sessions:
|
||
console + rdp-tcp#0).
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Sun, 10 May 2026 13:30:00 +0000
|
||
|
||
winpodx (0.4.3) unstable; urgency=medium
|
||
|
||
* The btrfs Copy-on-Write fragmentation fix. Per-user storage bind mount
|
||
with automatic NoCoW (chattr +C) so Windows VM disk image writes stop
|
||
forking new btrfs extents on every overwrite. On btrfs hosts pod
|
||
recreates that previously took many minutes (and frequently timed out
|
||
on the 300 s budget) finish in 30 s like they always did on ext4.
|
||
Reported by @xiyeming in #121, #122; cachyos failure cascade in #126
|
||
has the same root cause (install.bat dies mid-stage during btrfs CoW
|
||
file-op stalls; without rdprrap the host's FreeRDP fallback hits
|
||
multi-session reset).
|
||
* Five PRs landing the fix end-to-end: PR #125 (bind mount + chattr +C
|
||
+ named-volume migration), PR #127 (compose-prefixed volume name
|
||
resolution: `winpodx_winpodx-data`), PR #128 (chattr +C result inline
|
||
surfacing + post-rsync NoCoW verification), PR #129 (refuse to
|
||
re-migrate when bind-mount target is already populated), PR #130
|
||
(`detect_path_fs` walks up to existing ancestor before findmnt — the
|
||
actual root cause for chattr +C silently never applying on fresh
|
||
installs).
|
||
* Smoke-tested end-to-end on openSUSE Tumbleweed btrfs: clean wipe →
|
||
v0.4.2 fresh install → upgrade to main; install.sh prints
|
||
`chattr +C applied to /home/.../winpodx/storage` between
|
||
`Migrating storage...` and `OK: migrated 71 GiB`; afterwards
|
||
`lsattr -d` and `lsattr data.img` both show the C flag, dockur's
|
||
`Warning: COW (copy on write) is not disabled` no longer appears.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Wed, 06 May 2026 14:30:00 +0000
|
||
|
||
winpodx (0.4.2) unstable; urgency=medium
|
||
|
||
* Patch release. Two small fixes on top of 0.4.1:
|
||
- wait-ready --logs now rewrites dockur's container-internal VNC URL
|
||
(http://127.0.0.1:8006/) to the host's actual mapped port so the
|
||
printed URL matches what the user can open in a browser. Closes #118.
|
||
- Packaging workflows (debs/rhel) tolerate the create-release race that
|
||
produced duplicate v0.4.1 release entries on tag push; create is now
|
||
idempotent.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Tue, 05 May 2026 12:00:00 +0000
|
||
|
||
winpodx (0.4.1) unstable; urgency=high
|
||
|
||
* 0.4.x line's first stable release. Closes the 'agent never installs'
|
||
fresh-install regression observed on openSUSE Tumbleweed: install.bat's
|
||
PS Expand-Archive deadlock against Windows Defender real-time scan,
|
||
host-side FreeRDP fallback kicking the autologon session via Windows
|
||
session-takeover, and the agent-respawn race after migrate's apply
|
||
chain are all addressed with layered defences (Defender exclusions
|
||
early in install.bat, tar -xf instead of PS Expand-Archive, agent /
|
||
health gates on every host -> guest path, retry-with-delay around the
|
||
apply-chain respawn window). install.sh smoke-tested end-to-end on
|
||
openSUSE Tumbleweed; menu populates inline before install.sh exits.
|
||
* Release trigger now keys on a separate REL- marker tag (REL-v0.4.1)
|
||
so the version scheme stays clean PEP 440. See CHANGELOG.md for full
|
||
details.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Tue, 05 May 2026 00:00:00 +0000
|
||
|
||
winpodx (0.4.0~rc1) unstable; urgency=high
|
||
|
||
* Release candidate: Defender exclusions, tar-based rdprrap extraction,
|
||
and install-time agent-only post-install gates.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Mon, 04 May 2026 00:00:00 +0000
|
||
|
||
winpodx (0.3.0) unstable; urgency=medium
|
||
|
||
* Added: HTTP guest agent (agent.ps1, rev4) on 127.0.0.1:8765.
|
||
Bearer-authed /exec endpoint replaces FreeRDP RemoteApp as the
|
||
default host->guest command channel. /health stays unauthenticated
|
||
for the readiness probe; /exec spawns child PowerShell via
|
||
[Diagnostics.Process] + CreateNoWindow so no PS-window flashes.
|
||
Token delivered via OEM bind mount (mode 0600 on host, gitignored).
|
||
* Added: Transport ABC v1 (core/transport/{base,agent,freerdp,
|
||
dispatch}). dispatch() prefers the agent and falls back to FreeRDP
|
||
when /health doesn't answer. Password rotation is documented as
|
||
NEVER routing through Transport (rule #6 in TRANSPORT_ABC.md) -
|
||
the rotation flow owns its own credentials and calls
|
||
run_in_windows directly to avoid the bootstrap loop.
|
||
* Added: `winpodx check` CLI + matching GUI Health card running
|
||
nine probes (pod, RDP, agent /health, /exec round-trip, in-guest
|
||
summary, OEM bundle, password age, app count, host disk free).
|
||
--json for scripting; exit 1 only on FAIL. The GUI Health card
|
||
auto-refreshes every 30s while visible.
|
||
* Added: Sidebar transport indicators - small `A` (agent) and `R`
|
||
(RDP) dots beside the pod chip turn green/red live so the user
|
||
sees at a glance which channel the next launch will use.
|
||
* Added: Modular core split. provisioner.py was 700+ lines doing
|
||
pod lifecycle, password rotation, discovery auto-fire, self-heal
|
||
applies, and host->guest RPC; now broken into core/pod/,
|
||
core/rotation/, core/discovery/, and core/transport/ with the
|
||
self-heal apply (the source of the previous PS-window storm)
|
||
deleted entirely.
|
||
* Fixed: install.bat (rev12) pre-registers URL ACL for +:8765 so
|
||
the non-admin User can bind, opens Windows Firewall for tcp/8765,
|
||
and registers WinpodxAgent under HKCU\Run with -WindowStyle
|
||
Hidden. Compose mapping 127.0.0.1:8765:8765 + USER_PORTS=8765
|
||
for QEMU hostfwd was missing on 0.2.x and is now present.
|
||
* Fixed: agent /exec returned rc:null after clean child exit.
|
||
PowerShell's Start-Process -PassThru + WaitForExit can leave
|
||
$proc.ExitCode null. agent.ps1 coerces to 0; AgentClient also
|
||
tolerates null as 0 so older agents keep working.
|
||
* Fixed: Discovery script path. _ps_script_path walked four
|
||
.parent's instead of five and resolved to <root>/src/scripts/...
|
||
which never exists; GUI Refresh stopped showing "Pod Not Running"
|
||
on healthy pods.
|
||
* Fixed: GUI misclassified script_missing as pod_not_running -
|
||
_looks_like_pod_down was substring-matching "pod" inside install
|
||
paths like winpodx-app/. RefreshWorker now reads
|
||
DiscoveryError.kind first.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Thu, 30 Apr 2026 17:00:00 +0900
|
||
|
||
winpodx (0.2.1) unstable; urgency=medium
|
||
|
||
* Added: utils.pending resume system. New
|
||
~/.config/winpodx/.pending_setup marker tracks install.sh steps
|
||
that couldn't complete (wait_ready / migrate / discovery). Next
|
||
CLI invocation and every GUI startup picks up the marker and
|
||
runs the missing steps in canonical order. Each step removes
|
||
itself on success; file deleted once empty. 10 unit tests.
|
||
* Added: GUI Quick Start dialog on first launch. Shows backend /
|
||
FreeRDP / pod / RDP listener / app count snapshot. Dismiss
|
||
writes .welcomed marker.
|
||
* Added: GUI Logs page auto-tails winpodx app log on navigate.
|
||
`tail -F ~/.config/winpodx/winpodx.log` streams internal logs
|
||
alongside the existing container-log buttons; auto-stop on
|
||
leaving the page.
|
||
* Changed: install.sh wait-ready timeout 1800s -> 3600s (1 hour).
|
||
Slow first installs can complete in-line instead of bailing
|
||
out; anything past the hour is picked up by the resume hook.
|
||
* Changed: pod.max_sessions default 10 -> 25, pod.ram_gb default
|
||
4 -> 6 GB. 10 was tight for real-world simultaneous app use.
|
||
Setup wizard tier auto-detect tunes both per machine.
|
||
* Added: utils.specs auto-tier detector. Host CPU + RAM determine
|
||
one of three presets (low/mid/high) for VM cpu_cores + ram_gb.
|
||
Interactive setup pre-fills the recommendation.
|
||
* Fixed: zombie disconnected sessions caused "Select a session to
|
||
reconnect to" dialog every launch. MaxDisconnectionTime was 0
|
||
(no timeout = sessions never logoff). v0.2.1 sets it to 30000
|
||
(30 sec) in both install.bat and _apply_rdp_timeouts so closed
|
||
sessions auto-clean.
|
||
* Fixed: _apply_max_sessions wrote to the wrong registry key
|
||
(Terminal Server\MaxInstanceCount, no \WinStations\RDP-Tcp).
|
||
Windows reads the WinStations subkey, so cfg changes since
|
||
session-cap shipping silently no-op'd. Now writes the correct
|
||
key and bumps install.bat OEM-time ceiling 10 -> 50 to match.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Tue, 28 Apr 2026 09:30:00 +0900
|
||
|
||
winpodx (0.2.0.11) unstable; urgency=high
|
||
|
||
* Fixed: second SEGV path on GUI Refresh. v0.2.0.10 fixed the
|
||
QImage-on-worker-thread race, but the success/failure slots
|
||
immediately nulled out self._refresh_worker. Python's ref drop
|
||
raced Qt's queued worker.deleteLater event -> ~QObject() on a
|
||
half-freed pointer -> Signal 11. Now Python refs are dropped
|
||
only via thread.finished after both Qt objects have been torn
|
||
down properly.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Tue, 28 Apr 2026 08:00:00 +0900
|
||
|
||
winpodx (0.2.0.10) unstable; urgency=high
|
||
|
||
* Fixed: GUI Refresh button SEGV. _DiscoveryWorker.run() called
|
||
persist_discovered -> _validate_png_bytes which used QImage on a
|
||
Qt worker thread; Mesa/libgallium state owned by the main GUI
|
||
thread raced and dropped a Signal 11 core. _validate_png_bytes
|
||
now short-circuits to the stdlib chunk walker when off the main
|
||
thread.
|
||
* Fixed: install.sh wait-ready timeout 600s -> 1800s. A fresh
|
||
install downloads the ~7.5GB Windows ISO + Sysprep + OEM apply,
|
||
which takes 15-30 minutes on first run. The previous 600s timeout
|
||
fired before the Windows VM had even booted.
|
||
* Added: GUI Refresh now installs .desktop entries (parity with
|
||
CLI). Bidirectional sync via worker-thread-safe
|
||
_sync_desktop_entries.
|
||
* Added: GUI auto-fires discovery when the pod transitions to
|
||
running and the app list is empty (covers the case where install
|
||
timeout hit before Sysprep finished).
|
||
* Added: GUI live log streaming. New buttons on Tools/Terminal:
|
||
`Live (pod)`, `Live (app)`, `App log`, `Stop tail` — tail -F the
|
||
container or ~/.config/winpodx/winpodx.log into the panel.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Mon, 27 Apr 2026 18:00:00 +0900
|
||
|
||
winpodx (0.2.0.9) unstable; urgency=medium
|
||
|
||
* Fixed: 2nd app launch triggered Windows "Select a session to
|
||
reconnect to" dialog. Default Windows refuses concurrent
|
||
RemoteApp sessions per user. Self-heal apply now also runs
|
||
rdprrap-conf --enable so each launch gets its own session.
|
||
Idempotent; tolerates missing rdprrap-conf as best-effort skip.
|
||
* Fixed: stale .desktop entries lingered after apps removed from
|
||
the Windows guest. Refresh now bidirectionally syncs — any
|
||
winpodx-*.desktop not corresponding to an entry in
|
||
list_available_apps() is removed (along with its icons).
|
||
User-authored entries are preserved.
|
||
* Changed: README more informative — prominent Beta + Latest
|
||
release badges at top, plus social/activity shields rows.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Mon, 27 Apr 2026 17:00:00 +0900
|
||
|
||
winpodx (0.2.0.8) unstable; urgency=medium
|
||
|
||
* Fixed: `winpodx app refresh` discovered apps but never registered
|
||
them in the desktop menu. Refresh now auto-installs .desktop
|
||
entries for discovered apps (best-effort) + refreshes the icon
|
||
cache.
|
||
* Fixed: PowerShell window flashed on every app launch because
|
||
ensure_ready's self-heal apply re-fired three FreeRDP RemoteApp
|
||
PowerShell payloads on every click. Self-heal now stamps
|
||
.applies_stamp with <winpodx_version>:<container_StartedAt>
|
||
and short-circuits on subsequent launches until pod restart or
|
||
winpodx upgrade.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Mon, 27 Apr 2026 16:00:00 +0900
|
||
|
||
winpodx (0.2.0.7) unstable; urgency=medium
|
||
|
||
* Fixed: pod wait-ready --logs showed no [container] lines.
|
||
The tail was started with --tail 0 (only logs from "now" onward,
|
||
so Windows ISO download + boot stage messages already printed
|
||
before wait-ready ran were invisible) AND only stdout was drained
|
||
while dockur splits progress between stdout and stderr.
|
||
v0.2.0.7 uses --tail 100 + drains both streams in parallel
|
||
threads, so the user actually sees what Windows is doing.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Mon, 27 Apr 2026 15:00:00 +0900
|
||
|
||
winpodx (0.2.0.6) unstable; urgency=high
|
||
|
||
* Fixed: wait_for_windows_responsive collapsed in <1s on a still-
|
||
booting guest. The helper fired exactly ONE FreeRDP RemoteApp
|
||
probe after the RDP port opened — a single failure (which is what
|
||
every still-booting guest produces, rc=147 connection-reset)
|
||
returned False immediately and the caller's 600s timeout was
|
||
effectively ignored. v0.2.0.6 turns the probe into a retry loop
|
||
that fires repeated 5-20s probes until one succeeds or the
|
||
overall timeout expires (3s pacing between attempts). pod
|
||
wait-ready --timeout 600 now actually waits up to 10 minutes
|
||
instead of bailing in the first second.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Mon, 27 Apr 2026 14:00:00 +0900
|
||
|
||
winpodx (0.2.0.5) unstable; urgency=medium
|
||
|
||
* Added: `winpodx pod wait-ready [--timeout SEC] [--logs]` —
|
||
multi-phase wait gate for Windows VM first-boot. Three checkpoints
|
||
with elapsed-time stamps: container running, RDP port open,
|
||
Windows ready (RemoteApp probes OK). With --logs, container
|
||
stdout is tailed in a background thread so the user sees Windows
|
||
Sysprep / OEM apply progress instead of a silent multi-minute
|
||
hang.
|
||
* Changed: install.sh is now single-shot. Flow: setup -> pod
|
||
wait-ready --logs -> migrate -> app refresh. install.sh exits
|
||
when the install is actually finished, not when the container
|
||
started. WINPODX_NO_WAIT=1 / WINPODX_NO_DISCOVERY=1 skip the
|
||
waits in CI / non-interactive setups.
|
||
* Removed redundant `winpodx pod apply-fixes` call from install.sh
|
||
(migrate's always-apply path already runs the apply).
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Mon, 27 Apr 2026 13:00:00 +0900
|
||
|
||
winpodx (0.2.0.4) unstable; urgency=high
|
||
|
||
* Fixed: bogus "cfg.password does not match Windows" warning on
|
||
every fresh --purge install. _probe_password_sync's error
|
||
classifier matched on "no result file" OR "auth" — but on a
|
||
still-booting guest FreeRDP returns rc=147 connection-reset
|
||
wrapped in the host's "No result file written" envelope, which
|
||
matched the first pattern and surfaced as a phantom drift
|
||
warning. v0.2.0.4 gates the probe on wait_for_windows_responsive
|
||
(skip if guest isn't ready) AND tightens the classifier to
|
||
distinguish transport-level failures (rc=131, rc=147,
|
||
transport_failed, connection reset) from genuine auth failures
|
||
(logon_failure, STATUS_LOGON_FAILURE).
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Mon, 27 Apr 2026 11:00:00 +0900
|
||
|
||
winpodx (0.2.0.3) unstable; urgency=high
|
||
|
||
* Fixed: discovery hit the same boot race the apply path used to.
|
||
v0.2.0.1 gated _apply_* and pod apply-fixes on
|
||
wait_for_windows_responsive, but migrate's "Run app discovery now?"
|
||
prompt and provisioner._auto_discover_if_empty still launched the
|
||
FreeRDP RemoteApp channel without a probe. On fresh --purge
|
||
reinstalls the scan collapsed with rc=147 connection reset.
|
||
v0.2.0.3 wires the same probe into both discovery call sites.
|
||
* Bumped first-boot timeout 90s -> 180s on all three apply /
|
||
discovery probes so slower hardware completes the install on
|
||
the first try.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Mon, 27 Apr 2026 10:00:00 +0900
|
||
|
||
winpodx (0.2.0.2) unstable; urgency=medium
|
||
|
||
* Fixed: fresh --purge reinstall reported a bogus "0.1.7 -> X
|
||
detected" upgrade. winpodx setup saved winpodx.toml but never
|
||
stamped installed_version.txt, so the follow-up `winpodx migrate`
|
||
chained by install.sh saw the config + missing marker and fell
|
||
through to the pre-tracker fallback that assumes baseline 0.1.7.
|
||
Setup now writes the current version to installed_version.txt
|
||
when absent, so a fresh install reports as the current version
|
||
(no migration steps fire) while real upgrades still work.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Sun, 26 Apr 2026 23:00:00 +0900
|
||
|
||
winpodx (0.2.0.1) unstable; urgency=high
|
||
|
||
* Fixed: apply cascade collapsed on cold container. v0.2.0 fired the
|
||
three runtime applies (max_sessions, rdp_timeouts, oem_runtime_fixes)
|
||
the moment the container reached RUNNING, but the Windows VM inside
|
||
QEMU needed another 30-90s before its RDP listener could accept
|
||
FreeRDP RemoteApp activation. Within that window every apply
|
||
collapsed: ERRCONNECT_CONNECT_TRANSPORT_FAILED (rc=147) on fresh
|
||
install, or ERRCONNECT_ACTIVATION_TIMEOUT (rc=131) on pod restart.
|
||
3min cascade surfaced as a Launch Error dialog or "3 of 3 applies
|
||
failed" panic during setup -> migrate.
|
||
* Added: wait_for_windows_responsive() helper polls check_rdp_port,
|
||
then fires a 20s no-op probe to confirm FreeRDP RemoteApp is live.
|
||
Used by ensure_ready warm path, winpodx pod apply-fixes, and
|
||
winpodx migrate apply step.
|
||
* Added: _self_heal_apply() wraps warm-pod ensure_ready applies in
|
||
WindowsExecError swallow so transient channel failures log a
|
||
warning and abort further attempts in the same call.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Sun, 26 Apr 2026 22:30:00 +0900
|
||
|
||
winpodx (0.2.0) unstable; urgency=medium
|
||
|
||
* Fixed: oem_runtime_fixes failed on first apply with
|
||
AllowComputerToTurnOffDevice parameter error. v0.1.9.5 still passed
|
||
`$false` instead of the enum string 'Disabled', and virtual NICs
|
||
inside QEMU often don't expose the parameter at all. v0.2.0 wraps
|
||
the call in try/catch and uses the enum form so the apply succeeds
|
||
regardless of NIC topology.
|
||
* Fixed: migrate password-drift probe timed out at 20s. FreeRDP's
|
||
first-contact handshake on a cold pod regularly exceeds 20s; bumped
|
||
probe budget to 60s so genuine drift detection isn't masked by
|
||
cold-start latency.
|
||
* Added: streaming refresh progress. `winpodx app refresh` now emits
|
||
one stderr line per source ("Scanning Registry App Paths…",
|
||
"Scanning UWP / MSIX packages…", etc) instead of hanging silently
|
||
for 30–90s. JSON output stays clean.
|
||
* Added: `winpodx pod multi-session {on|off|status}` — runtime
|
||
toggle for the bundled rdprrap multi-session RDP patch via FreeRDP
|
||
RemoteApp. No container recreate needed.
|
||
* Added: discovery junk filter. Drops uninstallers, redistributables,
|
||
helpers, inbox accessibility tools, system plumbing, and unresolved
|
||
UWP entries (Microsoft.*.BrokerPlugin) from refresh output. Bypass
|
||
with WINPODX_DISCOVERY_INCLUDE_ALL=1 for debugging.
|
||
* Added: GUI app icons. Discovered apps now render their actual
|
||
Windows icon in launcher grid cards and list tiles instead of the
|
||
color+letter avatar. Letter avatar remains as fallback.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Sun, 26 Apr 2026 22:00:00 +0900
|
||
|
||
winpodx (0.1.9.5) unstable; urgency=high
|
||
|
||
* Fixed: BOM in result file caused fake "fail" reports. v0.1.9.4
|
||
PowerShell wrapper used Out-File -Encoding utf8 which writes a BOM;
|
||
host then json.loads with utf-8 codec rejected it. The actual
|
||
registry changes had landed; only the parse failed. Now read with
|
||
utf-8-sig.
|
||
* Fixed: _apply_max_sessions killed its own RDP session by calling
|
||
Restart-Service TermService — the very service hosting the
|
||
FreeRDP RemoteApp running the script. Removed the in-script
|
||
restart; registry write alone is enough, change picks up on next
|
||
natural service cycle.
|
||
* Migrated every remaining host-to-Windows command path off the
|
||
broken podman exec channel: _change_windows_password (password
|
||
rotation), recover_rdp_if_needed (now does container restart),
|
||
sync_windows_time, Windows Update toggle, debloat (CLI + GUI),
|
||
and discover_apps. All six were silent no-ops in releases 0.1.0
|
||
through 0.1.9.4.
|
||
* Added: `winpodx pod sync-password` CLI to recover from password
|
||
drift accumulated under the broken rotation path. Prompts for the
|
||
last-known-working password and resets Windows to match cfg.
|
||
* Added: migrate auto-detects password drift before attempting
|
||
apply, points users at sync-password instead of letting them
|
||
watch all three applies fail confusingly.
|
||
* Added: lint test that fails CI if any future code reintroduces
|
||
the podman-exec-to-powershell pattern outside windows_exec.py.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Sun, 26 Apr 2026 16:00:00 +0900
|
||
|
||
winpodx (0.1.9.4) unstable; urgency=high
|
||
|
||
* Fixed: runtime applies were silent no-ops in v0.1.9.1, v0.1.9.2, and
|
||
v0.1.9.3. `podman exec winpodx-windows ...\powershell.exe` returns
|
||
rc=127 because podman exec runs in the Linux container that hosts
|
||
QEMU, not the Windows VM inside. The helpers logged warnings and
|
||
returned, while `apply_windows_runtime_fixes` reported "ok" because
|
||
the helpers didn't raise. Three previous releases shipped fake
|
||
success.
|
||
- New `core/windows_exec.py`: `run_in_windows(cfg, ps_payload)`
|
||
launches PowerShell as a FreeRDP RemoteApp and pipes the script
|
||
through the `\\tsclient\home` redirection. Wrapper writes
|
||
{rc,stdout,stderr} JSON back via the same share. Channel
|
||
failures (FreeRDP missing, auth fail, timeout, no result file)
|
||
raise WindowsExecError; non-zero script rc surfaces via
|
||
WindowsExecResult.rc.
|
||
- `_apply_max_sessions`, `_apply_rdp_timeouts`, and
|
||
`_apply_oem_runtime_fixes` rewritten to call run_in_windows and
|
||
raise RuntimeError on rc != 0.
|
||
- `apply_windows_runtime_fixes` honest reporting: an actual rc != 0
|
||
now produces "failed: rc=2 ..." instead of fake "ok".
|
||
|
||
Cost: ~5-10s per call. Trade-off: works on existing pods (no
|
||
container recreate). Caveat: requires cfg.rdp.password to match the
|
||
Windows guest's actual password — auth fail on first call means user
|
||
has to manually sync via `winpodx app run desktop` + `net user`.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Sun, 26 Apr 2026 14:30:00 +0900
|
||
|
||
winpodx (0.1.9.3) unstable; urgency=high
|
||
|
||
* Fixed: patch-version migrate skipped the Windows-side apply.
|
||
`_version_tuple(...)[:3]` truncated 0.1.9.1 and 0.1.9.2 to the same
|
||
(0, 1, 9) tuple, so migrate exited with "already current" before
|
||
the runtime apply step. Now runs the idempotent apply even on the
|
||
"already current" path so patch-version users still receive fixes
|
||
shipped after their last successful migrate.
|
||
* Added: standalone `winpodx pod apply-fixes` CLI command.
|
||
Idempotent runtime apply with per-helper OK/FAIL output. Exits 0
|
||
on full success, 2 on pod-not-running / backend unsupported, 3 on
|
||
helper failure.
|
||
* Added: "Apply Windows Fixes" button on the GUI Tools page —
|
||
fires the same runtime apply on a worker thread.
|
||
* Added: install.sh auto-invokes `winpodx pod apply-fixes` at the
|
||
end of every install (after migrate). Failure-tolerant; silent
|
||
skip if pod isn't running. Guarantees `curl | bash` always
|
||
delivers the latest Windows-side fixes regardless of migrate's
|
||
version comparison verdict.
|
||
* Added: public `provisioner.apply_windows_runtime_fixes(cfg)` API
|
||
returning a per-helper status dict — single entry point shared by
|
||
CLI / GUI / migrate paths.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Sun, 26 Apr 2026 05:30:00 +0900
|
||
|
||
winpodx (0.1.9.2) unstable; urgency=high
|
||
|
||
* Fixed: Windows-side fixes from v0.1.9 / v0.1.9.1 (NIC power-save off,
|
||
TermService failure recovery, RDP timeout disable, KeepAlive) were
|
||
not reaching existing guests. install.bat only runs on a fresh
|
||
container, and v0.1.9.1's _apply_rdp_timeouts was wired AFTER the
|
||
check_rdp_port early-return in ensure_ready so it never fired on
|
||
healthy pods.
|
||
- ensure_ready now probes pod_status at the top and runs
|
||
_apply_max_sessions, _apply_rdp_timeouts, and the new
|
||
_apply_oem_runtime_fixes BEFORE the RDP early-return.
|
||
- New _apply_oem_runtime_fixes pipes the OEM v7 baseline (NIC
|
||
power-save off + sc.exe failure TermService) to existing guests
|
||
via the same `podman exec` stdin-pipe transport discovery uses.
|
||
- `winpodx migrate` proactively calls all three applies when
|
||
crossing the 0.1.9 version boundary, with pod-state probe and
|
||
an interactive offer to start a stopped pod. Per-helper
|
||
success/failure output so users see exactly what landed.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Sun, 26 Apr 2026 02:30:00 +0900
|
||
|
||
winpodx (0.1.9.1) unstable; urgency=high
|
||
|
||
* Fixed: GUI SEGV when clicking "Refresh Apps" against a pod that
|
||
isn't running. The failure path's QMessageBox construction is now
|
||
deferred via QTimer.singleShot(0, ...) so the queued-signal handler
|
||
frame unwinds before Qt's font-inheritance lookup walks the parent.
|
||
Info page first-fetch deferred out of __init__ for the same reason.
|
||
Info worker class hoisted to module level, busy-state reentrancy
|
||
guard added, worker + QThread both deleteLater'd on completion.
|
||
* Fixed: RDP sessions drop mid-use after host suspend / long idle.
|
||
v0.1.9 Bug B fix only handled "RDP unreachable"; this release
|
||
disables Windows TermService timeouts (MaxIdleTime / Max
|
||
DisconnectionTime / MaxConnectionTime = 0), enables KeepAlive
|
||
every 1 minute, and writes the keys to both the machine-policy
|
||
path and the RDP-Tcp WinStation. install.bat OEM bumps 7 -> 8;
|
||
existing 0.1.x guests get a runtime apply via a new
|
||
`_apply_rdp_timeouts` step in provisioner.ensure_ready (no
|
||
container recreate needed).
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Sun, 26 Apr 2026 00:00:00 +0900
|
||
|
||
winpodx (0.1.9) unstable; urgency=medium
|
||
|
||
* Fixed: `winpodx app refresh` on Windows. The 0.1.8 implementation
|
||
used `podman cp host:discover_apps.ps1 container:C:/...`, which
|
||
fails because dockur/windows is a Linux container running the
|
||
Windows guest inside QEMU and the C: drive lives in a virtual disk
|
||
that `podman cp` cannot reach. The script body is now piped via
|
||
`podman exec -i container powershell -Command -` over stdin.
|
||
* Fixed: RDP unreachable after host suspend / long idle. When VNC is
|
||
alive but RDP is not, winpodx now runs `Restart-Service -Force
|
||
TermService` + `w32tm /resync` and re-probes RDP. OEM bundle bumps
|
||
to 7 with preventive `Set-NetAdapterPowerManagement` + `sc.exe
|
||
failure TermService` actions for Windows-side self-recovery.
|
||
* Added: 5-section Info panel for both `winpodx info` and the GUI
|
||
main window — System, Display, Dependencies, Pod (state, uptime,
|
||
RDP/VNC reachability, active session count), Config.
|
||
* Changed: discovery-first refactor — the 14 bundled app profiles
|
||
were dropped. The Linux app menu now populates exclusively from
|
||
`winpodx app refresh`, which `provisioner.ensure_ready` fires
|
||
automatically on first pod boot when the discovered tree is empty.
|
||
Upgrading users get a `winpodx migrate` prompt to remove legacy
|
||
`winpodx-{14-bundled-slugs}.desktop` entries.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Sat, 25 Apr 2026 00:00:00 +0900
|
||
|
||
winpodx (0.1.8) unstable; urgency=medium
|
||
|
||
* Dynamic Windows-app discovery: new `winpodx app refresh` CLI subcommand
|
||
and "Refresh Apps" button on the Qt GUI's Apps page enumerate apps
|
||
installed on the Windows guest (Registry App Paths, Start Menu .lnk,
|
||
UWP/MSIX via AppxManifest, Chocolatey / Scoop shims) and register them
|
||
alongside the 14 bundled profiles. Icons are extracted from the real
|
||
binaries / package logos and written under
|
||
~/.local/share/winpodx/discovered/<slug>/.
|
||
* UWP RemoteApp launching: rdp.build_rdp_command now accepts a launch_uri
|
||
with strict-regex-validated AUMID and maps UWP apps to
|
||
/app:program:explorer.exe,cmd:shell:AppsFolder\<AUMID>.
|
||
* Post-upgrade migration wizard: `winpodx migrate` subcommand shows per-
|
||
version release notes for every version the user has skipped over and
|
||
can kick off `winpodx app refresh`. install.sh auto-invokes it on
|
||
detected upgrades; opt out with WINPODX_NO_MIGRATE=1.
|
||
* Configurable RemoteApp session cap: pod.max_sessions (clamped [1, 50],
|
||
default 10) is applied to the guest's Terminal Server
|
||
MaxInstanceCount at ensure_ready time. Memory budget warning fires in
|
||
CLI (config show/set, info) and GUI Settings only when the value
|
||
over-subscribes ram_gb — default config stays silent.
|
||
* install.sh offline / air-gapped flags: --source PATH, --image-tar PATH,
|
||
--skip-deps (+ matching WINPODX_* env vars) compose for installs
|
||
without git / registry / package-repo access.
|
||
* Security audit remediation (Wave 2): PNG QImage validation before
|
||
hicolor write, 64 MiB bounded subprocess stdout drain, DiscoveryError
|
||
kind canonicalization, Start Menu .lnk -Depth 8 cap, installed_version
|
||
marker size + regex hardening, launch_uri semantic unification across
|
||
PS code paths, CI persist-credentials:false on discover-apps-ps,
|
||
SECURITY.md Host <-> Guest Trust Model section.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Fri, 25 Apr 2026 00:00:00 +0900
|
||
|
||
winpodx (0.1.7) unstable; urgency=high
|
||
|
||
* Bump bundled rdprrap to v0.1.3 — license-compliance release.
|
||
Upstream withdrew rdprrap 0.1.0 / 0.1.1 / 0.1.2. 0.1.0 / 0.1.1
|
||
lacked the source-level attribution notices required by the
|
||
upstream licenses (stascorp/rdpwrap Apache-2.0, llccd/TermWrap
|
||
MIT, llccd/RDPWrapOffsetFinder MIT); 0.1.2 shipped NOTICE +
|
||
vendor/licenses/ and closed the legal gap but listed only 9 of
|
||
the 16 rdpwrap-derived Rust sources and had an inconsistent
|
||
copyright line in the rdprrap-conf About dialog. 0.1.3 expands
|
||
NOTICE to all 16 sources (grouped by upstream binary:
|
||
RDPWInst / RDPConf / RDPCheck), aligns the About-dialog
|
||
copyright to LICENSE, cites CC BY 4.0 for the adapted
|
||
Contributor Covenant text, and carries forward the 0.1.1
|
||
registry-readback fix (OriginalServiceDll was being saved as
|
||
termsrv.dlll on some hosts, which would have broken rdprrap
|
||
uninstall). New sha256 pinned; OEM version bumped to 6.
|
||
* Document bundled rdprrap in debian/copyright and add a top-level
|
||
THIRD_PARTY_LICENSES.md covering optional Python deps and the
|
||
bundled binary.
|
||
* winpodx 0.1.6 inherited the missing-attribution defect; upgrade to
|
||
0.1.7 so the Windows guest receives the compliant bundle.
|
||
* install.sh: fix BASH_SOURCE[0] unbound-variable abort under the
|
||
curl-pipe-to-bash path (set -u + stdin stream). Fixes GitHub #3.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Thu, 23 Apr 2026 12:00:00 +0900
|
||
|
||
winpodx (0.1.6) unstable; urgency=medium
|
||
|
||
* Bundle rdprrap v0.1.0 and auto-install during the Windows unattended
|
||
setup to enable multi-session RDP, so each RemoteApp window gets its
|
||
own session. Fully offline; sha256-verified against a pin file.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Wed, 22 Apr 2026 09:00:00 +0900
|
||
|
||
winpodx (0.1.5) unstable; urgency=medium
|
||
|
||
* Lower minimum Python requirement to 3.9 (was 3.11) so RHEL 9 / AlmaLinux 9
|
||
/ Rocky 9 can install without adding a separate Python module.
|
||
* Add python3-tomli to Depends for the TOML reader fallback on 3.9/3.10.
|
||
* Expand test matrix to Python 3.9 through 3.13.
|
||
* Add AlmaLinux 9 and 10 to the publish matrix.
|
||
* Add Arch Linux AUR publishing infrastructure (activation pending one-time
|
||
maintainer setup; see packaging/aur/README.md).
|
||
* Fix OBS RPM auto-download to correctly pick up newly-published assets.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Tue, 21 Apr 2026 19:00:00 +0900
|
||
|
||
winpodx (0.1.4) unstable; urgency=medium
|
||
|
||
* Fix .deb build aborting with "missing files" during dh_install.
|
||
* OBS publish step tolerates unrelated build-service-side failures on
|
||
architectures outside the target matrix.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Tue, 21 Apr 2026 17:00:00 +0900
|
||
|
||
winpodx (0.1.3) unstable; urgency=medium
|
||
|
||
* Fix OBS publish step looping on authentication errors during build wait.
|
||
* .deb build no longer runs the test suite; tests run upstream in CI.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Tue, 21 Apr 2026 15:00:00 +0900
|
||
|
||
winpodx (0.1.2) unstable; urgency=medium
|
||
|
||
* Fix RPM and .deb publish workflows not running on tag push so their
|
||
artifacts are now correctly attached to the Release.
|
||
* RPM build is resilient to pyproject.toml version being ahead of the
|
||
latest git tag.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Tue, 21 Apr 2026 12:00:00 +0900
|
||
|
||
winpodx (0.1.1) unstable; urgency=medium
|
||
|
||
* Prebuilt packages per Release: RPM (openSUSE Tumbleweed, Leap 15.6/16.0,
|
||
Slowroll, Fedora 42/43) and .deb (Debian 12/13, Ubuntu 24.04/25.04/25.10).
|
||
* AppImage packaging dropped.
|
||
* Install instructions in README cover openSUSE / Fedora / Debian / Ubuntu.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Tue, 21 Apr 2026 00:00:00 +0900
|
||
|
||
winpodx (0.1.0) unstable; urgency=medium
|
||
|
||
* Initial release.
|
||
|
||
-- Kim DaeHyun <kernalix7@kodenet.io> Mon, 20 Apr 2026 00:00:00 +0900
|