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

169 lines
14 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<!-- SPDX-License-Identifier: MIT — winpodx.org/get-started. No trackers. -->
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Get started — WinPodX</title>
<meta name="description" content="Install WinPodX: one-line curl, or native packages for openSUSE, Fedora, Debian/Ubuntu, RHEL, Arch, NixOS, and AppImage. Requirements + first-time setup.">
<link rel="icon" type="image/svg+xml" href="assets/winpodx-icon.svg">
<link rel="canonical" href="https://www.winpodx.org/get-started.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" data-i18n="nav.features">Features</a>
<a href="get-started.html" class="active" 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="gs.hero.eyebrow">Get started</span>
<h1 data-i18n="gs.hero.h1">Up and running in one line</h1>
<p data-i18n-html="gs.hero.sub">The curl installer works on every supported distro and runs setup for you. Or use your native package manager and run <code>winpodx setup</code> once.</p>
</section>
<section class="wrap">
<h2 data-i18n="gs.install.title">1 · Install</h2>
<p class="lead" data-i18n="gs.install.lead">The one-liner installs WinPodX, runs setup, and waits for the first Windows boot (~510 min).</p>
<div class="install">
<div class="label" data-i18n="gs.install.label">Any supported distro</div>
<div class="code"><button class="copy" data-copy="curl -fsSL https://raw.githubusercontent.com/kernalix7/winpodx/main/install.sh | bash">Copy</button><span class="prompt">$ </span>curl -fsSL https://raw.githubusercontent.com/kernalix7/winpodx/main/install.sh | bash</div>
</div>
<div class="note" style="border-left-color:var(--blue)" data-i18n-html="gs.install.flags">
<b>Optional installer flags</b> (download <code>install.sh</code> and pass them, or run it locally): <code>--storage-dir &lt;path&gt;</code> puts the Windows VM disk on a roomier partition instead of <code>~/.local/share/winpodx/storage</code>, and <code>--win-iso &lt;path&gt;</code> installs from a Windows ISO you already have so it skips the ~58&nbsp;GB download. Both apply to fresh installs.
</div>
<h2 class="subhead" data-i18n="gs.pkg.title">Or via a package manager</h2>
<div class="dist">
<div class="item"><h3 data-i18n="gs.pkg.opensuse">openSUSE (Tumbleweed / Leap / Slowroll)</h3>
<div class="code"><button class="copy" data-copy="sudo zypper addrepo https://download.opensuse.org/repositories/home:/Kernalix7/openSUSE_Tumbleweed/home:Kernalix7.repo
sudo zypper install winpodx">Copy</button>sudo zypper addrepo …home:Kernalix7.repo
sudo zypper install winpodx</div></div>
<div class="item"><h3 data-i18n="gs.pkg.fedora">Fedora 42 / 43 / 44</h3>
<div class="code"><button class="copy" data-copy="sudo dnf config-manager addrepo --from-repofile=https://download.opensuse.org/repositories/home:/Kernalix7/Fedora_43/home:Kernalix7.repo
sudo dnf install winpodx">Copy</button>sudo dnf config-manager addrepo --from-repofile=…
sudo dnf install winpodx</div></div>
<div class="item"><h3 data-i18n="gs.pkg.arch">Arch / Manjaro</h3>
<div class="code"><button class="copy" data-copy="yay -S winpodx">Copy</button><span class="prompt">$ </span>yay -S winpodx</div>
<div class="code"><button class="copy" data-copy="yay -S winpodx-git">Copy</button><span class="prompt">$ </span>yay -S winpodx-git</div></div>
<div class="item"><h3 data-i18n="gs.pkg.nixos">NixOS</h3>
<div class="code"><button class="copy" data-copy="nix run github:kernalix7/winpodx">Copy</button><span class="prompt">$ </span>nix run github:kernalix7/winpodx</div></div>
<div class="item"><h3 data-i18n="gs.pkg.debian">Debian / Ubuntu (.deb)</h3>
<div class="code"><button class="copy" data-copy="sudo apt install ./winpodx_<version>_all_debian13.deb">Copy</button><span class="prompt">$ </span>sudo apt install ./winpodx_&lt;version&gt;_all_debian13.deb</div></div>
<div class="item"><h3 data-i18n="gs.pkg.rhel">AlmaLinux / Rocky / RHEL (.rpm)</h3>
<div class="code"><button class="copy" data-copy="sudo dnf install ./winpodx-<version>-0.noarch.el10.rpm">Copy</button><span class="prompt">$ </span>sudo dnf install ./winpodx-&lt;version&gt;-0.noarch.el10.rpm</div></div>
<div class="item"><h3 data-i18n="gs.pkg.appimage">AppImage (any distro)</h3>
<div class="code"><button class="copy" data-copy="chmod +x winpodx-*-x86_64.AppImage
./winpodx-*-x86_64.AppImage setup">Copy</button>chmod +x winpodx-*-x86_64.AppImage
./winpodx-*-x86_64.AppImage setup</div></div>
<div class="item"><h3 data-i18n="gs.pkg.uninstall">Uninstall</h3>
<div class="code"><button class="copy" data-copy="curl -fsSL https://raw.githubusercontent.com/kernalix7/winpodx/main/uninstall.sh | bash -s -- --confirm">Copy</button>curl -fsSL …/uninstall.sh | bash -s -- --confirm</div></div>
</div>
<div class="note" style="border-left-color:var(--blue)" data-i18n-html="gs.install.note">
<b>After a package / AppImage install</b>, run <code>winpodx setup</code> once to generate the
config + compose and confirm host deps — package installs ship the binary only, so they don't
kick off a 10-minute Windows download out of the blue. The curl one-liner does this for you.
</div>
</section>
<section class="alt"><div class="wrap">
<h2 data-i18n="gs.setup.title">2 · First-time setup</h2>
<p class="lead" data-i18n="gs.setup.lead">Already used the curl one-liner? It ran setup — skip to launch.</p>
<div class="dist">
<div class="item"><h3 data-i18n="gs.setup.auto.title">Auto (host-detected defaults)</h3>
<div class="code"><button class="copy" data-copy="winpodx setup">Copy</button><span class="prompt">$ </span>winpodx setup</div></div>
<div class="item"><h3 data-i18n="gs.setup.wizard.title">Interactive wizard</h3>
<div class="code"><button class="copy" data-copy="winpodx setup --customize">Copy</button><span class="prompt">$ </span>winpodx setup --customize</div></div>
</div>
<p class="lead lead-left" data-i18n-html="gs.setup.body">
Setup writes <code>~/.config/winpodx.toml</code> + <code>compose.yaml</code>, registers the GUI launcher,
and confirms FreeRDP + Podman/Docker + KVM. The first app launch then provisions the pod and reaches a usable
RDP session in ~510 min.</p>
<div class="install">
<div class="label" data-i18n="gs.setup.launch.label">Launch (first run ~510 min, then near-instant)</div>
<div class="code"><button class="copy" data-copy="winpodx app run desktop
winpodx pod wait-ready --logs">Copy</button>winpodx app run desktop <span class="code-comment" data-i18n="gs.setup.cmt.first"># first launch</span>
winpodx pod wait-ready --logs <span class="code-comment" data-i18n="gs.setup.cmt.watch"># watch progress</span></div>
</div>
</div></section>
<section class="wrap">
<h2 data-i18n="gs.req.title">3 · Requirements</h2>
<div class="feat">
<div class="block">
<h3 data-i18n="gs.req.virt.title">Hardware virtualization</h3>
<p data-i18n-html="gs.req.virt.body">An x86_64 or aarch64 CPU with virtualization extensions (VT-x / AMD-V / EL2), and access to <code>/dev/kvm</code>. WinPodX runs Windows in a KVM-backed container — without KVM the install completes but Windows never boots.</p>
</div>
<div class="block">
<h3 data-i18n="gs.req.mem.title">Memory &amp; disk</h3>
<p data-i18n-html="gs.req.mem.body">8 GB+ host RAM (12 GB+ recommended) and ~30 GB free disk for the Windows image. Setup auto-sizes the VM's RAM to your host — a 24 GB+ host now gives the VM 8 GB by default; change it any time with <code>winpodx config set pod.ram_gb 8</code>.</p>
</div>
<div class="block">
<h3 data-i18n="gs.req.rt.title">Container runtime + FreeRDP</h3>
<p data-i18n-html="gs.req.rt.body">A host container runtime (<code>podman</code> ≥ 4 recommended; <code>docker</code> also supported), a compose provider (the <code>.deb</code> now pulls in <code>podman-compose</code>, and setup fails loudly with the package to install if none is found), and FreeRDP 3+. <code>winpodx setup-host</code> fixes kvm-group + <code>/etc/subuid</code> / <code>subgid</code> via one <code>pkexec</code> prompt; <code>winpodx doctor</code> surfaces anything still missing.</p>
</div>
</div>
<p class="lead cta-lead">
<a target="_blank" rel="noopener noreferrer" class="btn primary" href="https://github.com/kernalix7/winpodx/blob/main/docs/INSTALL.md" data-i18n="gs.req.docs_btn">Full install 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">Features</a><a href="get-started.html">Get started</a><a href="faq.html">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>
document.querySelectorAll("button.copy").forEach(function (b) {
b.addEventListener("click", function () {
navigator.clipboard.writeText(b.dataset.copy).then(function () {
var t = b.textContent; b.textContent = "Copied"; setTimeout(function () { b.textContent = t; }, 1500);
});
});
});
</script>
<script src="lang/translations.js"></script>
<script src="i18n.js"></script>
</body>
</html>