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 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 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 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 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 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 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 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 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 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 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. ...' silently dropped on next save. Hand-edited values survived because nothing overwrote them. -- Kim DaeHyun 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 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 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 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 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 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 ` 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 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-.exe` is an independent copy of the Rust shim whose PE resource section carries the matching `.ico`, patched via vendored rcedit (electron/rcedit v2.0.0, MIT). The Win10/Win11 Open With chooser ignores `Applications\\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-` 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 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 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 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 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 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 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 /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 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 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 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 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 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 : and short-circuits on subsequent launches until pod restart or winpodx upgrade. -- Kim DaeHyun 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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//. * 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\. * 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 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 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 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 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 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 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 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 Tue, 21 Apr 2026 00:00:00 +0900 winpodx (0.1.0) unstable; urgency=medium * Initial release. -- Kim DaeHyun Mon, 20 Apr 2026 00:00:00 +0900