[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-1284":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":15,"forks30d":15,"starsTrendScore":19,"compositeScore":20,"rankGlobal":9,"rankLanguage":9,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":9,"pushedAt":9,"updatedAt":26,"readmeContent":27,"aiSummary":28,"trendingCount":15,"starSnapshotCount":15,"syncStatus":29,"lastSyncTime":30,"discoverSource":31},1284,"winpodx","kernalix7\u002Fwinpodx","kernalix7","Windows pod system for Linux",null,"Python",935,37,5,41,0,43,148,149,129,98.74,"MIT License",false,"main",true,[],"2026-06-12 04:00:08","\u003Cdiv align=\"center\">\n\n\u003Cimg src=\"CI.svg\" alt=\"winpodx\" width=\"320\">\n\n### Click an app. Word opens. That's it.\n\n\u003Cp>Native Linux windows for every Windows app — real icons, real \u003Ccode>WM_CLASS\u003C\u002Fcode>,\u003Cbr>\npin-to-taskbar. FreeRDP RemoteApp + dockur\u002Fwindows. Zero config.\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode># Latest stable release (default)\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fkernalix7\u002Fwinpodx\u002Fmain\u002Finstall.sh | bash\n\n# Latest main (development)\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fkernalix7\u002Fwinpodx\u002Fmain\u002Finstall.sh | bash -s -- --main\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ca href=\"docs\u002Fimages\u002Fdemo.png\">\n  \u003Cimg src=\"docs\u002Fimages\u002Fdemo.png\" alt=\"winpodx in action — Windows apps as native Linux windows on KDE\" width=\"720\">\n\u003C\u002Fa>\n\n\u003Csub>Windows About \u002F Performance Monitor \u002F PowerShell each in their own Linux window, alongside the winpodx Apps grid.\u003C\u002Fsub>\n\n[![Beta](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fstatus-beta-orange?style=for-the-badge)](#status-beta)\n[![Latest](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002Fkernalix7\u002Fwinpodx?include_prereleases&style=for-the-badge&label=latest&color=2962FF)](https:\u002F\u002Fgithub.com\u002Fkernalix7\u002Fwinpodx\u002Freleases)\n\n[![license](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fkernalix7\u002Fwinpodx?style=flat-square&color=blue)](LICENSE)\n[![python](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fpython-3.9%2B-3776AB?style=flat-square&logo=python&logoColor=white)](https:\u002F\u002Fwww.python.org\u002F)\n[![tests](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Ftests-411-2EA44F?style=flat-square)](#testing)\n[![CI](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002Fkernalix7\u002Fwinpodx\u002Fci.yml?branch=main&style=flat-square&label=CI)](https:\u002F\u002Fgithub.com\u002Fkernalix7\u002Fwinpodx\u002Factions\u002Fworkflows\u002Fci.yml)\n[![stars](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Fkernalix7\u002Fwinpodx?style=flat-square&color=FFD93D&logo=github&logoColor=white)](https:\u002F\u002Fgithub.com\u002Fkernalix7\u002Fwinpodx\u002Fstargazers)\n[![downloads](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fdownloads\u002Fkernalix7\u002Fwinpodx\u002Ftotal?style=flat-square&color=2EA44F)](https:\u002F\u002Fgithub.com\u002Fkernalix7\u002Fwinpodx\u002Freleases)\n\n###### Works on\n\n[![openSUSE](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FopenSUSE-73BA25?style=flat-square&logo=opensuse&logoColor=white)](https:\u002F\u002Fwww.opensuse.org\u002F)\n[![Fedora](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FFedora-294172?style=flat-square&logo=fedora&logoColor=white)](https:\u002F\u002Ffedoraproject.org\u002F)\n[![Debian](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FDebian-A81D33?style=flat-square&logo=debian&logoColor=white)](https:\u002F\u002Fwww.debian.org\u002F)\n[![Ubuntu](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FUbuntu-E95420?style=flat-square&logo=ubuntu&logoColor=white)](https:\u002F\u002Fubuntu.com\u002F)\n[![RHEL family](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FRHEL%20%2F%20Alma%20%2F%20Rocky-EE0000?style=flat-square&logo=redhat&logoColor=white)](https:\u002F\u002Fwww.redhat.com\u002F)\n[![Arch (AUR pending)](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FArch%20(AUR)-pending-lightgrey?style=flat-square&logo=archlinux&logoColor=white)](packaging\u002Faur\u002FREADME.md)\n[![NixOS](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FNixOS-5277C3?style=flat-square&logo=nixos&logoColor=white)](#install)\n\n\u003Csub>**English** &nbsp;·&nbsp; [한국어](docs\u002FREADME.ko.md) &nbsp;·&nbsp; [Quick start](#quick-start) &nbsp;·&nbsp; [Features](#key-features) &nbsp;·&nbsp; [CLI](#cli-reference) &nbsp;·&nbsp; [Multi-session](#multi-session-rdp)\u003C\u002Fsub>\n\n\u003C\u002Fdiv>\n\n---\n\n> ### Status: Beta\n> winpodx is in active development (v0.3.0). v0.3.0 ships a redesigned host→guest pipeline — bearer-authed HTTP agent on `127.0.0.1:8765` is now the default command channel, with FreeRDP RemoteApp kept as fallback. App launches no longer flash a PowerShell window. New `winpodx check` CLI + GUI Health card surface live pod \u002F RDP \u002F agent \u002F round-trip \u002F disk state. First install still takes ~5-10 minutes (Windows VM ISO download + Sysprep + OEM apply); `winpodx pod wait-ready --logs` shows live progress. Please file issues at \u003Chttps:\u002F\u002Fgithub.com\u002Fkernalix7\u002Fwinpodx\u002Fissues> if something breaks.\n\n**No full-screen RDP.** Each Windows app becomes its own Linux window with its real icon — pinnable, alt-tabbable, file-associated. Drop into a full Windows desktop only when you actually want one (`winpodx app run desktop`).\n\nwinpodx runs a Windows container (via [dockur\u002Fwindows](https:\u002F\u002Fgithub.com\u002Fdockur\u002Fwindows)) in the background and presents Windows apps as native Linux applications through FreeRDP RemoteApp, while a bearer-authed HTTP agent inside the guest handles the host→guest command channel without flashing a PowerShell window. No manual VM setup, no ISO downloads, no registry editing. **Near-zero external Python dependencies** (stdlib only on Python 3.11+; one pure-Python `tomli` fallback on 3.9\u002F3.10).\n\n## Why winpodx?\n\nExisting tools for running Windows apps on Linux all have trade-offs:\n\n| | winapps | LinOffice | winboat | winpodx |\n|---|---|---|---|---|\n| Core tech | Any RDP-capable Windows host (cloud \u002F physical \u002F container) + FreeRDP | dockur + FreeRDP | dockur + FreeRDP | dockur (Podman) + FreeRDP + HTTP guest agent |\n| Setup | Manual (shell + config + RDP testing) | One-liner script | One-click GUI installer | **Zero-config** (auto on first launch) |\n| Interface | CLI only | CLI only | Electron GUI | **Qt6 GUI + CLI + tray** |\n| App scope | Any Windows app | Office only | Any Windows app | Any Windows app |\n| Language | Shell (86%) | Shell + Python | TypeScript \u002F Vue \u002F Go | **Python (100%)** |\n| Runtime deps | curl, dialog, git, netcat | Podman, FreeRDP | Electron, Docker\u002FPodman, FreeRDP | **Python 3.9+, FreeRDP, Podman** |\n| Auto suspend \u002F resume | No | No | Not documented | **Yes (idle timeout)** |\n| Password rotation | No | No | Not documented | **Yes (7-day, atomic)** |\n| HiDPI auto-detect | No | No | Not documented | **GNOME, KDE, Sway, Hyprland, Cinnamon, xrdb** |\n| Sound default | No | No | Yes (FreeRDP) | Yes (FreeRDP) |\n| Printer redirection default | No | No | Not documented | Yes (FreeRDP) |\n| USB drive auto-mapping | No | No | Smartcard passthrough | **Drive subfolders → drive letters via FileSystemWatcher** |\n| Discovery (auto-scan installed apps) | No | No | Yes | **Yes (Registry + Start Menu + UWP + choco\u002Fscoop)** |\n| Multi-session RDP | No | No | Not documented | **Yes (bundled rdprrap, up to 10)** |\n| Offline \u002F air-gapped install | No | No | No | **Yes (`--source` + `--image-tar`)** |\n| License | MIT | AGPL-3.0 | MIT | MIT |\n\n> winboat is the closest peer in scope and was an inspiration. We focus on a different mix — stdlib-leaning Python + Qt6 instead of Electron, deeper auto-config (auto suspend, 7-day password rotation, multi-DE HiDPI), and an explicit air-gapped install path. Both projects build on dockur\u002Fwindows; that ecosystem is bigger than any one app.\n\n## winpodx vs Wine\n\n**winpodx is not a Wine replacement.** Wine translates Windows API calls; winpodx runs the actual Windows OS in a container. The two solve different problems and many users have both installed.\n\n| When you need... | Use |\n|---|---|\n| Older Win32 apps, indie games, lightweight utilities | **Wine \u002F Bottles \u002F Lutris** |\n| GPU-accelerated games \u002F 3D apps (DirectX 9 – 12) | **Wine** — DXVK \u002F VKD3D give near-native frame rates. winpodx has no GPU passthrough by default; QEMU CPU rendering is much slower. (GPU passthrough via VFIO is a manual bring-your-own setup — not yet packaged.) |\n| Microsoft 365 with full Outlook + Teams + OneDrive integration | **winpodx** |\n| Adobe Creative Suite (Photoshop, Illustrator, Premiere, Lightroom) | winpodx — but heavy GPU effects will be CPU-bound (see GPU row above) |\n| Anti-cheat games (Valorant, EAC, BattlEye) | **TBD** — anti-cheats vary by VM-detection policy (Vanguard needs TPM 2.0 + no hypervisor, EAC mostly blocks VMs, VAC is lenient). Test before committing. |\n| DRM-heavy software \u002F hardware dongle apps | **winpodx** |\n| Apps that ship kernel-mode drivers (some VPNs, security suites) | **winpodx** |\n| Banking \u002F tax \u002F government tools with regional certificates | **winpodx** |\n| Visual Studio, WinUI 3 \u002F WinRT, .NET features Wine hasn't caught up to | **winpodx** |\n| IE-only legacy enterprise web apps | **winpodx** |\n| Anything where \"mostly works\" isn't acceptable | **winpodx** |\n\nWine wins on speed and on GPU when DXVK\u002FVKD3D translate cleanly. winpodx wins on **100% Windows feature parity** for everything else — every app runs on a real Windows kernel, rendered into your Linux desktop as a native window via FreeRDP RemoteApp.\n\n## Key Features\n\n\u003Ctable>\n\u003Ctr>\u003Ctd width=\"50%\">\n\n**Seamless App Windows**\n- RemoteApp (RAIL) renders each app as a native Linux window (no full desktop)\n- Per-app taskbar icons via `WM_CLASS` matching (`\u002Fwm-class:\u003Cstem>` + `StartupWMClass`)\n- File associations: double-click `.docx` in your file manager → Word opens\n- Multi-session RDP: bundled rdprrap auto-enables up to 10 independent sessions\n- RAIL prerequisites (`fDisabledAllowList=1` + `fInheritInitialProgram=1` + `MaxInstanceCount=10`) are set automatically during unattended install\n\n\u003C\u002Ftd>\u003Ctd width=\"50%\">\n\n**Zero-Config Launch**\n- First app click auto-provisions everything: config, container, desktop entries\n- **Auto-discovery on first boot** — winpodx scans the running Windows guest and registers every installed app (Registry App Paths, Start Menu, UWP\u002FMSIX, Chocolatey, Scoop) with the real binary's icon\n- Manual rescan any time via `winpodx app refresh` or the GUI Refresh button\n- Interactive setup wizard for advanced configuration\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd width=\"50%\">\n\n**Peripherals & Sharing**\n- **Clipboard**: Bidirectional copy-paste (text + images) enabled by default\n- **Sound**: RDP audio streaming (`\u002Fsound:sys:alsa`) enabled by default\n- **Printer**: Linux printers shared to Windows via RDP redirection (default)\n- **USB drives**: Linux mount tree shared as `\\\\tsclient\\media`; drives plugged after session start are still accessible as subfolders\n- **USB drive auto-mapping**: Windows-side FileSystemWatcher script auto-maps `\\\\tsclient\\media\\\u003CUSB>` subfolders to drive letters (E:, F:, ...)\n- **USB device passthrough**: `\u002Fusb:auto` is allowlisted but **not enabled by default** — opt in via `extra_flags` if your FreeRDP build ships the urbdrc plugin\n- **Home directory**: Shared as `\\\\tsclient\\home` (default)\n- **Desktop shortcuts**: Windows desktop auto-populated with `\\\\tsclient\\home` (\"Home\") and `\\\\tsclient\\media` (\"USB\") shortcuts during first boot\n\n**GPU acceleration:** not yet supported. dockur\u002Fwindows runs under QEMU\u002FKVM with software graphics — DirectX-heavy games and 3D apps will be CPU-bound. GPU passthrough via VFIO is feasible but not packaged. (See [winpodx vs Wine](#winpodx-vs-wine) — Wine + DXVK is the right tool when you need GPU.)\n\n\u003C\u002Ftd>\u003Ctd width=\"50%\">\n\n**Automation & Security**\n- Auto suspend\u002Fresume: container pauses when idle, resumes on next launch\n- Password auto-rotation: 20-char cryptographic password, 7-day cycle with rollback\n- Smart DPI scaling: auto-detects from GNOME, KDE, Sway, Hyprland, Cinnamon, xrdb\n- Qt6 system tray + full Qt6 main window (Apps \u002F Settings \u002F Tools \u002F Terminal pages)\n- Multi-backend: Podman (default), Docker, libvirt\u002FKVM, manual RDP\n- Windows build pinned to 11 25H2 (`TargetReleaseVersionInfo=25H2`, 365-day feature-update defer)\n- Windows debloat: disable telemetry, ads, Cortana, search indexing, services (DiagTrack \u002F dmwappushservice \u002F WSearch \u002F SysMain)\n- High-performance power plan + hibernation off + tzutil UTC + Cloudflare DNS\n- Time sync: force Windows clock resync after host sleep\u002Fwake\n- FreeRDP `extra_flags` allowlist (regex-validated) as the user-input safety boundary\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n## How It Works\n\n```\n                     ┌─────────────────────────────┐\n  Click \"Word\"       │     Linux Desktop (KDE,     │\n  in app menu  ───>  │     GNOME, Sway, ...)       │\n                     └──────────────┬──────────────┘\n                                    │\n                     ┌──────────────▼──────────────┐\n                     │         winpodx             │\n                     │  ┌─────────────────────┐    │\n                     │  │ auto-provision:     │    │\n                     │  │  config → password  │    │\n                     │  │  → container → RDP  │    │\n                     │  │  → desktop entries  │    │\n                     │  └─────────────────────┘    │\n                     └──────────────┬──────────────┘\n                                    │ FreeRDP RemoteApp\n                     ┌──────────────▼──────────────┐\n                     │   Windows Container (Podman)│\n                     │   ┌──────────────────────┐  │\n                     │   │  Word  Excel  PPT ...│  │\n                     │   │ multi-session\u002Frdprrap│  │\n                     │   └──────────────────────┘  │\n                     │   127.0.0.1:3390 (TLS)      │\n                     └─────────────────────────────┘\n```\n\n## GUI\n\nLaunch with `winpodx gui`. The Qt6 main window has four pages:\n\n| Page | What it does |\n|------|--------------|\n| **Apps** | Grid \u002F list view of installed app profiles, search + category filter, per-app launch with 3s cooldown, Add \u002F Edit \u002F Delete app profile dialogs |\n| **Settings** | RDP (user \u002F IP \u002F port \u002F scale \u002F DPI \u002F password rotation) and Container (backend \u002F CPU \u002F RAM \u002F idle timeout) in one screen |\n| **Tools** | Suspend \u002F Resume \u002F Full Desktop buttons, Clean Locks \u002F Sync Time \u002F Debloat, and a one-click Windows Update **enable \u002F disable** toggle |\n| **Terminal** | Embedded shell limited to a command allowlist (`podman`, `docker`, `virsh`, `winpodx`, `xfreerdp`, `systemctl`, `journalctl`, `ss`, `ip`, `ping`, ...) with quick buttons (Status \u002F Logs \u002F Inspect \u002F RDP Test \u002F Clear) |\n| **Info** | Live **Health** card (pod \u002F RDP \u002F agent \u002F OEM \u002F disk \u002F password age \u002F app count) + System \u002F Display \u002F Dependencies \u002F Pod \u002F Config snapshot |\n\nThe system tray (`winpodx tray`) is a lighter-weight alternative — pod controls, app launcher submenu (top 20 + Full Desktop), maintenance submenu (Clean Locks \u002F Sync Time \u002F Suspend), and an optional idle-monitor thread.\n\n### Health checks\n\n`winpodx check` runs every probe used by the GUI Health card and prints a one-line verdict for each:\n\n```\n=== winpodx check ===\n\n  [OK  ] pod_running        running (ip=127.0.0.1)  (58ms)\n  [OK  ] rdp_port           127.0.0.1:3390 reachable  (0ms)\n  [OK  ] agent_health       version=0.2.2-rev4  (63ms)\n  [OK  ] oem_version        bundle=12  (3ms)\n  [OK  ] password_age       7d remaining (max_age=7d)  (0ms)\n  [OK  ] apps_discovered    41 app(s) in \u002Fhome\u002F...\u002Fdiscovered  (3ms)\n  [OK  ] disk_free          401.0\u002F3725 GiB free  (0ms)\n\nOverall: OK\n```\n\nStatus legend: `OK` (green) \u002F `WARN` (yellow — informational, exit 0) \u002F `FAIL` (red — exit 1) \u002F `SKIP` (grey — disabled by config). Use `--json` for machine-readable output.\n\n## Tech Stack\n\n| Layer | Technology |\n|-------|------------|\n| Language | Python 3.9+ (stdlib only on 3.11+; `tomli` fallback on 3.9\u002F3.10) |\n| CLI | argparse (stdlib) |\n| GUI (optional) | PySide6 (Qt6) |\n| Config | TOML (stdlib `tomllib` on 3.11+ \u002F `tomli` on 3.9\u002F3.10; built-in writer) |\n| RDP | FreeRDP 3+ (xfreerdp, RemoteApp\u002FRAIL) |\n| Guest agent | PowerShell `HttpListener` on `127.0.0.1:8765` (bearer auth, base64-encoded `\u002Fexec` payloads) |\n| Container | Podman \u002F Docker ([dockur\u002Fwindows](https:\u002F\u002Fgithub.com\u002Fdockur\u002Fwindows)) |\n| VM | libvirt \u002F KVM |\n| CI | GitHub Actions (lint + test on 3.9-3.13 + pip-audit) |\n\n## Quick Start\n\n### Install\n\n**One-line install** (any supported Linux distro):\n\n```bash\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fkernalix7\u002Fwinpodx\u002Fmain\u002Finstall.sh | bash\n```\n\nDetects your distro, installs missing system dependencies (Podman, FreeRDP,\nKVM, Python 3.9+) with your confirmation, drops winpodx into\n`~\u002F.local\u002Fbin\u002Fwinpodx-app\u002F`. The Windows-app menu populates automatically\nthe first time the pod boots — discovery scans your running Windows guest\nand registers every installed app with its real icon. No root required\nexcept for the dependency install step. Works on\nopenSUSE, Fedora, Debian\u002FUbuntu, RHEL-family, and Arch.\n\nBy default the installer pins to the **latest published GitHub release**\n(currently `v0.1.9`). Pre-release \u002F development versions stay opt-in.\n\n**Choose a version** — pass `--main` (or `--ref TAG`) for development\nbuilds, otherwise stick with the default release:\n\n```bash\n# Install the latest stable release (default)\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fkernalix7\u002Fwinpodx\u002Fmain\u002Finstall.sh | bash\n\n# Install the latest main HEAD (development; may be unstable)\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fkernalix7\u002Fwinpodx\u002Fmain\u002Finstall.sh | bash -s -- --main\n\n# Install a specific tag, branch, or commit\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fkernalix7\u002Fwinpodx\u002Fmain\u002Finstall.sh | bash -s -- --ref v0.1.9\n\n# Env-var equivalent (works under curl | bash without -s --)\nWINPODX_REF=main  curl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fkernalix7\u002Fwinpodx\u002Fmain\u002Finstall.sh | bash\nWINPODX_REF=v0.1.9 curl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fkernalix7\u002Fwinpodx\u002Fmain\u002Finstall.sh | bash\n```\n\n**Offline \u002F air-gapped install** — the installer takes three optional flags\nfor machines with no registry \u002F package-repo access:\n\n```bash\n# Copy winpodx from a local clone instead of git clone (also env: WINPODX_SOURCE)\n.\u002Finstall.sh --source \u002Fmedia\u002Fusb\u002Fwinpodx\n\n# Preload the Windows image tar instead of fetching at first boot (env: WINPODX_IMAGE_TAR)\n.\u002Finstall.sh --image-tar \u002Fmedia\u002Fusb\u002Fwindows-image.tar\n\n# Skip distro package install (env: WINPODX_SKIP_DEPS=1) — fails early if deps aren't present\n.\u002Finstall.sh --skip-deps\n\n# Everything at once:\n.\u002Finstall.sh --source \u002Fmedia\u002Fusb\u002Fwinpodx --image-tar \u002Fmedia\u002Fusb\u002Fwindows-image.tar --skip-deps\n```\n\nEnv vars are honored even under `curl | bash`, so\n`WINPODX_SKIP_DEPS=1 curl ... | bash` works.\n\n**Nix** — a flake is provided for NixOS \u002F nix-on-any-distro users:\n\n```bash\n# Run directly without installing\nnix run github:kernalix7\u002Fwinpodx\n\n# Install into your profile\nnix profile install github:kernalix7\u002Fwinpodx\n\n# As a flake input\ninputs.winpodx.url = \"github:kernalix7\u002Fwinpodx\";\n```\n\nThe wrapper bundles FreeRDP, podman \u002F podman-compose, iproute2 and\nlibnotify, so the default podman backend works out of the box. The\ndocker and libvirt backends still require the respective tools to be\npresent on the host.\n\n**One-line uninstall** — `--confirm` or `--purge` is required under pipe\n(the interactive prompts can't read from a terminal while bash consumes\nstdin from curl):\n\n```bash\n# Remove winpodx files, keep the Windows container + its data\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fkernalix7\u002Fwinpodx\u002Fmain\u002Funinstall.sh | bash -s -- --confirm\n\n# Full wipe: container, volume, config, launcher, everything\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fkernalix7\u002Fwinpodx\u002Fmain\u002Funinstall.sh | bash -s -- --purge\n```\n\nPrefer a native package manager? Prebuilt RPM \u002F `.deb` \u002F AUR packages are\nattached to every [GitHub Release](https:\u002F\u002Fgithub.com\u002Fkernalix7\u002Fwinpodx\u002Freleases\u002Flatest)\n— openSUSE\u002FFedora RPMs from the\n[openSUSE Build Service (`home:Kernalix7\u002Fwinpodx`)](https:\u002F\u002Fbuild.opensuse.org\u002Fpackage\u002Fshow\u002Fhome:Kernalix7\u002Fwinpodx),\nthe rest from GitHub Actions:\n\n**openSUSE Tumbleweed \u002F Leap 15.6 \u002F Leap 16.0 \u002F Slowroll**\n\n```bash\nsudo zypper addrepo \\\n  https:\u002F\u002Fdownload.opensuse.org\u002Frepositories\u002Fhome:\u002FKernalix7\u002FopenSUSE_Tumbleweed\u002Fhome:Kernalix7.repo\nsudo zypper refresh\nsudo zypper install winpodx\n```\n\nReplace `openSUSE_Tumbleweed` with `openSUSE_Leap_16.0`, `openSUSE_Leap_15.6`,\nor `openSUSE_Slowroll` as needed.\n\n**Fedora 42 \u002F 43**\n\n```bash\nsudo dnf config-manager --add-repo \\\n  https:\u002F\u002Fdownload.opensuse.org\u002Frepositories\u002Fhome:\u002FKernalix7\u002FFedora_43\u002Fhome:Kernalix7.repo\nsudo dnf install winpodx\n```\n\n**Debian 12 \u002F 13, Ubuntu 24.04 \u002F 25.04 \u002F 25.10**\n\nDownload the matching `.deb` from the\n[latest release](https:\u002F\u002Fgithub.com\u002FKernalix7\u002Fwinpodx\u002Freleases\u002Flatest) and\ninstall:\n\n```bash\nsudo apt install .\u002Fwinpodx_\u003Cversion>_all_debian13.deb   # pick your flavor\n```\n\n**AlmaLinux \u002F Rocky \u002F RHEL 9 & 10**\n\nEPEL is required on el9 for `python3-tomli`. Download the matching `.rpm`\nfrom the [latest release](https:\u002F\u002Fgithub.com\u002FKernalix7\u002Fwinpodx\u002Freleases\u002Flatest)\nand install:\n\n```bash\nsudo dnf install epel-release                     # el9 only\nsudo dnf install .\u002Fwinpodx-\u003Cversion>-1.noarch.el9.rpm   # or .el10.rpm\n```\n\n**Arch Linux (AUR)**\n\n> Note: AUR publishing is wired up but pending a one-time maintainer setup\n> (see [`packaging\u002Faur\u002FREADME.md`](packaging\u002Faur\u002FREADME.md)). Once activated,\n> tag pushes publish automatically.\n\n```bash\nyay -S winpodx        # or:\nparu -S winpodx\n```\n\n**From source (development)**\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fkernalix7\u002Fwinpodx.git\ncd winpodx\n.\u002Finstall.sh\n```\n\nThe source installer automatically:\n1. Detects your distro (openSUSE, Fedora, Ubuntu, Arch, ...)\n2. Installs missing dependencies (Podman, FreeRDP, KVM), asks before installing\n3. Copies winpodx to `~\u002F.local\u002Fbin\u002Fwinpodx-app\u002F`\n4. Creates config and compose.yaml\n5. Auto-discovery (`winpodx app refresh`) fires on first pod boot to populate the menu\n\n### Launch\n\n```bash\nwinpodx app run word              # Launch Word\nwinpodx app run word ~\u002Fdoc.docx   # Open a file\nwinpodx app run desktop           # Full Windows desktop\n```\n\nOr just click an app icon in your menu.\n\n### Manual Run (no install)\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fkernalix7\u002Fwinpodx.git\ncd winpodx\nexport PYTHONPATH=\"$PWD\u002Fsrc\"\npython3 -m winpodx app run word\n```\n\n---\n\n## CLI Reference\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>Click to expand full CLI reference\u003C\u002Fb>\u003C\u002Fsummary>\n\n```bash\n# Apps\nwinpodx app list                  # List available apps\nwinpodx app run word              # Launch Word (auto-provisions on first run)\nwinpodx app run word ~\u002Fdoc.docx   # Open a file in Word\nwinpodx app run desktop           # Full Windows desktop session\nwinpodx app install-all           # Register all apps in desktop menu\nwinpodx app sessions              # Show active sessions\nwinpodx app kill word             # Kill an active session\n\n# Pod management\nwinpodx pod start --wait          # Start and wait for RDP readiness\nwinpodx pod stop                  # Stop (warns about active sessions)\nwinpodx pod status                # Status with session count\nwinpodx pod restart\nwinpodx pod apply-fixes           # Re-apply Windows-side runtime fixes (idempotent)\nwinpodx pod sync-password         # Recover from password drift (cfg ↔ Windows)\nwinpodx pod multi-session on      # Toggle bundled rdprrap multi-session RDP\nwinpodx pod multi-session status\nwinpodx pod wait-ready --logs     # Wait for Windows first-boot with progress + container logs\n\n# Power management\nwinpodx power --suspend           # Pause container (free CPU, keep memory)\nwinpodx power --resume            # Resume paused container\n\n# Security\nwinpodx rotate-password           # Rotate Windows RDP password\n\n# Maintenance\nwinpodx cleanup                   # Remove Office lock files (~$*.*)\nwinpodx timesync                  # Force Windows time synchronization\nwinpodx debloat                   # Disable telemetry, ads, bloat\nwinpodx uninstall                 # Remove winpodx files (keeps container)\nwinpodx uninstall --purge         # Remove everything including config\n\n# System\nwinpodx setup                     # Interactive setup wizard\nwinpodx info                      # Display, dependencies, config diagnostics\nwinpodx check                     # Run all health probes (pod \u002F RDP \u002F agent \u002F disk \u002F …)\nwinpodx check --json              # Same probes, machine-readable JSON\nwinpodx gui                       # Launch Qt6 main window (Apps \u002F Settings \u002F Tools \u002F Terminal)\nwinpodx tray                      # Launch Qt system tray icon\nwinpodx config show               # Show current config\nwinpodx config set rdp.scale 140  # Change a config value\nwinpodx config import             # Import existing winapps.conf\n```\n\n\u003C\u002Fdetails>\n\n## Peripherals & Sharing\n\n| Feature | How it works | Default |\n|---------|-------------|---------|\n| **Clipboard** | Bidirectional copy-paste via RDP (`+clipboard`) | Enabled |\n| **Sound** | Audio streaming via ALSA (`\u002Fsound:sys:alsa`) | Enabled |\n| **Printer** | Linux printers shared to Windows (`\u002Fprinter`) | Enabled |\n| **Home directory** | Shared as `\\\\tsclient\\home` (`+home-drive`) | Enabled |\n| **USB drives** | Media folder shared as `\\\\tsclient\\media` (`\u002Fdrive:media`); USB drives plugged in after session start are accessible as subfolders | Enabled |\n| **USB device passthrough** | Native USB redirection (`\u002Fusb:auto`) — requires FreeRDP urbdrc plugin | **Opt-in** (add to `extra_flags`) |\n| **USB drive mapping** | Windows-side script auto-maps USB subfolders to drive letters (E:, F:, ...) via FileSystemWatcher | Enabled |\n\n### USB Drive Flow\n\n```\nPlug in USB on Linux\n    │\n    ▼\nLinux mounts to \u002Frun\u002Fmedia\u002F$USER\u002FUSBNAME\n    │\n    ▼\nFreeRDP shares as \\\\tsclient\\media\\USBNAME\n    │\n    ▼\nmedia_monitor.ps1 detects → net use E: \\\\tsclient\\media\\USBNAME\n    │\n    ▼\nWindows Explorer shows E: drive\n```\n\n## Configuration\n\nConfig file: `~\u002F.config\u002Fwinpodx\u002Fwinpodx.toml` (auto-created, 0600 permissions)\n\n```toml\n[rdp]\nuser = \"User\"\npassword = \"\"                # Auto-generated random password\npassword_updated = \"\"        # ISO 8601 timestamp\npassword_max_age = 7         # Days before auto-rotation (0 = disable)\nip = \"127.0.0.1\"\nport = 3390\nscale = 100                  # Auto-detected from your DE\ndpi = 0                      # Windows DPI % (0 = auto)\nextra_flags = \"\"             # Additional FreeRDP flags (allowlisted)\n\n[pod]\nbackend = \"podman\"\nwin_version = \"11\"                               # 11 | 10 | ltsc10 | tiny11 | tiny10\ncpu_cores = 4\nram_gb = 4\nvnc_port = 8007\nauto_start = true                                # Start pod automatically when launching an app\nidle_timeout = 0                                 # Seconds before auto-suspend (0 = disabled)\nboot_timeout = 300                               # Seconds to wait for first-boot unattended install\nimage = \"docker.io\u002Fdockurr\u002Fwindows:latest\"          # Container image (override for air-gapped mirror)\ndisk_size = \"64G\"                                # Virtual disk size passed to dockur\n```\n\n## App Profiles\n\nApp profiles are **metadata only**: they describe where a Windows app lives so winpodx can launch it through FreeRDP RemoteApp. The actual Windows application must be installed inside the Windows container.\n\n### Auto-discovery (default)\n\nStarting from v0.1.9 winpodx ships **no curated profile list**. The first time the Windows pod boots, the provisioner runs `winpodx app refresh` and that scans the running guest:\n\n- Registry `App Paths` (`HKLM` + `HKCU`)\n- Start Menu `.lnk` recursion (depth-capped)\n- UWP \u002F MSIX packages via `Get-AppxPackage` + `AppxManifest.xml`\n- Chocolatey + Scoop shims\n\nFor each result it extracts the icon directly from the binary (or the package's logo asset for UWP) and writes the entry to `~\u002F.local\u002Fshare\u002Fwinpodx\u002Fdiscovered\u002F\u003Cslug>\u002F`. Re-run any time:\n\n```bash\nwinpodx app refresh        # CLI\n# or click \"Refresh Apps\" on the GUI Apps page\n```\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>Adding a custom app profile manually\u003C\u002Fb>\u003C\u002Fsummary>\n\nUser-authored profiles live under `~\u002F.local\u002Fshare\u002Fwinpodx\u002Fapps\u002F` and override anything discovery finds with the same `name`:\n\n```bash\nmkdir -p ~\u002F.local\u002Fshare\u002Fwinpodx\u002Fapps\u002Fmyapp\ncat > ~\u002F.local\u002Fshare\u002Fwinpodx\u002Fapps\u002Fmyapp\u002Fapp.toml \u003C\u003C 'EOF'\nname = \"myapp\"\nfull_name = \"My Application\"\nexecutable = \"C:\\\\Program Files\\\\MyApp\\\\myapp.exe\"\ncategories = [\"Utility\"]\nmime_types = []\nEOF\n\nwinpodx app install myapp   # Register in desktop menu\n```\n\n\u003C\u002Fdetails>\n\n## Multi-Session RDP\n\nStock Windows Desktop editions limit RDP to one session per user; a second app\nwould otherwise reconnect and steal the first session. winpodx bundles\n[rdprrap](https:\u002F\u002Fgithub.com\u002Fkernalix7\u002Frdprrap) — a Rust reimplementation of\nRDPWrap — inside the package itself and installs it automatically during the\nWindows unattended install, so each RemoteApp window gets its own independent\nsession.\n\n**RAIL prerequisites.** RemoteApp itself requires three registry settings that\nwinpodx applies during unattended setup: `fDisabledAllowList=1` (enables\nRemoteApp publishing), `fInheritInitialProgram=1` (required for\n`\u002Fapp:program:...` to launch the target executable instead of a shell), and\n`MaxInstanceCount=10` paired with `fSingleSessionPerUser=0` (lifts the\nsingle-session cap up to 10 concurrent RemoteApp windows). These are set\nregardless of whether rdprrap installs successfully — rdprrap is what makes\nthe sessions *independent*, but the registry keys are what make RemoteApp\nwork at all. After rdprrap install `TermService` is cycled so the wrapper\nDLL activates without a reboot.\n\n**Authentication channel.** NLA is disabled (`UserAuthentication=0`) so the\nFreeRDP command line can authenticate unattended from under\n`podman unshare --rootless-netns`, but `SecurityLayer=2` keeps the RDP\nchannel itself encrypted with TLS (so `\u002Fsec:tls \u002Fcert:ignore` against\n`127.0.0.1` is the full authenticated + encrypted path — no cleartext on the\nwire even though NLA is off).\n\n**Works fully offline.** The rdprrap zip ships inside winpodx's data directory\n(`config\u002Foem\u002F`) and is staged into `C:\\OEM\\` during the guest's first boot.\nsha256 is verified against a pin file before extraction. No network access is\nrequired at install time.\n\nInstall is one-shot: the patch is applied during dockur's unattended setup\nphase. If anything in that step fails (hash mismatch, extraction, installer\nerror), winpodx logs a warning and the guest stays in single-session mode —\napp launch never blocks on this step. A guest-side management channel\n(enable\u002Fdisable\u002Fstatus after install) is planned for a later release.\n\n## Install \u002F Uninstall\n\n```bash\n# From a cloned repo:\n.\u002Finstall.sh                # Install (detects distro, installs deps, registers apps)\n.\u002Funinstall.sh              # Uninstall (interactive, asks before each step)\n.\u002Funinstall.sh --confirm    # Uninstall (auto, keeps config)\n.\u002Funinstall.sh --purge      # Uninstall (removes everything including config)\n\n# Or one-liner (no clone needed):\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fkernalix7\u002Fwinpodx\u002Fmain\u002Finstall.sh   | bash\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fkernalix7\u002Fwinpodx\u002Fmain\u002Funinstall.sh | bash -s -- --confirm\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fkernalix7\u002Fwinpodx\u002Fmain\u002Funinstall.sh | bash -s -- --purge\n```\n\n**Uninstall only removes winpodx files.** It never touches:\n- Your Podman containers\u002Fvolumes (Windows VM data)\n- System packages (podman, freerdp, python3)\n- Your home directory files\n\n## Project Structure\n\n```\nwinpodx\u002F\n├── install.sh             # One-line installer (no pip)\n├── uninstall.sh           # Clean uninstaller\n├── src\u002Fwinpodx\u002F\n│   ├── cli\u002F               # argparse commands (app, pod, config, setup, ...)\n│   ├── core\u002F              # Config, RDP, pod lifecycle, provisioner, daemon\n│   ├── backend\u002F           # Podman, Docker, libvirt, manual\n│   ├── desktop\u002F           # .desktop entries, icons, MIME, tray, notifications\n│   ├── display\u002F           # X11\u002FWayland detection, DPI scaling\n│   ├── gui\u002F               # Qt6 main window, app dialog, theme\n│   └── utils\u002F             # XDG paths, deps, TOML writer, winapps compat\n├── data\u002F                  # winpodx GUI desktop entry + icon + config example\n├── config\u002Foem\u002F            # Windows OEM scripts (post-install)\n├── scripts\u002Fwindows\u002F       # PowerShell scripts (debloat, time sync, USB mapping, app discovery)\n├── .github\u002Fworkflows\u002F     # CI: lint + test + upstream update checker\n└── tests\u002F                 # pytest test suite (411 tests)\n```\n\n## Supported Distros\n\n| Distro | Package Manager | Status |\n|--------|----------------|--------|\n| openSUSE Tumbleweed\u002FLeap | zypper | Tested |\n| Fedora \u002F RHEL \u002F CentOS | dnf | Supported |\n| Ubuntu \u002F Debian \u002F Mint | apt | Supported |\n| Arch \u002F Manjaro | pacman | Supported |\n\n## Testing\n\n```bash\n# From repo root (no install needed)\nexport PYTHONPATH=\"$PWD\u002Fsrc\"\npython3 -m pytest tests\u002F -v    # 411 tests\nruff check src\u002F tests\u002F         # Lint\n```\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and workflow.\n\n## Releasing & Packaging\n\nEach tag push (`v*.*.*`) publishes to all supported channels automatically:\n\n| Channel | Distros |\n|---------|---------|\n| RPM (openSUSE \u002F Fedora \u002F Slowroll) | Tumbleweed, Leap 15.6, Leap 16.0, Slowroll, Fedora 42\u002F43 |\n| RPM (RHEL-family) | AlmaLinux 9 \u002F 10 (also covers RHEL, Rocky, Oracle Linux 9\u002F10) |\n| `.deb` | Debian 12 \u002F 13, Ubuntu 24.04 \u002F 25.04 \u002F 25.10 |\n| AUR | Arch Linux (once activated — see [`packaging\u002Faur\u002FREADME.md`](packaging\u002Faur\u002FREADME.md)) |\n| `sdist` + `wheel` | PyPI-compatible source\u002Fbinary distributions |\n\nMaintainer setup for each channel lives under [`packaging\u002F`](packaging\u002F):\n\n- [`packaging\u002Fobs\u002FREADME.md`](packaging\u002Fobs\u002FREADME.md) — openSUSE Build Service (RPM family).\n- [`packaging\u002Faur\u002FREADME.md`](packaging\u002Faur\u002FREADME.md) — Arch User Repository.\n- Debian\u002FUbuntu and AlmaLinux builds are self-contained in their respective GitHub Actions workflows and need no external setup.\n\n## Security\n\nFor security issues, follow the process in [SECURITY.md](SECURITY.md).\n\n## Star History\n\n\u003Ca href=\"https:\u002F\u002Fstar-history.com\u002F#kernalix7\u002Fwinpodx&Date\">\n  \u003Cpicture>\n    \u003Csource media=\"(prefers-color-scheme: dark)\" srcset=\"https:\u002F\u002Fapi.star-history.com\u002Fsvg?repos=kernalix7\u002Fwinpodx&type=Date&theme=dark\" \u002F>\n    \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"https:\u002F\u002Fapi.star-history.com\u002Fsvg?repos=kernalix7\u002Fwinpodx&type=Date\" \u002F>\n    \u003Cimg alt=\"Star History Chart\" src=\"https:\u002F\u002Fapi.star-history.com\u002Fsvg?repos=kernalix7\u002Fwinpodx&type=Date\" \u002F>\n  \u003C\u002Fpicture>\n\u003C\u002Fa>\n\n## Support \u002F 후원\n\nIf winpodx makes your Linux desktop a little nicer:\n\n[![Ko-fi](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FKo--fi-F16061?logo=ko-fi&logoColor=white&style=for-the-badge)](https:\u002F\u002Fko-fi.com\u002Fkernalix7)\n[![Fairy](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F🧚_Fairy-EE6E73?style=for-the-badge&logoColor=white)](https:\u002F\u002Ffairy.hada.io\u002F@kernalix7)\n\nKo-fi for international card \u002F PayPal payments; fairy.hada.io 는 국내 결제용.\nBug reports, PRs, and stars on the repo are equally appreciated and free —\n버그 리포트, PR, 별점도 환영합니다.\n\n## License\n\n[MIT](LICENSE) - Kim DaeHyun (kernalix7@kodenet.io)\n","winpodx 是一个让 Windows 应用程序能够在 Linux 系统中以原生窗口形式运行的项目。它通过 FreeRDP RemoteApp 和 dockur\u002Fwindows 技术，实现了 Windows 应用在 Linux 桌面上的无缝集成，包括真实的应用图标、WM_CLASS 支持以及任务栏固定功能，且无需任何配置即可使用。该项目采用 Python 3.9+ 开发，并提供了简单的安装脚本供用户快速部署。winpodx 特别适用于需要在 Linux 环境下运行特定 Windows 软件的开发者或用户，目前支持包括 openSUSE、Fedora、Debian、Ubuntu 等主流 Linux 发行版。",2,"2026-06-11 02:42:49","CREATED_QUERY"]