Files
wehub-resource-sync 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
chore: import upstream snapshot with attribution
2026-07-13 12:32:37 +08:00

1037 lines
54 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 3090s. 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