Files
wehub-resource-sync 3e779be6f3
CI / test (3.14, ubuntu-24.04-arm) (push) Waiting to run
CI / lint (push) Failing after 13m4s
CI / test (3.11, ubuntu-latest) (push) Failing after 2m4s
CI / test (3.13, ubuntu-latest) (push) Successful in 13m30s
CI / test (3.14, ubuntu-latest) (push) Successful in 17m21s
CI / test (3.12, ubuntu-latest) (push) Successful in 17m55s
CI / discover-apps-ps (push) Successful in 1m56s
CI / test (3.9, ubuntu-latest) (push) Successful in 13m17s
CI / test (3.10, ubuntu-latest) (push) Successful in 26m21s
CI / audit (push) Successful in 13m38s
Deploy site / deploy (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:32:37 +08:00

206 lines
18 KiB
HTML

<!DOCTYPE html>
<!-- SPDX-License-Identifier: MIT — winpodx.org/features. No trackers. -->
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Features — WinPodX</title>
<meta name="description" content="WinPodX features: seamless RemoteApp windows, URL-scheme link handling, reverse-open, zero-config discovery, peripherals, multi-session RDP, automation & resilience.">
<link rel="icon" type="image/svg+xml" href="assets/winpodx-icon.svg">
<link rel="canonical" href="https://www.winpodx.org/features.html">
<meta name="theme-color" content="#0d1117">
<link rel="stylesheet" href="style.css">
</head>
<body>
<svg class="sprite" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
<symbol id="i-window" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="16" rx="2"/><path d="M3 9h18"/></symbol>
<symbol id="i-swap" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M17 1l4 4-4 4"/><path d="M3 11V9a4 4 0 0 1 4-4h14"/><path d="M7 23l-4-4 4-4"/><path d="M21 13v2a4 4 0 0 1-4 4H3"/></symbol>
<symbol id="i-bolt" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M13 2L3 14h9l-1 8 10-12h-9z"/></symbol>
<symbol id="i-hdd" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><line x1="22" y1="12" x2="2" y2="12"/><path d="M5.45 5.11L2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z"/><line x1="6" y1="16" x2="6.01" y2="16"/><line x1="10" y1="16" x2="10.01" y2="16"/></symbol>
<symbol id="i-activity" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M22 12h-4l-3 9L9 3l-3 9H2"/></symbol>
<symbol id="i-lock" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="11" width="18" height="11" rx="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></symbol>
<symbol id="i-download" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><path d="M7 10l5 5 5-5"/><path d="M12 15V3"/></symbol>
<symbol id="i-grid" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="7" height="7"/><rect x="14" y="3" width="7" height="7"/><rect x="14" y="14" width="7" height="7"/><rect x="3" y="14" width="7" height="7"/></symbol>
<symbol id="i-cursor" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M3 3l7.5 18 2.5-7.5L21 11z"/></symbol>
<symbol id="i-github" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"/></symbol>
<symbol id="i-globe" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M2 12h20"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></symbol>
</svg>
<header class="nav">
<div class="wrap">
<a class="brand" href="/" style="color:var(--text)"><img src="assets/winpodx-icon.svg" alt="">WinPodX</a>
<nav class="links">
<a href="features.html" class="active" data-i18n="nav.features">Features</a>
<a href="get-started.html" data-i18n="nav.get_started">Get started</a>
<a href="faq.html" data-i18n="nav.faq">FAQ</a>
<a target="_blank" rel="noopener noreferrer" class="gh" href="https://github.com/kernalix7/winpodx"><svg class="isvg" width="16" height="16" viewBox="0 0 24 24"><use href="#i-github"/></svg> GitHub</a>
<span class="lang-wrap"><svg class="isvg" width="15" height="15" viewBox="0 0 24 24"><use href="#i-globe"/></svg><select id="lang-select" aria-label="Language"></select></span>
</nav>
</div>
</header>
<main>
<section class="page-hero wrap">
<span class="eyebrow" data-i18n="feat.hero.eyebrow">Features</span>
<h1 data-i18n="feat.hero.h1">Windows apps, as native Linux citizens</h1>
<p data-i18n="feat.hero.sub">The full picture — from per-app RemoteApp windows and URL-scheme link handling to the bidirectional "Open with…" bridge, peripherals, multi-session RDP, and self-healing operations.</p>
</section>
<section class="wrap">
<h2 data-i18n="feat.seamless.title">Seamless app windows</h2>
<div class="feat">
<div class="block">
<h3 data-i18n="feat.seamless.rail.title">RemoteApp (RAIL), not a desktop</h3>
<p data-i18n-html="feat.seamless.rail.body">Each Windows app renders as its own native Linux window — no full-screen Windows desktop. Drop into a full desktop only when you actually want one (<code>winpodx app run desktop</code>).</p>
</div>
<div class="block">
<h3 data-i18n="feat.seamless.taskbar.title">Real taskbar identity</h3>
<p data-i18n-html="feat.seamless.taskbar.body">Per-app taskbar icons via <code>WM_CLASS</code> matching (<code>/wm-class:&lt;stem&gt;</code> + <code>StartupWMClass</code>), so each window pins and alt-tabs like a first-class Linux app.</p>
</div>
<div class="block">
<h3 data-i18n="feat.seamless.assoc.title">Bidirectional file associations</h3>
<p data-i18n-html="feat.seamless.assoc.body">Double-click a <code>.docx</code> in your file manager and Word opens. Open a second file for an app that's already running and it's delivered into the live session — mapped to its <code>\\tsclient</code> path and opened in place — instead of being silently dropped. The reverse works too — see below. <em>Open with…</em> also works on desktops that launch with a stripped PATH (e.g. Deepin), since entries embed winpodx's absolute path.</p>
</div>
<div class="block">
<h3 data-i18n="feat.seamless.urlschemes.title">Links open the right Windows app</h3>
<p data-i18n-html="feat.seamless.urlschemes.body">Click a <code>mailto:</code> link and Outlook opens; app schemes like <code>slack:</code>, <code>vnc:</code>, <code>zoommtg:</code> route to the right Windows app automatically — every scheme an app registers is harvested during discovery and turned into a Linux <code>x-scheme-handler</code>. Web schemes (<code>http:</code>/<code>https:</code>) are registered too, but never silently made your default — you opt in. A shared denylist + sanitizer blocks dangerous schemes (<code>file:</code>, <code>javascript:</code>, <code>data:</code>, …) at both registration and launch.</p>
</div>
<div class="block">
<h3 data-i18n="feat.seamless.menugroup.title">Folder-grouped app menu</h3>
<p data-i18n-html="feat.seamless.menugroup.body">Windows apps land under a single <code>WinPodX</code> menu group, mirroring the Start Menu's own folder hierarchy as nested sub-groups instead of scattering 50+ entries across native categories like Office and Graphics. (GNOME flattens nested menus, so it shows them as one group.) Menu search still finds each app by name.</p>
</div>
<div class="block">
<h3 data-i18n="feat.seamless.multi.title">Multi-session RDP</h3>
<p data-i18n-html="feat.seamless.multi.body">The bundled <a target="_blank" rel="noopener noreferrer" href="https://github.com/kernalix7/rdprrap">rdprrap</a> auto-enables up to 25 independent RDP sessions, so multiple apps run truly in parallel. RAIL prerequisites are set automatically during the unattended install.</p>
</div>
<div class="block">
<h3 data-i18n="feat.seamless.multimon.title">Multi-monitor RAIL</h3>
<p data-i18n-html="feat.seamless.multimon.body">Remote-app windows span multiple displays by default (<code>rdp.multimon</code>) — drag a window onto a second monitor and it keeps taking input, no dead window on the other screen.</p>
</div>
<div class="block">
<h3 data-i18n="feat.seamless.keyboard.title">Your keyboard layout</h3>
<p data-i18n-html="feat.seamless.keyboard.body">Set <code>[pod] keyboard</code> in your config and WinPodX passes it straight to FreeRDP (<code>/kbd:layout</code>), so non-US layouts type correctly in every Windows app.</p>
</div>
</div>
</section>
<section class="alt"><div class="wrap">
<h2 data-i18n="feat.reverse.title">Reverse-open — Linux apps inside Windows</h2>
<div class="feat">
<div class="block">
<h3 data-i18n="feat.reverse.menu.title">In the Windows "Open with…" menu</h3>
<p data-i18n="feat.reverse.menu.body">Your Linux apps appear in the Windows guest's right-click "Open with…" menu by default, with correct per-app icons in both the short menu and the long "Choose another app" dialog.</p>
</div>
<div class="block">
<h3 data-i18n="feat.reverse.roundtrip.title">Round-trips to the host</h3>
<p data-i18n-html="feat.reverse.roundtrip.body">Pick a Linux app inside Windows and the file open round-trips back to the host's <code>xdg-open</code>. WinPodX auto-discovers host-side Linux apps and their MIME associations from freedesktop standards.</p>
</div>
<div class="block">
<h3 data-i18n="feat.reverse.guestdisk.title">Windows-side files too</h3>
<p data-i18n-html="feat.reverse.guestdisk.body">Not just your shared home — the guest <code>C:</code> drive is shared over SMB and mounted with kio-fuse, so the Linux app opens the real guest file and edits save straight back (KDE; needs kio-fuse).</p>
</div>
<div class="block">
<h3 data-i18n="feat.reverse.manage.title">Manageable</h3>
<p data-i18n-html="feat.reverse.manage.body">Tune the allow/deny lists via <code>winpodx host-open</code> or the GUI Settings panel.</p>
</div>
</div>
</div></section>
<section class="wrap">
<h2 data-i18n="feat.zeroconf.title">Zero-config launch &amp; discovery</h2>
<div class="feat">
<div class="block">
<h3 data-i18n="feat.zeroconf.provision.title">First click provisions everything</h3>
<p data-i18n="feat.zeroconf.provision.body">Config, container, and desktop entries are created on the first app launch — no manual VM setup.</p>
</div>
<div class="block">
<h3 data-i18n="feat.zeroconf.discovery.title">Auto-discovery</h3>
<p data-i18n-html="feat.zeroconf.discovery.body">By default WinPodX registers only the apps your Windows Start Menu shows, grouped into matching folder sub-groups, each with its real icon. Set <code>desktop.full_app_scan</code> (CLI or a Settings checkbox) to also scan the registry App Paths, all UWP/MSIX, Chocolatey and Scoop. Rescan any time with <code>winpodx app refresh</code> or the GUI Refresh button.</p>
</div>
<div class="block">
<h3 data-i18n="feat.zeroconf.backend.title">Multi-backend</h3>
<p data-i18n="feat.zeroconf.backend.body">Podman (default), Docker, or a manual RDP endpoint — pick at setup.</p>
</div>
<div class="block">
<h3 data-i18n="feat.zeroconf.thinimage.title">Thin AppImage</h3>
<p data-i18n-html="feat.zeroconf.thinimage.body">The AppImage is a lean build — Python, Qt, and the FreeRDP client only. It uses the host's <code>podman</code> / <code>docker</code> instead of bundling the whole container stack, so it stays small and plays nicely with rootless setups.</p>
</div>
</div>
</section>
<section class="alt"><div class="wrap">
<h2 data-i18n="feat.peripherals.title">Peripherals &amp; sharing</h2>
<div class="grid">
<div class="card"><h3><span class="ico"><svg width="22" height="22" viewBox="0 0 24 24"><use href="#i-bolt"/></svg></span><span data-i18n="feat.peripherals.default.title">On by default</span></h3><ul>
<li data-i18n="feat.peripherals.default.li1">Clipboard — bidirectional text + images</li>
<li data-i18n="feat.peripherals.default.li2">Sound — RDP audio streaming</li>
<li data-i18n="feat.peripherals.default.li3">Printers — Linux printers shared to Windows</li>
<li data-i18n-html="feat.peripherals.default.li4">Home directory — shared as <code>\\tsclient\home</code></li>
</ul></div>
<div class="card"><h3><span class="ico"><svg width="22" height="22" viewBox="0 0 24 24"><use href="#i-hdd"/></svg></span><span data-i18n="feat.peripherals.storage.title">Storage &amp; devices</span></h3><ul>
<li data-i18n-html="feat.peripherals.storage.li1">USB drives shared at <code>\\tsclient\media</code> — the Windows desktop shortcut always resolves</li>
<li data-i18n="feat.peripherals.storage.li2">Drives plugged in mid-session resolve, subfolders work</li>
<li data-i18n="feat.peripherals.storage.li3">USB / PCI device passthrough (CLI, GUI Devices tab, tray switcher) — USB hot-plugs live</li>
<li data-i18n="feat.peripherals.storage.li4">Smart DPI scaling from GNOME / KDE / Sway / Hyprland / Cinnamon</li>
<li data-i18n-html="feat.peripherals.storage.li5">Put the Windows VM on a roomier partition with <code>--storage-dir</code>, or install from a local ISO with <code>--win-iso</code></li>
</ul></div>
</div>
</div></section>
<section class="wrap">
<h2 data-i18n="feat.automation.title">Automation, resilience &amp; security</h2>
<div class="grid">
<div class="card"><h3><span class="ico"><svg width="22" height="22" viewBox="0 0 24 24"><use href="#i-activity"/></svg></span><span data-i18n="feat.automation.healthy.title">Keeps itself healthy</span></h3><ul>
<li data-i18n="feat.automation.healthy.li1">Auto suspend / resume — pauses when idle, resumes on launch</li>
<li data-i18n="feat.automation.healthy.li5">Opt-in idle auto-stop — fully stops the VM and frees its RAM</li>
<li data-i18n="feat.automation.healthy.li2">Optional pod auto-start on login</li>
<li data-i18n="feat.automation.healthy.li3">UNRESPONSIVE → recover: self-heals a stalled RDP guest</li>
<li data-i18n="feat.automation.healthy.li4">Windows disk auto-grows when C: fills, bounded by host space</li>
</ul></div>
<div class="card"><h3><span class="ico"><svg width="22" height="22" viewBox="0 0 24 24"><use href="#i-lock"/></svg></span><span data-i18n="feat.automation.secure.title">Secure &amp; private</span></h3><ul>
<li data-i18n="feat.automation.secure.li1">Password auto-rotation — 20-char, 7-day cycle, atomic rollback</li>
<li data-i18n="feat.automation.secure.li2">Windows debloat: telemetry, ads, Cortana off by default</li>
<li data-i18n-html="feat.automation.secure.li3">FreeRDP <code>extra_flags</code> allowlist (regex-validated)</li>
<li data-i18n="feat.automation.secure.li4">No WinPodX telemetry — ever</li>
</ul></div>
<div class="card"><h3><span class="ico"><svg width="22" height="22" viewBox="0 0 24 24"><use href="#i-grid"/></svg></span><span data-i18n="feat.automation.ops.title">Operations</span></h3><ul>
<li data-i18n-html="feat.automation.ops.li1"><code>winpodx doctor</code> — deps / pod / RDP / agent / disk health</li>
<li data-i18n-html="feat.automation.ops.li2"><code>--json</code>, <code>--quick</code>, and <code>--fix</code> auto-remediation</li>
<li data-i18n="feat.automation.ops.li3">Guest sync after a host upgrade; offline / air-gapped install</li>
<li data-i18n-html="feat.automation.ops.li4">One-line uninstall (keeps VM data unless <code>--purge</code>)</li>
</ul></div>
<div class="card"><h3><span class="ico"><svg width="22" height="22" viewBox="0 0 24 24"><use href="#i-window"/></svg></span><span data-i18n="feat.automation.polish.title">Polish</span></h3><ul>
<li data-i18n="feat.automation.polish.li1">Host-adaptive Windows-on-KVM tuning profile</li>
<li data-i18n="feat.automation.polish.li2">Time sync after host sleep/wake</li>
<li data-i18n="feat.automation.polish.li3">Multilingual UI (en / ko / zh / ja / de / fr / it)</li>
<li data-i18n="feat.automation.polish.li4">Start-menu Qt6 GUI: Dashboard (live Pod / RAM / CPU / disk) · All apps · Devices · Settings + tray</li>
</ul></div>
</div>
<p class="lead cta-lead"><a target="_blank" rel="noopener noreferrer" href="https://github.com/kernalix7/winpodx/blob/main/docs/FEATURES.md" data-i18n="feat.automation.docs_link">Deep dives in the docs →</a></p>
</section>
</main>
<footer>
<div class="wrap">
<div class="cols">
<div><span class="brand" style="font-size:16px;font-weight:700;color:var(--text)">WinPodX</span>
<div class="footer-tagline" data-i18n="footer.tagline">Windows apps, as native Linux citizens.</div></div>
<div class="links">
<a href="features.html" data-i18n="nav.features">Features</a><a href="get-started.html" data-i18n="nav.get_started">Get started</a><a href="faq.html" data-i18n="nav.faq">FAQ</a>
<a target="_blank" rel="noopener noreferrer" href="https://github.com/kernalix7/winpodx">GitHub</a>
<a target="_blank" rel="noopener noreferrer" href="https://github.com/kernalix7/winpodx/releases">Releases</a>
<a target="_blank" rel="noopener noreferrer" href="https://github.com/sponsors/kernalix7">Sponsor</a>
</div>
</div>
<div class="legal" data-i18n-html="footer.legal">MIT licensed — Kim DaeHyun · Powered by
<a target="_blank" rel="noopener noreferrer" href="https://github.com/dockur/windows">dockur/windows</a> + <a target="_blank" rel="noopener noreferrer" href="https://www.freerdp.com/">FreeRDP</a>.
Not affiliated with Microsoft.</div>
</div>
</footer>
<script src="lang/translations.js"></script>
<script src="i18n.js"></script>
</body>
</html>