winpodx (0.9.0) unstable; urgency=medium

  * Feature + hardening release: Windows apps can now be registered as URL-scheme
    handlers on Linux — clicking a `mailto:` (or app-scheme like `slack:` /
    `vnc:`) link opens it in the Windows app, auto-harvested during discovery
    (#421, #694). Security hardening: a discovered guest app can no longer
    silently seize the host's default `http`/`https` handler (opt-in only), and
    the session window-reaper no longer mis-kills a just-relaunched app nor
    mass-kills sessions on a transient scan failure (#680 follow-up). Fixes:
    kio-fuse detection on multiarch/KF6 layouts (#697), the reverse-open listener
    autostarting with the tray (#691), the PrepareForSleep D-Bus subscription
    (#690), and the install one-liner auto-installing `git` (#705). The optional
    debloat pass opts out of more ads/telemetry (#669, #684). See CHANGELOG.md.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Sat, 11 Jul 2026 09:00:00 +0000

winpodx (0.8.0) unstable; urgency=medium

  * Feature + bug-fix release: app discovery now defaults to Start-Menu-only
    (only what the Windows Start Menu shows, grouped into nested folder
    sub-groups) with a `desktop.full_app_scan` opt-in for the old scan-everything
    behaviour (#581); the `[pod] keyboard` setting is passed to FreeRDP as the
    session layout (#660); `--win-iso` is now staged before compose-up so dockur
    installs from it instead of downloading (#647); the reverse-open listener
    self-heals on app launch; bundled rdprrap 0.1.3 -> 0.3.0. Fixes the
    "Refresh Apps" SIGSEGV, the off-thread display-scale SIGABRT, the Debloat
    task dialog not auto-closing (#550), the layout-recursion SIGSEGV with long /
    CJK app names (#553), and a hermetic-build test failure on NixOS (#659).
    See CHANGELOG.md.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Tue, 30 Jun 2026 09:00:00 +0000

winpodx (0.7.4) unstable; urgency=medium

  * Feature + bug-fix release: choose the VM storage location with
    `install.sh --storage-dir` (#646) and install from a local Windows ISO
    with `--win-iso` (#647), a 24 GB+ host now defaults the VM to 8 GB RAM
    (#630); fixes opening a second document in an already-running app, "Open
    with" on stripped-PATH desktops (Deepin), a clear error on a missing RDP
    password + rejected `net user` rotation (#569), the `/kbd` extra flag, the
    GUI Logs-tab buttons honouring the Docker backend, the `.deb` pulling in
    `podman-compose` (#644), and the maintenance task dialog size (#550).
    See CHANGELOG.md.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Tue, 23 Jun 2026 09:00:00 +0000

winpodx (0.7.3) unstable; urgency=medium

  * Feature + bug-fix release: reverse-open now opens files on the Windows VM
    itself via an SMB share + kio-fuse mount (#616), optional idle auto-stop to
    free the VM's RAM (#622), +multitouch / stylus passthrough flag (#623),
    discovery timeout unified + raised so `app refresh` doesn't time out (#619),
    Dashboard RAM/Disk gauges no longer stick on "n/a" (#634), removed the USB
    drive-letter auto-mapper that destabilized installs (#613, #638), more
    debloat telemetry/ad surfaces (#590), per-distro usbredir hint (#593),
    quoted urlacl SDDL (#614), guest agent token self-heal (#615), and an
    install.sh `--ref` fix so a re-run installs the branch's latest commit.
    See CHANGELOG.md.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Sat, 20 Jun 2026 09:00:00 +0000

winpodx (0.7.2) unstable; urgency=medium

  * Bug-fix release: GUI Refresh crash (#567), tray submenus open on Plasma
    (#573), CJK app names discovered (#553), pod stop keeps the container,
    clear error on missing credentials (#569), FreeRDP-3 cache flags (#380),
    -gfx workaround (#393), debloat dialog UX (#550). See CHANGELOG.md.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Mon, 15 Jun 2026 05:50:03 +0000

winpodx (0.7.1) unstable; urgency=medium

  * Auto file associations for discovered apps ("Open with"); GUI app
    reset/custom-icon/multi-select; quick app launcher; doctor warns on old
    FreeRDP; install.sh honours --main on Atomic Fedora; gui detaches from the
    terminal. See CHANGELOG.md for details.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Sat, 13 Jun 2026 14:24:21 +0000

winpodx (0.7.0) unstable; urgency=medium

  * Bare-metal disguise (VM-detection avoidance): an opt-in hardened level
    that makes the Windows guest read as a physical machine to VM-detection
    software (Nvidia GPU-passthrough "code 43", launch-gate VM checks).
    Plus the symlinked-$HOME file-open fix (#547), the dockur v5.16
    USB-monitor fix (#286), the Devices-panel flicker fix, and the dockur
    v5.16 image pin. See CHANGELOG.md for the full list (#246).

 -- Kim DaeHyun <kernalix7@kodenet.io>  Thu, 11 Jun 2026 12:00:00 +0000

winpodx (0.6.0) unstable; urgency=medium

  * Consolidation + UX release. Host USB / PCI device passthrough (CLI +
    GUI + tray), Start-menu GUI with a resource Dashboard, multi-monitor
    RAIL (window keeps working on a second monitor), and a website at
    winpodx.org. The libvirt backend was dropped (breaking) -- the dockur
    QEMU/KVM-in-a-container backend now covers passthrough too. See the
    CHANGELOG / GitHub release notes for the full list (#286, #300, #460+).

 -- Kim DaeHyun <kernalix7@kodenet.io>  Fri, 05 Jun 2026 12:00:00 +0000

winpodx (0.5.9) unstable; urgency=medium

  * feat: selectable, fully translated UI in 7 languages
    (en/ko/zh/ja/de/fr/it) -- `winpodx language` + GUI dropdown, system
    locale by default (#335).
  * feat: Windows disk auto-grow + manual `pod grow-disk` / `pod
    disk-usage`, extending C: past dockur's WinRE recovery partition (#318).
  * feat: guest sync -- push host updates (agent / fixes / binaries) into a
    running guest without a reinstall (`pod sync-guest`, auto on pod start,
    also via `winpodx migrate`).
  * feat: opt-in pod auto-start on login (`winpodx autostart on|off|status`).
  * fix: RemoteApp painting the logon/lock screen (#332); AppImage
    `podman-compose ModuleNotFoundError` on atomic distros (#322); first-run
    setup prompt firing on every invocation (#341); USB shortcut erroring /
    a late-inserted USB now showing on refresh; guest version stamp over the
    windowless agent channel; upgrade re-install hanging at wait-ready [4/4].

 -- Kim DaeHyun <kernalix7@kodenet.io>  Tue, 27 May 2026 12:00:00 +0000

winpodx (0.5.8) unstable; urgency=medium

  * fix(oem): #269 agent 8765 HttpListener bind failed with "conflicts
    with an existing registration" on the non-admin autologon User.
    install.bat now reserves the urlacl via sddl=D:(A;;GX;;;WD) (World
    SID, locale-proof) + deletes overlapping reservations first;
    agent.ps1 retries the bind + dumps urlacl state on persistent
    failure. OEM bundle 24 -> 25. Diagnosed with @ismikes.
  * feat(packaging): #227 fat AppImage bundling FreeRDP + Podman +
    podman-compose + a python3 -m launch shim, plus `winpodx
    setup-host` pkexec wizard for kvm group / subuid. Tag pushes
    auto-build + attach it to the release. Requested by @leandromqrs.
  * fix(install): #288 require podman-compose proper instead of
    trusting `podman compose` delegation (which routes through
    docker-compose and breaks the keep-groups extension). Reported by
    @magicdiablo.
  * feat(pod): #287 `winpodx pod recover-oem` re-stages C:\OEM + runs
    install.bat when dockur's first-boot OEM copy fails. Driver:
    @ankranidiotis.
  * feat(pod): #126 wait-ready deadline auto-extends from dockur's
    wget ETA so slow ISO downloads don't trip the 60min timeout;
    other fixed timeouts widened + compose-up made activity-based.
    Reported by @xiyeming.
  * feat(setup): #255 `winpodx setup --customize` wizard now walks
    edition / language / region / keyboard / tuning; a standalone
    `winpodx setup` runs the full provision flow (wait-ready +
    discovery + reverse-open) like install.sh.
  * feat(tuning): #245 extended profile (hv-* enlightenments,
    virtio-rng, nested-virt autodetect) + `performance` profile.
    Suggested by @ismikes.
  * fix(rpm): #301 License tag widened to MIT AND Apache-2.0 for the
    bundled rdpwrap (Apache-2.0) inside rdprrap.
  * Plus #254 locale/timezone wiring, #247 debloat picker, #255
    doctor / uninstall consolidation / first-run prompt, and the
    QEMU 10 / dockur v5.15 compose fixes (-no-hpet drop, CPU_FLAGS
    refactor).

 -- Kim DaeHyun <kernalix7@kodenet.io>  Sun, 24 May 2026 12:00:00 +0000

winpodx (0.5.7) unstable; urgency=medium

  * feat(debloat): #247 four-phase rollout of the per-item debloat
    picker. data/debloat/items.toml catalog (11 items, 4 presets),
    per-item .ps1 scripts + undo siblings under
    scripts/windows/debloat/, %ProgramData%\winpodx\debloat-applied.json
    state tracking. CLI flags --list / --preset / --items / --undo /
    --menu. Qt picker dialog at gui/debloat_picker.py with risk
    badges + preset radios + Custom override. Text-mode picker via
    --menu for headless / SSH installs.
  * feat(locale): #254 three-phase wiring of cfg.pod.timezone +
    Windows-guest TZ. Now redesigned (#267) around dockur's native
    TZ env var so the OEM dir doesn't need per-config files. Host
    detection via timedatectl / readlink /etc/localtime / /etc/timezone
    fallback chain (utils/locale.py). GUI Settings -> Container/VM
    gains Language / Region / Keyboard / Timezone dropdowns with
    Auto-detect first option. CLI: winpodx config set pod.timezone
    --auto, winpodx pod recreate [--wipe-storage].
  * fix(compose): OEM cp Permission denied cascade on umask 077 hosts
    (#267). #254 P1's always-copy OEM dir path re-introduced the
    parent-dir traversal trap PR #95 originally dodged. Reverted to
    bundle-direct fast path now that the TZ env var route eliminates
    the need for always-copy.
  * fix(config): Config.save() now persists pod.language / pod.region
    / pod.keyboard / pod.timezone / pod.tuning_profile. Pre-this
    fix those five fields were loaded but never written back, so
    'winpodx config set pod.<field> ...' silently dropped on next
    save. Hand-edited values survived because nothing overwrote
    them.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Thu, 21 May 2026 22:30:00 +0000

winpodx (0.5.6) unstable; urgency=medium

  * fix(rdp): drop podman unshare --rootless-netns wrap so FreeRDP
    runs on the host loopback where the rootless publish is actually
    reachable (#214, reported by @ismikes on Kubuntu 26.04 + Plasma 6
    + FreeRDP 3.24, diagnosed by @smoore100). The wrap put xfreerdp3
    inside the container's network namespace where the host-side
    publish was invisible, so app launches printed "Launching..."
    but no RDP window ever appeared. Side benefit: FreeRDP launch
    path no longer needs the podman binary on PATH (flatpak-only
    FreeRDP setups now work).
  * fix(info): VNC reachability probe switched from check_rdp_port
    (X.224 handshake) to check_tcp_port (plain TCP accept). VNC
    speaks RFB, not RDP, so the handshake probe always returned
    False and "winpodx info" printed "VNC unreachable" even while
    NoVNC was serving. Reported via #214.
  * fix(uninstall): final tray/GUI sweep right before the summary,
    so processes that came up *during* the uninstall window (other-
    terminal GUI launches, XDG-autostart races, dbus activation)
    still get killed. WINPODX_NO_TRAY_SPAWN + section-0a pkill cover
    the case where uninstall.sh is the only thing touching the tray
    but miss races against the uninstall window itself.
  * internal: packaging/obs/obs-publish.yml anchors the download
    grep to the current tag version so stale older RPMs left in the
    OBS publish index by rolling-release repos (Tumbleweed / Slow-
    roll lazy GC) don't get re-uploaded as release assets. v0.5.5
    surfaced this with two stale 0.5.4 RPMs that had to be deleted
    by hand from the Release page.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Thu, 21 May 2026 06:00:00 +0000

winpodx (0.5.5) unstable; urgency=medium

  * winpodx setup rerun no longer silently overwrites the Windows
    password and locks users out of the guest account (#216,
    reported by @tolistim). Re-running setup on an existing install
    used to reprompt for the Windows password and write whatever was
    entered into winpodx.toml; because dockur honors USERNAME /
    PASSWORD env vars only on first boot, the host config silently
    desynced from the actual Windows guest account and the next RDP
    launch failed with LOGON_FAILED_BAD_PASSWORD. The interactive
    prompt now detects an existing config with populated
    cfg.rdp.user / cfg.rdp.password, preserves them, and directs the
    user to `winpodx rotate-password`.
  * Host-adaptive Windows-on-KVM tuning profile (#215, suggested by
    @ismikes). New `cfg.pod.tuning_profile` knob with values auto |
    safe | off | manual. Default `auto` probes /proc/cpuinfo,
    /proc/meminfo, os.uname, os.getloadavg at compose time and turns
    on `+invtsc` on x86_64 hosts that expose invariant TSC.
    `winpodx info` and `winpodx setup` print a [Tuning] block
    showing detected capability and resolved profile. Items that
    require host-side setup (hugepages, CPU pinning, VFIO) stay
    documented operator tasks rather than wired into winpodx
    automatically.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Wed, 20 May 2026 14:00:00 +0000

winpodx (0.5.4) unstable; urgency=medium

  * Same-day hotfix for v0.5.3 Debian/Ubuntu package build failure.
    Older `hatchling` (Ubuntu 24.04 ships 1.18.0) maintains its own
    Trove classifier whitelist and rejects
    `Programming Language :: Python :: 3.14` with
    `ValueError: Unknown classifier`. The classifier line is dropped
    from pyproject.toml; CI matrix still runs the Python 3.14 leg, so
    functional 3.14 coverage is unchanged. RPM / OBS / AUR / GitHub
    Release in v0.5.3 were unaffected.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Tue, 19 May 2026 15:00:00 +0000

winpodx (0.5.3) unstable; urgency=medium

  * Compose up/down timeout is now pull-friendly (#212, reported by
    @jimed-rand). Default `podman-compose up -d` / `down` timeout
    bumped 120s → 1800s; honors `WINPODX_COMPOSE_TIMEOUT_SECS` env
    var (`0` = no cap). First-time Windows image pulls on slow links
    no longer trip the 120s wall.
  * Launch surfaces FreeRDP stderr on quick-exit (#213 reported by
    @mozjacksson, #214 reported by @ismikes). `launch_app` polls the
    process 500 ms after spawn and raises `FreeRDP exited
    immediately with rc=...` with the stderr log path; eliminates
    the silent "launched but no window" failure mode on Plasma 6 /
    Wayland and Python 3.14 hosts.
  * Ubuntu 26.04 packaging + Python 3.14 in the CI matrix (#206).
    Closes the untested-platform gap that surfaced #213 / #214.
  * Windows language / region / keyboard configuration (by @juampe,
    #201). New `[pod] language / region / keyboard` keys in
    `winpodx.toml`; defaults stay `English` / `en-001` / `en-US`.
    All three fields run through the same YAML-injection sanitiser
    as `user` / `password` / `home`.
  * LICENSE / README ship to `/usr/share/winpodx/` in the `.deb`
    (by @juampe, #201). GUI License tab no longer hits
    `FileNotFoundError` on Debian/Ubuntu installs.
  * Dynamic desktop resolution: desktop sessions resize to the
    FreeRDP client window size by default (by @Zeik0s, #197).
  * Qt stylesheet parser warnings at GUI startup silenced
    (by @juampe, #203).

 -- Kim DaeHyun <kernalix7@kodenet.io>  Tue, 19 May 2026 14:00:00 +0000

winpodx (0.5.2) unstable; urgency=medium

  * install.sh: pick freerdp3-x11 over freerdp2-x11 when available
    (reported by @basti189, #198). Fixes the hard install failure on
    Debian 13 (Trixie) and recent Ubuntu (24.10 / 25.04 / 25.10)
    where the stock apt repos no longer ship freerdp2-x11; pkg_name()
    now probes apt-cache show and prefers freerdp3-x11, falling back
    to freerdp2-x11 only on Debian <=12 / Ubuntu 22.04 stock.
  * install.sh: Atomic Fedora install path (by @Zeik0s, #163).
    Silverblue / Kinoite / Sericea / Bluefin / Bazzite installs now
    autodetect rpm-ostree and layer winpodx via OBS in one
    transaction (rpm-ostree install --apply-live --idempotent), no
    per-package reboot loop. Falls back to staged install + reboot
    prompt if the booted deployment rejects live apply.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Wed, 14 May 2026 13:00:00 +0000

winpodx (0.5.1) unstable; urgency=medium

  * Win10+ Windows edition picker (#178). LTSC IoT, Win11 LTSC,
    Tiny10/11, Server 2016-2025 selectable from GUI Settings,
    `winpodx setup --win-version`, or `install.sh --win-version`.
    Pre-Win10 editions excluded (out of Microsoft security support;
    don't match rdprrap / agent.ps1 assumptions) but pass through to
    dockur with a warning if explicitly requested. Custom Windows
    ISOs documented as a manual workaround under "Advanced: Custom
    Windows ISO" in docs/ARCHITECTURE.md — set
    win_version = "custom" + edit compose.yaml to mount the .iso.
  * FreeRDP 2/3 RemoteApp compatibility fix (#158, reported by
    @poetman). `winpodx app run <app>` no longer falls back to
    Microsoft Store on Ubuntu 22.04 LTS (FreeRDP 2.11.x). Win32
    RemoteApp launches now use FreeRDP's separate /app: + /app-name:
    + /app-cmd: flags instead of FreeRDP 3-only combined
    /app:program:X,name:Y,cmd:Z syntax that FreeRDP 2 mis-parses.
  * Discovery no longer re-imports Linux reverse-open shims as
    Windows apps (#182). Existing polluted entries are auto-purged
    on the next `winpodx app refresh`.
  * Weekly Docker Hub digest watcher (#180) — catches silent dockur
    rebuilds (security patches without a tag bump) that the
    release-tag watcher alone misses.
  * Internal refactor: WinpodxWindow Qt class split from 2745 lines
    into a 148-line orchestrator + 10 single-responsibility mixins
    (#181). No user-visible change.
  * Docs: contributor attribution convention documented in
    CONTRIBUTING (#187). Korean CHANGELOG / INSTALL / ARCHITECTURE /
    USAGE mirrors updated to match.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Thu, 14 May 2026 12:00:00 +0000

winpodx (0.5.0) unstable; urgency=medium

  * Reverse-open feature (#48) ships end-to-end as the headline of
    this release. Linux apps now appear in the Windows guest's
    right-click "Open with..." menu by default — no opt-in flag, no
    Settings toggle required — with correct per-app icons in both
    the short menu and the long "Choose another app" dialog. Phase 2
    series complete (a discovery + ICO + CLI, b listener daemon +
    lifecycle, c guest handlers + sync transport + default-on, d Qt
    Settings card), plus the full fix-forward stack.
  * Chooser entry icons render correctly via embedded EXE icon
    resource. Each per-slug `winpodx-<slug>.exe` is an independent
    copy of the Rust shim whose PE resource section carries the
    matching `<slug>.ico`, patched via vendored rcedit
    (electron/rcedit v2.0.0, MIT). The Win10/Win11 Open With chooser
    ignores `Applications\<exe>\DefaultIcon` and per-ProgID
    `DefaultIcon`; the embedded EXE icon is the only surface that
    works. PR #165's hard-link inode-sharing optimisation is dropped
    (~500 KB × N apps on disk) since there's no chooser-icon path
    that also preserves shared inodes on stock Windows.
  * Per-app `.cmd` wrappers, Rust `.exe` shim, short-menu visibility,
    Firefox handoff, multi-resolution ICOs, Desktop folder shortcut
    + Quick Access pin, and `--purge` skip-guest-scrub all land in
    the fix-forward stack (PRs #164 → #171).
  * `winpodx pod start` auto-spawns the host-side reverse-open
    listener daemon; `winpodx pod stop` tears it down before stopping
    the pod itself.
  * `winpodx host-open refresh` scans `$XDG_DATA_HOME/applications`
    + `$XDG_DATA_DIRS`, applies allow / denylist, rasterises icons to
    multi-resolution ICO, stages a manifest under
    `~/.local/share/winpodx/reverse-open/`, and pushes everything to
    the guest via the bearer-authed `/exec` endpoint when the agent
    is reachable.
  * On the guest, per-app `HKCU\\Software\\Classes\\winpodx-<slug>`
    ProgIDs are attached to each applicable extension's
    `OpenWithProgids` subkey; clicking a Linux app from "Open
    with..." invokes the Rust shim which atomically writes a
    request JSON into the host listener's incoming dir.
  * Self-contained sync — all three guest scripts
    (`register-apps.ps1`, `unregister-apps.ps1`, the shim) plus the
    vendored `rcedit.exe` are base64-embedded into the sync payload,
    so existing pods get the feature on first sync without depending
    on dockur having staged the OEM bundle.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Wed, 13 May 2026 00:00:00 +0000

winpodx (0.4.4) unstable; urgency=medium

  * Patch release. Restores real-time `pod wait-ready --logs` output that
    was inadvertently buffered in v0.4.3 (the `tee` pipe added for
    half-uninstalled-state diagnostics flipped Python's stdout to
    4 KB-block-buffered; install.sh now prepends `PYTHONUNBUFFERED=1` to
    the wait-ready invocation to force line-buffered output).
  * Carry-over from the v0.4.3 dev cycle: half-uninstalled-state
    self-heal in `winpodx setup --non-interactive`; cachyos rotate-
    password / sync-password agent-first preference; codec-flag
    allowlist correction (drop OPTIONAL-typed `+/-gfx-h264` etc. that
    FreeRDP rejects); `winpodx app run --extra-args` per-launch escape
    hatch; btrfs warning suppression in `wait-ready --logs`; dormant
    Phase 1 foundations for the agent-first install + reverse-open
    initiatives.
  * Smoke-tested end-to-end on openSUSE Tumbleweed (2026-05-10):
    Password sync OK via agent transport, apply chain via agent
    transport, discovery 1-retry-deferred (normal), 56 apps in menu;
    multi-session verified (qwinsta showed two active User sessions:
    console + rdp-tcp#0).

 -- Kim DaeHyun <kernalix7@kodenet.io>  Sun, 10 May 2026 13:30:00 +0000

winpodx (0.4.3) unstable; urgency=medium

  * The btrfs Copy-on-Write fragmentation fix. Per-user storage bind mount
    with automatic NoCoW (chattr +C) so Windows VM disk image writes stop
    forking new btrfs extents on every overwrite. On btrfs hosts pod
    recreates that previously took many minutes (and frequently timed out
    on the 300 s budget) finish in 30 s like they always did on ext4.
    Reported by @xiyeming in #121, #122; cachyos failure cascade in #126
    has the same root cause (install.bat dies mid-stage during btrfs CoW
    file-op stalls; without rdprrap the host's FreeRDP fallback hits
    multi-session reset).
  * Five PRs landing the fix end-to-end: PR #125 (bind mount + chattr +C
    + named-volume migration), PR #127 (compose-prefixed volume name
    resolution: `winpodx_winpodx-data`), PR #128 (chattr +C result inline
    surfacing + post-rsync NoCoW verification), PR #129 (refuse to
    re-migrate when bind-mount target is already populated), PR #130
    (`detect_path_fs` walks up to existing ancestor before findmnt — the
    actual root cause for chattr +C silently never applying on fresh
    installs).
  * Smoke-tested end-to-end on openSUSE Tumbleweed btrfs: clean wipe →
    v0.4.2 fresh install → upgrade to main; install.sh prints
    `chattr +C applied to /home/.../winpodx/storage` between
    `Migrating storage...` and `OK: migrated 71 GiB`; afterwards
    `lsattr -d` and `lsattr data.img` both show the C flag, dockur's
    `Warning: COW (copy on write) is not disabled` no longer appears.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Wed, 06 May 2026 14:30:00 +0000

winpodx (0.4.2) unstable; urgency=medium

  * Patch release. Two small fixes on top of 0.4.1:
    - wait-ready --logs now rewrites dockur's container-internal VNC URL
      (http://127.0.0.1:8006/) to the host's actual mapped port so the
      printed URL matches what the user can open in a browser. Closes #118.
    - Packaging workflows (debs/rhel) tolerate the create-release race that
      produced duplicate v0.4.1 release entries on tag push; create is now
      idempotent.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Tue, 05 May 2026 12:00:00 +0000

winpodx (0.4.1) unstable; urgency=high

  * 0.4.x line's first stable release. Closes the 'agent never installs'
    fresh-install regression observed on openSUSE Tumbleweed: install.bat's
    PS Expand-Archive deadlock against Windows Defender real-time scan,
    host-side FreeRDP fallback kicking the autologon session via Windows
    session-takeover, and the agent-respawn race after migrate's apply
    chain are all addressed with layered defences (Defender exclusions
    early in install.bat, tar -xf instead of PS Expand-Archive, agent /
    health gates on every host -> guest path, retry-with-delay around the
    apply-chain respawn window). install.sh smoke-tested end-to-end on
    openSUSE Tumbleweed; menu populates inline before install.sh exits.
  * Release trigger now keys on a separate REL- marker tag (REL-v0.4.1)
    so the version scheme stays clean PEP 440. See CHANGELOG.md for full
    details.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Tue, 05 May 2026 00:00:00 +0000

winpodx (0.4.0~rc1) unstable; urgency=high

  * Release candidate: Defender exclusions, tar-based rdprrap extraction,
    and install-time agent-only post-install gates.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Mon, 04 May 2026 00:00:00 +0000

winpodx (0.3.0) unstable; urgency=medium

  * Added: HTTP guest agent (agent.ps1, rev4) on 127.0.0.1:8765.
    Bearer-authed /exec endpoint replaces FreeRDP RemoteApp as the
    default host->guest command channel. /health stays unauthenticated
    for the readiness probe; /exec spawns child PowerShell via
    [Diagnostics.Process] + CreateNoWindow so no PS-window flashes.
    Token delivered via OEM bind mount (mode 0600 on host, gitignored).
  * Added: Transport ABC v1 (core/transport/{base,agent,freerdp,
    dispatch}). dispatch() prefers the agent and falls back to FreeRDP
    when /health doesn't answer. Password rotation is documented as
    NEVER routing through Transport (rule #6 in TRANSPORT_ABC.md) -
    the rotation flow owns its own credentials and calls
    run_in_windows directly to avoid the bootstrap loop.
  * Added: `winpodx check` CLI + matching GUI Health card running
    nine probes (pod, RDP, agent /health, /exec round-trip, in-guest
    summary, OEM bundle, password age, app count, host disk free).
    --json for scripting; exit 1 only on FAIL. The GUI Health card
    auto-refreshes every 30s while visible.
  * Added: Sidebar transport indicators - small `A` (agent) and `R`
    (RDP) dots beside the pod chip turn green/red live so the user
    sees at a glance which channel the next launch will use.
  * Added: Modular core split. provisioner.py was 700+ lines doing
    pod lifecycle, password rotation, discovery auto-fire, self-heal
    applies, and host->guest RPC; now broken into core/pod/,
    core/rotation/, core/discovery/, and core/transport/ with the
    self-heal apply (the source of the previous PS-window storm)
    deleted entirely.
  * Fixed: install.bat (rev12) pre-registers URL ACL for +:8765 so
    the non-admin User can bind, opens Windows Firewall for tcp/8765,
    and registers WinpodxAgent under HKCU\Run with -WindowStyle
    Hidden. Compose mapping 127.0.0.1:8765:8765 + USER_PORTS=8765
    for QEMU hostfwd was missing on 0.2.x and is now present.
  * Fixed: agent /exec returned rc:null after clean child exit.
    PowerShell's Start-Process -PassThru + WaitForExit can leave
    $proc.ExitCode null. agent.ps1 coerces to 0; AgentClient also
    tolerates null as 0 so older agents keep working.
  * Fixed: Discovery script path. _ps_script_path walked four
    .parent's instead of five and resolved to <root>/src/scripts/...
    which never exists; GUI Refresh stopped showing "Pod Not Running"
    on healthy pods.
  * Fixed: GUI misclassified script_missing as pod_not_running -
    _looks_like_pod_down was substring-matching "pod" inside install
    paths like winpodx-app/. RefreshWorker now reads
    DiscoveryError.kind first.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Thu, 30 Apr 2026 17:00:00 +0900

winpodx (0.2.1) unstable; urgency=medium

  * Added: utils.pending resume system. New
    ~/.config/winpodx/.pending_setup marker tracks install.sh steps
    that couldn't complete (wait_ready / migrate / discovery). Next
    CLI invocation and every GUI startup picks up the marker and
    runs the missing steps in canonical order. Each step removes
    itself on success; file deleted once empty. 10 unit tests.
  * Added: GUI Quick Start dialog on first launch. Shows backend /
    FreeRDP / pod / RDP listener / app count snapshot. Dismiss
    writes .welcomed marker.
  * Added: GUI Logs page auto-tails winpodx app log on navigate.
    `tail -F ~/.config/winpodx/winpodx.log` streams internal logs
    alongside the existing container-log buttons; auto-stop on
    leaving the page.
  * Changed: install.sh wait-ready timeout 1800s -> 3600s (1 hour).
    Slow first installs can complete in-line instead of bailing
    out; anything past the hour is picked up by the resume hook.
  * Changed: pod.max_sessions default 10 -> 25, pod.ram_gb default
    4 -> 6 GB. 10 was tight for real-world simultaneous app use.
    Setup wizard tier auto-detect tunes both per machine.
  * Added: utils.specs auto-tier detector. Host CPU + RAM determine
    one of three presets (low/mid/high) for VM cpu_cores + ram_gb.
    Interactive setup pre-fills the recommendation.
  * Fixed: zombie disconnected sessions caused "Select a session to
    reconnect to" dialog every launch. MaxDisconnectionTime was 0
    (no timeout = sessions never logoff). v0.2.1 sets it to 30000
    (30 sec) in both install.bat and _apply_rdp_timeouts so closed
    sessions auto-clean.
  * Fixed: _apply_max_sessions wrote to the wrong registry key
    (Terminal Server\MaxInstanceCount, no \WinStations\RDP-Tcp).
    Windows reads the WinStations subkey, so cfg changes since
    session-cap shipping silently no-op'd. Now writes the correct
    key and bumps install.bat OEM-time ceiling 10 -> 50 to match.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Tue, 28 Apr 2026 09:30:00 +0900

winpodx (0.2.0.11) unstable; urgency=high

  * Fixed: second SEGV path on GUI Refresh. v0.2.0.10 fixed the
    QImage-on-worker-thread race, but the success/failure slots
    immediately nulled out self._refresh_worker. Python's ref drop
    raced Qt's queued worker.deleteLater event -> ~QObject() on a
    half-freed pointer -> Signal 11. Now Python refs are dropped
    only via thread.finished after both Qt objects have been torn
    down properly.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Tue, 28 Apr 2026 08:00:00 +0900

winpodx (0.2.0.10) unstable; urgency=high

  * Fixed: GUI Refresh button SEGV. _DiscoveryWorker.run() called
    persist_discovered -> _validate_png_bytes which used QImage on a
    Qt worker thread; Mesa/libgallium state owned by the main GUI
    thread raced and dropped a Signal 11 core. _validate_png_bytes
    now short-circuits to the stdlib chunk walker when off the main
    thread.
  * Fixed: install.sh wait-ready timeout 600s -> 1800s. A fresh
    install downloads the ~7.5GB Windows ISO + Sysprep + OEM apply,
    which takes 15-30 minutes on first run. The previous 600s timeout
    fired before the Windows VM had even booted.
  * Added: GUI Refresh now installs .desktop entries (parity with
    CLI). Bidirectional sync via worker-thread-safe
    _sync_desktop_entries.
  * Added: GUI auto-fires discovery when the pod transitions to
    running and the app list is empty (covers the case where install
    timeout hit before Sysprep finished).
  * Added: GUI live log streaming. New buttons on Tools/Terminal:
    `Live (pod)`, `Live (app)`, `App log`, `Stop tail` — tail -F the
    container or ~/.config/winpodx/winpodx.log into the panel.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Mon, 27 Apr 2026 18:00:00 +0900

winpodx (0.2.0.9) unstable; urgency=medium

  * Fixed: 2nd app launch triggered Windows "Select a session to
    reconnect to" dialog. Default Windows refuses concurrent
    RemoteApp sessions per user. Self-heal apply now also runs
    rdprrap-conf --enable so each launch gets its own session.
    Idempotent; tolerates missing rdprrap-conf as best-effort skip.
  * Fixed: stale .desktop entries lingered after apps removed from
    the Windows guest. Refresh now bidirectionally syncs — any
    winpodx-*.desktop not corresponding to an entry in
    list_available_apps() is removed (along with its icons).
    User-authored entries are preserved.
  * Changed: README more informative — prominent Beta + Latest
    release badges at top, plus social/activity shields rows.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Mon, 27 Apr 2026 17:00:00 +0900

winpodx (0.2.0.8) unstable; urgency=medium

  * Fixed: `winpodx app refresh` discovered apps but never registered
    them in the desktop menu. Refresh now auto-installs .desktop
    entries for discovered apps (best-effort) + refreshes the icon
    cache.
  * Fixed: PowerShell window flashed on every app launch because
    ensure_ready's self-heal apply re-fired three FreeRDP RemoteApp
    PowerShell payloads on every click. Self-heal now stamps
    .applies_stamp with <winpodx_version>:<container_StartedAt>
    and short-circuits on subsequent launches until pod restart or
    winpodx upgrade.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Mon, 27 Apr 2026 16:00:00 +0900

winpodx (0.2.0.7) unstable; urgency=medium

  * Fixed: pod wait-ready --logs showed no [container] lines.
    The tail was started with --tail 0 (only logs from "now" onward,
    so Windows ISO download + boot stage messages already printed
    before wait-ready ran were invisible) AND only stdout was drained
    while dockur splits progress between stdout and stderr.
    v0.2.0.7 uses --tail 100 + drains both streams in parallel
    threads, so the user actually sees what Windows is doing.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Mon, 27 Apr 2026 15:00:00 +0900

winpodx (0.2.0.6) unstable; urgency=high

  * Fixed: wait_for_windows_responsive collapsed in <1s on a still-
    booting guest. The helper fired exactly ONE FreeRDP RemoteApp
    probe after the RDP port opened — a single failure (which is what
    every still-booting guest produces, rc=147 connection-reset)
    returned False immediately and the caller's 600s timeout was
    effectively ignored. v0.2.0.6 turns the probe into a retry loop
    that fires repeated 5-20s probes until one succeeds or the
    overall timeout expires (3s pacing between attempts). pod
    wait-ready --timeout 600 now actually waits up to 10 minutes
    instead of bailing in the first second.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Mon, 27 Apr 2026 14:00:00 +0900

winpodx (0.2.0.5) unstable; urgency=medium

  * Added: `winpodx pod wait-ready [--timeout SEC] [--logs]` —
    multi-phase wait gate for Windows VM first-boot. Three checkpoints
    with elapsed-time stamps: container running, RDP port open,
    Windows ready (RemoteApp probes OK). With --logs, container
    stdout is tailed in a background thread so the user sees Windows
    Sysprep / OEM apply progress instead of a silent multi-minute
    hang.
  * Changed: install.sh is now single-shot. Flow: setup -> pod
    wait-ready --logs -> migrate -> app refresh. install.sh exits
    when the install is actually finished, not when the container
    started. WINPODX_NO_WAIT=1 / WINPODX_NO_DISCOVERY=1 skip the
    waits in CI / non-interactive setups.
  * Removed redundant `winpodx pod apply-fixes` call from install.sh
    (migrate's always-apply path already runs the apply).

 -- Kim DaeHyun <kernalix7@kodenet.io>  Mon, 27 Apr 2026 13:00:00 +0900

winpodx (0.2.0.4) unstable; urgency=high

  * Fixed: bogus "cfg.password does not match Windows" warning on
    every fresh --purge install. _probe_password_sync's error
    classifier matched on "no result file" OR "auth" — but on a
    still-booting guest FreeRDP returns rc=147 connection-reset
    wrapped in the host's "No result file written" envelope, which
    matched the first pattern and surfaced as a phantom drift
    warning. v0.2.0.4 gates the probe on wait_for_windows_responsive
    (skip if guest isn't ready) AND tightens the classifier to
    distinguish transport-level failures (rc=131, rc=147,
    transport_failed, connection reset) from genuine auth failures
    (logon_failure, STATUS_LOGON_FAILURE).

 -- Kim DaeHyun <kernalix7@kodenet.io>  Mon, 27 Apr 2026 11:00:00 +0900

winpodx (0.2.0.3) unstable; urgency=high

  * Fixed: discovery hit the same boot race the apply path used to.
    v0.2.0.1 gated _apply_* and pod apply-fixes on
    wait_for_windows_responsive, but migrate's "Run app discovery now?"
    prompt and provisioner._auto_discover_if_empty still launched the
    FreeRDP RemoteApp channel without a probe. On fresh --purge
    reinstalls the scan collapsed with rc=147 connection reset.
    v0.2.0.3 wires the same probe into both discovery call sites.
  * Bumped first-boot timeout 90s -> 180s on all three apply /
    discovery probes so slower hardware completes the install on
    the first try.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Mon, 27 Apr 2026 10:00:00 +0900

winpodx (0.2.0.2) unstable; urgency=medium

  * Fixed: fresh --purge reinstall reported a bogus "0.1.7 -> X
    detected" upgrade. winpodx setup saved winpodx.toml but never
    stamped installed_version.txt, so the follow-up `winpodx migrate`
    chained by install.sh saw the config + missing marker and fell
    through to the pre-tracker fallback that assumes baseline 0.1.7.
    Setup now writes the current version to installed_version.txt
    when absent, so a fresh install reports as the current version
    (no migration steps fire) while real upgrades still work.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Sun, 26 Apr 2026 23:00:00 +0900

winpodx (0.2.0.1) unstable; urgency=high

  * Fixed: apply cascade collapsed on cold container. v0.2.0 fired the
    three runtime applies (max_sessions, rdp_timeouts, oem_runtime_fixes)
    the moment the container reached RUNNING, but the Windows VM inside
    QEMU needed another 30-90s before its RDP listener could accept
    FreeRDP RemoteApp activation. Within that window every apply
    collapsed: ERRCONNECT_CONNECT_TRANSPORT_FAILED (rc=147) on fresh
    install, or ERRCONNECT_ACTIVATION_TIMEOUT (rc=131) on pod restart.
    3min cascade surfaced as a Launch Error dialog or "3 of 3 applies
    failed" panic during setup -> migrate.
  * Added: wait_for_windows_responsive() helper polls check_rdp_port,
    then fires a 20s no-op probe to confirm FreeRDP RemoteApp is live.
    Used by ensure_ready warm path, winpodx pod apply-fixes, and
    winpodx migrate apply step.
  * Added: _self_heal_apply() wraps warm-pod ensure_ready applies in
    WindowsExecError swallow so transient channel failures log a
    warning and abort further attempts in the same call.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Sun, 26 Apr 2026 22:30:00 +0900

winpodx (0.2.0) unstable; urgency=medium

  * Fixed: oem_runtime_fixes failed on first apply with
    AllowComputerToTurnOffDevice parameter error. v0.1.9.5 still passed
    `$false` instead of the enum string 'Disabled', and virtual NICs
    inside QEMU often don't expose the parameter at all. v0.2.0 wraps
    the call in try/catch and uses the enum form so the apply succeeds
    regardless of NIC topology.
  * Fixed: migrate password-drift probe timed out at 20s. FreeRDP's
    first-contact handshake on a cold pod regularly exceeds 20s; bumped
    probe budget to 60s so genuine drift detection isn't masked by
    cold-start latency.
  * Added: streaming refresh progress. `winpodx app refresh` now emits
    one stderr line per source ("Scanning Registry App Paths…",
    "Scanning UWP / MSIX packages…", etc) instead of hanging silently
    for 30–90s. JSON output stays clean.
  * Added: `winpodx pod multi-session {on|off|status}` — runtime
    toggle for the bundled rdprrap multi-session RDP patch via FreeRDP
    RemoteApp. No container recreate needed.
  * Added: discovery junk filter. Drops uninstallers, redistributables,
    helpers, inbox accessibility tools, system plumbing, and unresolved
    UWP entries (Microsoft.*.BrokerPlugin) from refresh output. Bypass
    with WINPODX_DISCOVERY_INCLUDE_ALL=1 for debugging.
  * Added: GUI app icons. Discovered apps now render their actual
    Windows icon in launcher grid cards and list tiles instead of the
    color+letter avatar. Letter avatar remains as fallback.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Sun, 26 Apr 2026 22:00:00 +0900

winpodx (0.1.9.5) unstable; urgency=high

  * Fixed: BOM in result file caused fake "fail" reports. v0.1.9.4
    PowerShell wrapper used Out-File -Encoding utf8 which writes a BOM;
    host then json.loads with utf-8 codec rejected it. The actual
    registry changes had landed; only the parse failed. Now read with
    utf-8-sig.
  * Fixed: _apply_max_sessions killed its own RDP session by calling
    Restart-Service TermService — the very service hosting the
    FreeRDP RemoteApp running the script. Removed the in-script
    restart; registry write alone is enough, change picks up on next
    natural service cycle.
  * Migrated every remaining host-to-Windows command path off the
    broken podman exec channel: _change_windows_password (password
    rotation), recover_rdp_if_needed (now does container restart),
    sync_windows_time, Windows Update toggle, debloat (CLI + GUI),
    and discover_apps. All six were silent no-ops in releases 0.1.0
    through 0.1.9.4.
  * Added: `winpodx pod sync-password` CLI to recover from password
    drift accumulated under the broken rotation path. Prompts for the
    last-known-working password and resets Windows to match cfg.
  * Added: migrate auto-detects password drift before attempting
    apply, points users at sync-password instead of letting them
    watch all three applies fail confusingly.
  * Added: lint test that fails CI if any future code reintroduces
    the podman-exec-to-powershell pattern outside windows_exec.py.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Sun, 26 Apr 2026 16:00:00 +0900

winpodx (0.1.9.4) unstable; urgency=high

  * Fixed: runtime applies were silent no-ops in v0.1.9.1, v0.1.9.2, and
    v0.1.9.3. `podman exec winpodx-windows ...\powershell.exe` returns
    rc=127 because podman exec runs in the Linux container that hosts
    QEMU, not the Windows VM inside. The helpers logged warnings and
    returned, while `apply_windows_runtime_fixes` reported "ok" because
    the helpers didn't raise. Three previous releases shipped fake
    success.
    - New `core/windows_exec.py`: `run_in_windows(cfg, ps_payload)`
      launches PowerShell as a FreeRDP RemoteApp and pipes the script
      through the `\\tsclient\home` redirection. Wrapper writes
      {rc,stdout,stderr} JSON back via the same share. Channel
      failures (FreeRDP missing, auth fail, timeout, no result file)
      raise WindowsExecError; non-zero script rc surfaces via
      WindowsExecResult.rc.
    - `_apply_max_sessions`, `_apply_rdp_timeouts`, and
      `_apply_oem_runtime_fixes` rewritten to call run_in_windows and
      raise RuntimeError on rc != 0.
    - `apply_windows_runtime_fixes` honest reporting: an actual rc != 0
      now produces "failed: rc=2 ..." instead of fake "ok".

  Cost: ~5-10s per call. Trade-off: works on existing pods (no
  container recreate). Caveat: requires cfg.rdp.password to match the
  Windows guest's actual password — auth fail on first call means user
  has to manually sync via `winpodx app run desktop` + `net user`.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Sun, 26 Apr 2026 14:30:00 +0900

winpodx (0.1.9.3) unstable; urgency=high

  * Fixed: patch-version migrate skipped the Windows-side apply.
    `_version_tuple(...)[:3]` truncated 0.1.9.1 and 0.1.9.2 to the same
    (0, 1, 9) tuple, so migrate exited with "already current" before
    the runtime apply step. Now runs the idempotent apply even on the
    "already current" path so patch-version users still receive fixes
    shipped after their last successful migrate.
  * Added: standalone `winpodx pod apply-fixes` CLI command.
    Idempotent runtime apply with per-helper OK/FAIL output. Exits 0
    on full success, 2 on pod-not-running / backend unsupported, 3 on
    helper failure.
  * Added: "Apply Windows Fixes" button on the GUI Tools page —
    fires the same runtime apply on a worker thread.
  * Added: install.sh auto-invokes `winpodx pod apply-fixes` at the
    end of every install (after migrate). Failure-tolerant; silent
    skip if pod isn't running. Guarantees `curl | bash` always
    delivers the latest Windows-side fixes regardless of migrate's
    version comparison verdict.
  * Added: public `provisioner.apply_windows_runtime_fixes(cfg)` API
    returning a per-helper status dict — single entry point shared by
    CLI / GUI / migrate paths.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Sun, 26 Apr 2026 05:30:00 +0900

winpodx (0.1.9.2) unstable; urgency=high

  * Fixed: Windows-side fixes from v0.1.9 / v0.1.9.1 (NIC power-save off,
    TermService failure recovery, RDP timeout disable, KeepAlive) were
    not reaching existing guests. install.bat only runs on a fresh
    container, and v0.1.9.1's _apply_rdp_timeouts was wired AFTER the
    check_rdp_port early-return in ensure_ready so it never fired on
    healthy pods.
    - ensure_ready now probes pod_status at the top and runs
      _apply_max_sessions, _apply_rdp_timeouts, and the new
      _apply_oem_runtime_fixes BEFORE the RDP early-return.
    - New _apply_oem_runtime_fixes pipes the OEM v7 baseline (NIC
      power-save off + sc.exe failure TermService) to existing guests
      via the same `podman exec` stdin-pipe transport discovery uses.
    - `winpodx migrate` proactively calls all three applies when
      crossing the 0.1.9 version boundary, with pod-state probe and
      an interactive offer to start a stopped pod. Per-helper
      success/failure output so users see exactly what landed.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Sun, 26 Apr 2026 02:30:00 +0900

winpodx (0.1.9.1) unstable; urgency=high

  * Fixed: GUI SEGV when clicking "Refresh Apps" against a pod that
    isn't running. The failure path's QMessageBox construction is now
    deferred via QTimer.singleShot(0, ...) so the queued-signal handler
    frame unwinds before Qt's font-inheritance lookup walks the parent.
    Info page first-fetch deferred out of __init__ for the same reason.
    Info worker class hoisted to module level, busy-state reentrancy
    guard added, worker + QThread both deleteLater'd on completion.
  * Fixed: RDP sessions drop mid-use after host suspend / long idle.
    v0.1.9 Bug B fix only handled "RDP unreachable"; this release
    disables Windows TermService timeouts (MaxIdleTime / Max
    DisconnectionTime / MaxConnectionTime = 0), enables KeepAlive
    every 1 minute, and writes the keys to both the machine-policy
    path and the RDP-Tcp WinStation. install.bat OEM bumps 7 -> 8;
    existing 0.1.x guests get a runtime apply via a new
    `_apply_rdp_timeouts` step in provisioner.ensure_ready (no
    container recreate needed).

 -- Kim DaeHyun <kernalix7@kodenet.io>  Sun, 26 Apr 2026 00:00:00 +0900

winpodx (0.1.9) unstable; urgency=medium

  * Fixed: `winpodx app refresh` on Windows. The 0.1.8 implementation
    used `podman cp host:discover_apps.ps1 container:C:/...`, which
    fails because dockur/windows is a Linux container running the
    Windows guest inside QEMU and the C: drive lives in a virtual disk
    that `podman cp` cannot reach. The script body is now piped via
    `podman exec -i container powershell -Command -` over stdin.
  * Fixed: RDP unreachable after host suspend / long idle. When VNC is
    alive but RDP is not, winpodx now runs `Restart-Service -Force
    TermService` + `w32tm /resync` and re-probes RDP. OEM bundle bumps
    to 7 with preventive `Set-NetAdapterPowerManagement` + `sc.exe
    failure TermService` actions for Windows-side self-recovery.
  * Added: 5-section Info panel for both `winpodx info` and the GUI
    main window — System, Display, Dependencies, Pod (state, uptime,
    RDP/VNC reachability, active session count), Config.
  * Changed: discovery-first refactor — the 14 bundled app profiles
    were dropped. The Linux app menu now populates exclusively from
    `winpodx app refresh`, which `provisioner.ensure_ready` fires
    automatically on first pod boot when the discovered tree is empty.
    Upgrading users get a `winpodx migrate` prompt to remove legacy
    `winpodx-{14-bundled-slugs}.desktop` entries.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Sat, 25 Apr 2026 00:00:00 +0900

winpodx (0.1.8) unstable; urgency=medium

  * Dynamic Windows-app discovery: new `winpodx app refresh` CLI subcommand
    and "Refresh Apps" button on the Qt GUI's Apps page enumerate apps
    installed on the Windows guest (Registry App Paths, Start Menu .lnk,
    UWP/MSIX via AppxManifest, Chocolatey / Scoop shims) and register them
    alongside the 14 bundled profiles. Icons are extracted from the real
    binaries / package logos and written under
    ~/.local/share/winpodx/discovered/<slug>/.
  * UWP RemoteApp launching: rdp.build_rdp_command now accepts a launch_uri
    with strict-regex-validated AUMID and maps UWP apps to
    /app:program:explorer.exe,cmd:shell:AppsFolder\<AUMID>.
  * Post-upgrade migration wizard: `winpodx migrate` subcommand shows per-
    version release notes for every version the user has skipped over and
    can kick off `winpodx app refresh`. install.sh auto-invokes it on
    detected upgrades; opt out with WINPODX_NO_MIGRATE=1.
  * Configurable RemoteApp session cap: pod.max_sessions (clamped [1, 50],
    default 10) is applied to the guest's Terminal Server
    MaxInstanceCount at ensure_ready time. Memory budget warning fires in
    CLI (config show/set, info) and GUI Settings only when the value
    over-subscribes ram_gb — default config stays silent.
  * install.sh offline / air-gapped flags: --source PATH, --image-tar PATH,
    --skip-deps (+ matching WINPODX_* env vars) compose for installs
    without git / registry / package-repo access.
  * Security audit remediation (Wave 2): PNG QImage validation before
    hicolor write, 64 MiB bounded subprocess stdout drain, DiscoveryError
    kind canonicalization, Start Menu .lnk -Depth 8 cap, installed_version
    marker size + regex hardening, launch_uri semantic unification across
    PS code paths, CI persist-credentials:false on discover-apps-ps,
    SECURITY.md Host <-> Guest Trust Model section.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Fri, 25 Apr 2026 00:00:00 +0900

winpodx (0.1.7) unstable; urgency=high

  * Bump bundled rdprrap to v0.1.3 — license-compliance release.
    Upstream withdrew rdprrap 0.1.0 / 0.1.1 / 0.1.2. 0.1.0 / 0.1.1
    lacked the source-level attribution notices required by the
    upstream licenses (stascorp/rdpwrap Apache-2.0, llccd/TermWrap
    MIT, llccd/RDPWrapOffsetFinder MIT); 0.1.2 shipped NOTICE +
    vendor/licenses/ and closed the legal gap but listed only 9 of
    the 16 rdpwrap-derived Rust sources and had an inconsistent
    copyright line in the rdprrap-conf About dialog. 0.1.3 expands
    NOTICE to all 16 sources (grouped by upstream binary:
    RDPWInst / RDPConf / RDPCheck), aligns the About-dialog
    copyright to LICENSE, cites CC BY 4.0 for the adapted
    Contributor Covenant text, and carries forward the 0.1.1
    registry-readback fix (OriginalServiceDll was being saved as
    termsrv.dlll on some hosts, which would have broken rdprrap
    uninstall). New sha256 pinned; OEM version bumped to 6.
  * Document bundled rdprrap in debian/copyright and add a top-level
    THIRD_PARTY_LICENSES.md covering optional Python deps and the
    bundled binary.
  * winpodx 0.1.6 inherited the missing-attribution defect; upgrade to
    0.1.7 so the Windows guest receives the compliant bundle.
  * install.sh: fix BASH_SOURCE[0] unbound-variable abort under the
    curl-pipe-to-bash path (set -u + stdin stream). Fixes GitHub #3.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Thu, 23 Apr 2026 12:00:00 +0900

winpodx (0.1.6) unstable; urgency=medium

  * Bundle rdprrap v0.1.0 and auto-install during the Windows unattended
    setup to enable multi-session RDP, so each RemoteApp window gets its
    own session. Fully offline; sha256-verified against a pin file.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Wed, 22 Apr 2026 09:00:00 +0900

winpodx (0.1.5) unstable; urgency=medium

  * Lower minimum Python requirement to 3.9 (was 3.11) so RHEL 9 / AlmaLinux 9
    / Rocky 9 can install without adding a separate Python module.
  * Add python3-tomli to Depends for the TOML reader fallback on 3.9/3.10.
  * Expand test matrix to Python 3.9 through 3.13.
  * Add AlmaLinux 9 and 10 to the publish matrix.
  * Add Arch Linux AUR publishing infrastructure (activation pending one-time
    maintainer setup; see packaging/aur/README.md).
  * Fix OBS RPM auto-download to correctly pick up newly-published assets.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Tue, 21 Apr 2026 19:00:00 +0900

winpodx (0.1.4) unstable; urgency=medium

  * Fix .deb build aborting with "missing files" during dh_install.
  * OBS publish step tolerates unrelated build-service-side failures on
    architectures outside the target matrix.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Tue, 21 Apr 2026 17:00:00 +0900

winpodx (0.1.3) unstable; urgency=medium

  * Fix OBS publish step looping on authentication errors during build wait.
  * .deb build no longer runs the test suite; tests run upstream in CI.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Tue, 21 Apr 2026 15:00:00 +0900

winpodx (0.1.2) unstable; urgency=medium

  * Fix RPM and .deb publish workflows not running on tag push so their
    artifacts are now correctly attached to the Release.
  * RPM build is resilient to pyproject.toml version being ahead of the
    latest git tag.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Tue, 21 Apr 2026 12:00:00 +0900

winpodx (0.1.1) unstable; urgency=medium

  * Prebuilt packages per Release: RPM (openSUSE Tumbleweed, Leap 15.6/16.0,
    Slowroll, Fedora 42/43) and .deb (Debian 12/13, Ubuntu 24.04/25.04/25.10).
  * AppImage packaging dropped.
  * Install instructions in README cover openSUSE / Fedora / Debian / Ubuntu.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Tue, 21 Apr 2026 00:00:00 +0900

winpodx (0.1.0) unstable; urgency=medium

  * Initial release.

 -- Kim DaeHyun <kernalix7@kodenet.io>  Mon, 20 Apr 2026 00:00:00 +0900
