{
    "version": "https://jsonfeed.org/version/1",
    "title": "Rancher Desktop Blog",
    "home_page_url": "https://docs.rancherdesktop.io/blog/",
    "description": "News and updates from the Rancher Desktop team",
    "items": [
        {
            "id": "https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/",
            "content_html": "<p>Rancher Desktop 2.0 is a ground-up rewrite, and the first build is ready for you\nto try. There is an alpha you can download today and run on your own machine.</p>\n<p>Let's call it what it is: an early tech preview. It is rough, and not meant for\nproduction. It exists so you can see that 2.0 is real and already running, and\nso you can tell us what you would like while the architecture is still soft\nenough to change.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-20-is\">What 2.0 is<a href=\"https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/#what-20-is\" class=\"hash-link\" aria-label=\"Direct link to What 2.0 is\" title=\"Direct link to What 2.0 is\" translate=\"no\">​</a></h2>\n<p>We rewrote Rancher Desktop because the old design made every new feature take\nmore effort than the one before it. The <a href=\"https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/\">history\npost</a> tells that story; the short version is\none backend instead of two, the engine lifted out of the GUI, and a different\nguest OS underneath. 2.0 is that idea, built.</p>\n<p>At the center is a new background program called rdd, the Rancher Desktop\nDaemon. rdd does the real work. It runs the virtual machine, using Lima on every\nplatform now, Windows included. It starts your container engine and your\nKubernetes cluster. It exposes all of that through an API, and not a custom one:\nrdd speaks the Kubernetes API. Your kubectl and the usual client libraries can\ndrive it directly, no new SDK to learn. The desktop app is just one more client,\nwith no special privileges, talking to rdd the way any other tool would.</p>\n<p>Because the work lives in rdd instead of inside a window, you can run the whole\nthing without ever opening the GUI. And rdd is one self-contained executable: no\ninstaller, no separate daemon and command-line tool, just one file that is both\nthe backend and the way you drive it. Download it, start it from the command\nline, and you have a container engine and a cluster: on a headless server, on a\nCI runner, or in your own terminal. Deploying it is copying one file. Rancher\nDesktop never had a way to do this. The engine lived inside the app, and the\napp had to be on screen.</p>\n<p>The guest VM runs openSUSE Leap now instead of Alpine. The reason is glibc: much\nof the GPU and AI tooling people ask for needs it, and Alpine's musl does not\nprovide it. GPU support is not built yet, but the guest OS no longer rules it\nout.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"why-an-alpha-and-why-now\">Why an alpha, and why now<a href=\"https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/#why-an-alpha-and-why-now\" class=\"hash-link\" aria-label=\"Direct link to Why an alpha, and why now\" title=\"Direct link to Why an alpha, and why now\" translate=\"no\">​</a></h2>\n<p>We could have kept this private until it looked polished. We would rather not.\nPutting it out now, rough edges and all, does two things for us.</p>\n<p>It shows that \"we will do that in 2.0\" means a workstream already running, not a\npromise about some distant year. And it puts the design in front of you early,\nwhen your feedback still counts. If your setup depends on something specific,\nthis is the moment to say so, before we lock in decisions we made without you.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-you-can-do-today\">What you can do today<a href=\"https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/#what-you-can-do-today\" class=\"hash-link\" aria-label=\"Direct link to What you can do today\" title=\"Direct link to What you can do today\" translate=\"no\">​</a></h2>\n<p>This is a working preview, not a finished product. What runs right now:</p>\n<ul>\n<li>Start, stop, and delete Rancher Desktop 2.0, from the GUI or the command line.</li>\n<li>Install and run it with no GUI at all: the daemon plus the bundled\ncommand-line tools.</li>\n<li>Build and run containers with the Docker (moby) engine.</li>\n<li>Manage containers from the dashboard: start, stop, pause, resume, delete.</li>\n<li>Turn on Kubernetes (version 1.31 or newer), switch versions, and browse the\ncluster in the built-in dashboard.</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-is-not-there-yet\">What is not there yet<a href=\"https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/#what-is-not-there-yet\" class=\"hash-link\" aria-label=\"Direct link to What is not there yet\" title=\"Direct link to What is not there yet\" translate=\"no\">​</a></h2>\n<p>So you are not caught off guard:</p>\n<ul>\n<li>moby is the only container engine for now.</li>\n<li>There is no settings screen. You pick your Kubernetes version from the command\nline.</li>\n<li>The interface is deliberately thin: containers, images, and volumes, plus the\ncluster dashboard. That is the whole UI.</li>\n<li>There is no upgrade path between previews. Each new build means a clean slate:\nfactory reset, then install fresh. It stays that way until 2.0 reaches a real\nrelease.</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"it-runs-beside-rancher-desktop\">It runs beside Rancher Desktop<a href=\"https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/#it-runs-beside-rancher-desktop\" class=\"hash-link\" aria-label=\"Direct link to It runs beside Rancher Desktop\" title=\"Direct link to It runs beside Rancher Desktop\" translate=\"no\">​</a></h2>\n<p>You do not have to choose. 2.0 installs next to Rancher Desktop, and the two\nignore each other completely: separate package, separate data, separate\neverything. Install them in either order, remove them in either order, nothing\ngets tangled. You can even run both at once, though I would not recommend it.\nTwo container engines and two clusters on one laptop gets confusing quickly.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"how-to-try-it\">How to try it<a href=\"https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/#how-to-try-it\" class=\"hash-link\" aria-label=\"Direct link to How to try it\" title=\"Direct link to How to try it\" translate=\"no\">​</a></h2>\n<p>The full app, GUI plus bundled tools, comes from the GitHub releases page for\nWindows and macOS (Intel and Apple silicon), and from our RPM and DEB\nrepositories and AppImages on Linux. The same places you would reach for Rancher\nDesktop 1. If all you want is the daemon, download the single rdd binary for\nyour platform and you are two commands away from a running container.</p>\n<p>A real <a href=\"https://docs.rancherdesktop.io/blog/installing-rancher-desktop-2/\">installation and usage\nwalkthrough</a> is a separate post in this\nseries.</p>\n<p>This is alpha software. Things will break, especially in corners we have never\ntested on a machine configured like yours. When they do, tell us. That feedback\nis a big part of why we are shipping this early.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"staying-in-the-loop\">Staying in the loop<a href=\"https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/#staying-in-the-loop\" class=\"hash-link\" aria-label=\"Direct link to Staying in the loop\" title=\"Direct link to Staying in the loop\" translate=\"no\">​</a></h2>\n<p>There are no docs for 2.0 yet. There is this blog. As the work moves, we will\nwrite about how the pieces fit and what becomes newly possible: the daemon and\nits API, networking, snapshots, the AI story, whatever we're working on that\nmonth. To find out when the next preview drops, subscribe to the feed.</p>\n<p>Curious, and feeling adventurous? Give it a try. Cautious? Follow along, and\njump in when it looks ready for you.</p>",
            "url": "https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/",
            "title": "Welcome to Rancher Desktop 2.0",
            "summary": "Rancher Desktop 2.0 is a ground-up rewrite, and the first build is ready for you",
            "date_modified": "2026-06-19T00:00:00.000Z",
            "author": {
                "name": "Jan Dubois",
                "url": "https://github.com/jandubois"
            },
            "tags": []
        },
        {
            "id": "https://docs.rancherdesktop.io/blog/installing-rancher-desktop-2/",
            "content_html": "<p>The 2.0 alpha is out, and there are two ways to run it. Install the full\ndesktop app, or skip the GUI and run the new rdd binary straight from your\nterminal. Both leave Rancher Desktop alone, and both put you a couple of\ncommands from a working container engine.</p>\n<p>2.0 installs beside Rancher Desktop without touching it: separate package,\nseparate data, nothing shared. Install or remove them in any order. (The\n<a href=\"https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/\">welcome post</a> covers what 2.0 is and how\nit differs; this one is about getting it running.)</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"install-the-desktop-app\">Install the desktop app<a href=\"https://docs.rancherdesktop.io/blog/installing-rancher-desktop-2/#install-the-desktop-app\" class=\"hash-link\" aria-label=\"Direct link to Install the desktop app\" title=\"Direct link to Install the desktop app\" translate=\"no\">​</a></h2>\n<p>The full app, the GUI plus a set of bundled command-line tools, comes from the\n<a href=\"https://github.com/rancher-sandbox/rancher-desktop-2/releases\" target=\"_blank\" rel=\"noopener noreferrer\">releases page</a>\non GitHub. Find the latest alpha and open its <strong>Assets</strong> list.</p>\n<p>On macOS, download the <code>.dmg</code> that matches your chip:\n<code>Rancher.Desktop-2.0.0-alpha.1.aarch64.dmg</code> on Apple silicon, or the <code>x86_64</code>\nbuild on an Intel Mac. Open it, drag the app into Applications, and launch it\nfrom there.</p>\n<p>On Windows, download the installer, <code>Rancher.Desktop.Setup.2.0.0-alpha.1.msi</code>,\nand run it. Install WSL2 first if you have not already; 2.0 runs its Linux VM\nthrough WSL2, just as Rancher Desktop does.</p>\n<p>On Linux, install from our RPM or DEB repositories or run the AppImage, the\nsame channels as Rancher Desktop.</p>\n<p>The first time you launch the app, it sets up the backend and downloads the\nVM image, which can take a while on a slow connection. After that the app is\ntalking to a running container engine, and you can manage containers, images,\nand volumes from its window.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"or-just-the-daemon\">Or just the daemon<a href=\"https://docs.rancherdesktop.io/blog/installing-rancher-desktop-2/#or-just-the-daemon\" class=\"hash-link\" aria-label=\"Direct link to Or just the daemon\" title=\"Direct link to Or just the daemon\" translate=\"no\">​</a></h2>\n<p>If you want a container engine and a cluster with no window on screen, skip the\napp and download the single <code>rdd</code> binary instead. It is the whole backend in\none file: no installer, nothing to unpack.</p>\n<p>The binaries are on the same releases page. The name is <code>rdd-</code> followed by the\nversion, the operating system, and the CPU architecture: on an Apple silicon\nMac you want <code>rdd-2.0.0-alpha.1.darwin.aarch64</code>; on x86_64 Linux,\n<code>rdd-2.0.0-alpha.1.linux.x86_64</code>. Download the one for your machine, put it on\nyour <code>PATH</code>, and make it executable:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token function\" style=\"color:#d73a49\">curl</span><span class=\"token plain\"> </span><span class=\"token parameter variable\" style=\"color:#36acaa\">--location</span><span class=\"token plain\"> </span><span class=\"token parameter variable\" style=\"color:#36acaa\">--output</span><span class=\"token plain\"> /usr/local/bin/rdd </span><span class=\"token punctuation\" style=\"color:#393A34\">\\</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  https://github.com/rancher-sandbox/rancher-desktop-2/releases/download/v2.0.0-alpha.1/rdd-2.0.0-alpha.1.darwin.aarch64</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token function\" style=\"color:#d73a49\">chmod</span><span class=\"token plain\"> +x /usr/local/bin/rdd</span><br></div></code></pre></div></div>\n<p>From there, one command gets you a running container:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token function\" style=\"color:#d73a49\">rdd</span><span class=\"token plain\"> run </span><span class=\"token function\" style=\"color:#d73a49\">docker</span><span class=\"token plain\"> run </span><span class=\"token parameter variable\" style=\"color:#36acaa\">--rm</span><span class=\"token plain\"> hello-world</span><br></div></code></pre></div></div>\n<p><code>rdd run</code> is the no-commitment way to use 2.0. It starts the daemon if it is\nnot already up, then runs your command with the <code>PATH</code> and the Docker and\nKubernetes contexts pointed at 2.0 for that command only. It leaves your own\nconfiguration untouched. So if your machine is already set up for Rancher\nDesktop, leave it that way and reach for 2.0 with <code>rdd run</code> when you want to\ntry something. The very first start downloads the openSUSE Leap image and\nbrings the VM up, which can take a while on a slow connection; after that it is\nquick.</p>\n<p>Kubernetes works the same way. On a fresh setup, <code>rdd run kubectl get node</code>\nenables Kubernetes at the default version and runs against the new cluster,\nwith no separate step to turn it on:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token function\" style=\"color:#d73a49\">rdd</span><span class=\"token plain\"> run </span><span class=\"token function\" style=\"color:#d73a49\">kubectl</span><span class=\"token plain\"> get </span><span class=\"token function\" style=\"color:#d73a49\">node</span><br></div></code></pre></div></div>\n<p>That shortcut fires only the first time, while nothing is configured yet. Once\nRancher Desktop exists, choose a version or toggle Kubernetes with <code>rdd set</code>\n(1.31 or newer):</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token function\" style=\"color:#d73a49\">rdd</span><span class=\"token plain\"> </span><span class=\"token builtin class-name\">set</span><span class=\"token plain\"> </span><span class=\"token assign-left variable\" style=\"color:#36acaa\">kubernetes.enabled</span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\">true </span><span class=\"token assign-left variable\" style=\"color:#36acaa\">kubernetes.version</span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token number\" style=\"color:#36acaa\">1.32</span><span class=\"token plain\">.2</span><br></div></code></pre></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"driving-it\">Driving it<a href=\"https://docs.rancherdesktop.io/blog/installing-rancher-desktop-2/#driving-it\" class=\"hash-link\" aria-label=\"Direct link to Driving it\" title=\"Direct link to Driving it\" translate=\"no\">​</a></h2>\n<p>The same <code>rdd</code> commands drive 2.0 whether you installed the app or only the\nbinary. The GUI is one more client; underneath, it runs the daemon you do.</p>\n<p><code>rdd run</code> is fine for the occasional command. If you reach for 2.0 a lot, put\n<code>docker</code>, <code>kubectl</code>, and <code>helm</code> on your <code>PATH</code> directly. The first start\npopulates <code>~/.rd2/bin</code> with them; add that directory to your <code>PATH</code> yourself,\nin this shell and in your profile:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token builtin class-name\">export</span><span class=\"token plain\"> </span><span class=\"token assign-left variable environment constant\" style=\"color:#36acaa\">PATH</span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token string\" style=\"color:#e3116c\">\"</span><span class=\"token string environment constant\" style=\"color:#36acaa\">$HOME</span><span class=\"token string\" style=\"color:#e3116c\">/.rd2/bin:</span><span class=\"token string environment constant\" style=\"color:#36acaa\">$PATH</span><span class=\"token string\" style=\"color:#e3116c\">\"</span><br></div></code></pre></div></div>\n<p>This alpha sets up no paths for you, so that line is your job. Both the Docker\nand Kubernetes contexts are named <code>rancher-desktop-2</code>, and 2.0 will not take\nover a context you already have selected. If you run both side by side, move\nbetween them by switching contexts:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token function\" style=\"color:#d73a49\">docker</span><span class=\"token plain\"> context use rancher-desktop-2</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token function\" style=\"color:#d73a49\">kubectl</span><span class=\"token plain\"> config use-context rancher-desktop-2</span><br></div></code></pre></div></div>\n<p>Managing the backend itself needs no <code>rdd run</code>. <code>rdd start</code> brings it up and\n<code>rdd stop</code> takes it down, keeping your data for next time:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token function\" style=\"color:#d73a49\">rdd</span><span class=\"token plain\"> start   </span><span class=\"token comment\" style=\"color:#999988;font-style:italic\"># bring the backend up</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token function\" style=\"color:#d73a49\">rdd</span><span class=\"token plain\"> stop    </span><span class=\"token comment\" style=\"color:#999988;font-style:italic\"># take it down, keep your data</span><br></div></code></pre></div></div>\n<p>There is no upgrade path between previews yet, so each new alpha starts from a\nclean slate. <code>rdd svc delete</code> stops the daemon and removes everything 2.0\ncreated, the VM, the cluster, your settings, and the daemon's own data, keeping\nonly the download cache so a reinstall does not refetch the VM image. It is\nalso how you uninstall: after it runs, delete the <code>rdd</code> binary or remove the\napp. The cache it leaves is Lima's, not ours (<code>~/Library/Caches/lima</code> on macOS,\n<code>~/.cache/lima</code> on Linux, <code>~/AppData/Local/lima</code> on Windows); delete it too for\na full reclaim. A later release will handle that for you, clearing distro\nimages from earlier previews automatically and adding a command to empty the\ncache. For the next preview instead, install the new build and start again.</p>\n<p>That is the alpha: install it one of two ways, start it, run a container. It\nwill break on setups we have never seen, and when it does, tell us. Finding out\nwhere it breaks is much of why we shipped it this early.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"a-glimpse-underneath\">A glimpse underneath<a href=\"https://docs.rancherdesktop.io/blog/installing-rancher-desktop-2/#a-glimpse-underneath\" class=\"hash-link\" aria-label=\"Direct link to A glimpse underneath\" title=\"Direct link to A glimpse underneath\" translate=\"no\">​</a></h2>\n<p>rdd is a Kubernetes API server in its own right, and Rancher Desktop's own\nstate lives inside it as Kubernetes objects. <code>rdd ctl</code> is kubectl aimed at that\nAPI. Ask it for the App object and the whole machine prints as YAML: the\ncontainer engine, the Kubernetes version it settled on, and the conditions\ntracking its progress toward the state you asked for.</p>\n<div class=\"language-yaml codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-yaml codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token comment\" style=\"color:#999988;font-style:italic\"># rdd ctl get app -o yaml</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:#00a4db\">apiVersion</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> v1</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:#00a4db\">items</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:#00a4db\">apiVersion</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> app.rancherdesktop.io/v1alpha1</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#00a4db\">kind</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> App</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#00a4db\">metadata</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#00a4db\">creationTimestamp</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#e3116c\">\"2026-06-17T17:44:58Z\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#00a4db\">finalizers</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\"> rdd.rancherdesktop.io/cleanup</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#00a4db\">generation</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">4</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#00a4db\">name</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> app</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#00a4db\">resourceVersion</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#e3116c\">\"507\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#00a4db\">uid</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> 3ab44aec</span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\">8949</span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\">41b8</span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\">8432</span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\">03224fe38ce5</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#00a4db\">spec</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#00a4db\">containerEngine</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">name</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> moby</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#00a4db\">kubernetes</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">enabled</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token boolean important\" style=\"color:#36acaa\">true</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">version</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> 1.34.6</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#00a4db\">namespace</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> rancher</span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\">desktop</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#00a4db\">running</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token boolean important\" style=\"color:#36acaa\">true</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#00a4db\">status</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#00a4db\">conditions</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:#00a4db\">lastTransitionTime</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#e3116c\">\"2026-06-19T00:57:05Z\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">message</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Container engine synced</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">observedGeneration</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">4</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">reason</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Connected</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">status</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#e3116c\">\"True\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">type</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> ContainerEngineReady</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:#00a4db\">lastTransitionTime</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#e3116c\">\"2026-06-19T00:57:10Z\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">message</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Kubernetes cluster is ready</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">observedGeneration</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">4</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">reason</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Ready</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">status</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#e3116c\">\"True\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">type</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> KubernetesReady</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:#00a4db\">lastTransitionTime</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#e3116c\">\"2026-06-17T17:45:19Z\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">message</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Lima instance created successfully</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">observedGeneration</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">4</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">reason</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Created</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">status</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#e3116c\">\"True\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">type</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Created</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:#00a4db\">lastTransitionTime</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#e3116c\">\"2026-06-19T00:57:10Z\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">message</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> App has reached the desired state</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">observedGeneration</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">4</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">reason</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Settled</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">status</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#e3116c\">\"True\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">type</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Settled</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:#00a4db\">lastTransitionTime</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#e3116c\">\"2026-06-19T00:57:05Z\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">message</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Lima instance is running</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">observedGeneration</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">4</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">reason</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Started</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">status</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#e3116c\">\"True\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:#00a4db\">type</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Running</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#00a4db\">kubernetesPort</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">7443</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:#00a4db\">kind</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> List</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:#00a4db\">metadata</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#00a4db\">resourceVersion</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#e3116c\">\"\"</span><br></div></code></pre></div></div>\n<p>This is not the cluster you turned on earlier. It is Rancher Desktop\nrepresenting itself through the same API your tools already speak, which means\nanything that drives Kubernetes can drive it, no bespoke SDK and no private\nprotocol. There is a lot to say about that, and it gets a post of its own.</p>",
            "url": "https://docs.rancherdesktop.io/blog/installing-rancher-desktop-2/",
            "title": "Installing and Running Rancher Desktop 2.0",
            "summary": "The 2.0 alpha is out, and there are two ways to run it. Install the full",
            "date_modified": "2026-06-18T00:00:00.000Z",
            "author": {
                "name": "Jan Dubois",
                "url": "https://github.com/jandubois"
            },
            "tags": []
        },
        {
            "id": "https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/",
            "content_html": "<p>In October 2020, Rancher Desktop was a tray icon and a single shell command.\nClick the icon, and it ran <code>minikube start</code> to bring up a Kubernetes cluster on\nyour Mac. That was the whole thing: nine files, one good idea, and a note in the\nsource that read, more or less, <em>this is just a quick proof of concept</em>.</p>\n<p>SUSE had just bought Rancher Labs, and the goal was easy to state and hard to\nbuild: make Kubernetes easy on a developer's laptop. We called it Rancher\nDesktop because, at the time, \"Rancher\" was how SUSE said \"Kubernetes.\" That\nbranding has gotten more complicated since, the way branding does, but the name\nstuck.</p>\n<p>About seven months later, in May 2021, the first public build shipped: macOS and\nWindows, k3s for Kubernetes, an image builder called kim, and a way to switch\nKubernetes versions. It was alpha software and looked like it. Five years on\nit's a different program, and the story of how it got here is mostly the story\nof how much work it took to keep one simple promise on three operating systems\nat once.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"two-operating-systems-two-backends\">Two operating systems, two backends<a href=\"https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/#two-operating-systems-two-backends\" class=\"hash-link\" aria-label=\"Direct link to Two operating systems, two backends\" title=\"Direct link to Two operating systems, two backends\" translate=\"no\">​</a></h2>\n<p>On a Mac, Kubernetes needs a Linux virtual machine. On Windows, it needs WSL2.\nSo from the very first release, Rancher Desktop had two backends, and we spent\nthe next five years discovering how different \"two backends\" really are.</p>\n<p>The Mac side never sat still. We started with minikube, dropped it to drive\nApple's Hypervisor.framework via the docker-machine-driver-hyperkit, then\nreplaced it with Lima and QEMU. Each move was a rebuild of the layer that\ncreates the VM, installs k3s, and wires up the network. When Apple later shipped\nits own Virtualization framework, VZ, moving to it was mostly a matter of\ntelling Lima to use it. That's the difference a real foundation makes: the next\nbig change stops being a rebuild.</p>\n<p>Windows went its own way, with k3s running inside a dedicated WSL distribution\nwe imported from an image we built ourselves. When Linux arrived as a tech\npreview in late 2021, it didn't add a third backend. It joined the Mac under\nLima, which manages the VM on macOS and Linux alike, and which we got to build\non as an upstream open-source project instead of maintaining alone. That part\nworked. macOS and Linux became one backend, where a fix landed once instead of\ntwice.</p>\n<p>Building on Lima also meant building it. Lima started narrow: a way to run\ncontainers with nerdctl on a Mac. The provisioning scripts we added a few weeks\nin, the mechanism that runs setup inside a fresh VM, are how Rancher Desktop\ninstalls k3s and a container engine. They also opened up Lima so you could\nprovision for almost anything. Other contributions are the rules-based port\nforwarding configuration and host-based DNS lookup to extend VPN connections\ninto the VM. What we needed, we built upstream, where every Lima user got to\nbenefit from it.</p>\n<p>Windows stayed separate. We tried more than once to fold the two together but\nnever fully managed it. The systems were too different: a VM you own end to end\non one side, a WSL distro living under someone else's rules on the other. So\nmost features had to be built twice, into two backends similar enough to look\nthe same and different enough to break in their own ways. Every new capability\nhad to be implemented twice.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"a-small-guest-with-sharp-edges\">A small guest with sharp edges<a href=\"https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/#a-small-guest-with-sharp-edges\" class=\"hash-link\" aria-label=\"Direct link to A small guest with sharp edges\" title=\"Direct link to A small guest with sharp edges\" translate=\"no\">​</a></h2>\n<p>The VM ran Alpine Linux, picked because it's tiny: a smaller download, a faster\nboot. Alpine stays small by using musl and OpenRC instead of the glibc and\nsystemd most Linux software is built against. Usually that's invisible.\nSometimes it isn't: you can't run the NVIDIA Container Toolkit on it, which\nmeans no CUDA, which means machines with a GPU can't run the AI workloads people\nincreasingly want to run. A choice that saved a few megabytes early on walled\noff a whole category of work once GPUs and AI showed up.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"more-than-kubernetes\">More than Kubernetes<a href=\"https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/#more-than-kubernetes\" class=\"hash-link\" aria-label=\"Direct link to More than Kubernetes\" title=\"Direct link to More than Kubernetes\" translate=\"no\">​</a></h2>\n<p>We set out to ship Kubernetes, and users kept asking for the rest of the\ncontainer toolbox. The first image builder, kim, ran inside the cluster; we\nreplaced it with nerdctl, the standard containerd CLI, and most people never\nnoticed kim was gone. Then we hit something we hadn't planned for: a lot of real\nprojects simply wouldn't build under nerdctl and buildkit. We added moby\n(dockerd and the Docker CLI) as a second engine, so those projects would build.\nLater we let people turn Kubernetes off entirely and run nothing but the\ncontainer engine. Rancher Desktop had quietly grown from \"Kubernetes on your\ndesktop\" into \"containers and Kubernetes on your desktop.\"</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"networking-never-got-easy\">Networking never got easy<a href=\"https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/#networking-never-got-easy\" class=\"hash-link\" aria-label=\"Direct link to Networking never got easy\" title=\"Direct link to Networking never got easy\" translate=\"no\">​</a></h2>\n<p>Networking was the part that never stopped being hard. A container's ports, the\nright DNS answers, a corporate VPN that doesn't break everything: getting all\nthree to coexist took years of work on each platform, and little of it carried\nacross. On macOS the VM reaches the network through a layer called vmnet, where\nwe moved from one implementation to another and carried both for a while.\nWindows needed something else entirely: to keep the VM's network from fighting\nthe host's VPN, we built a tunnelling network that runs in its own isolated\nnamespace.</p>\n<p>Some of that split is just the operating systems being different; there's no\nsingle answer that works on both. The question a clean design has to get right\nisn't how to avoid writing two of them. It's where that code should live, pushed\nas far down into the shared foundation as it will go instead of tangled through\nthe app.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-people-actually-wanted\">What people actually wanted<a href=\"https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/#what-people-actually-wanted\" class=\"hash-link\" aria-label=\"Direct link to What people actually wanted\" title=\"Direct link to What people actually wanted\" translate=\"no\">​</a></h2>\n<p>The request for Linux support surprised us. On Linux you can already run k3s,\ncontainerd, and Docker natively. What does a desktop app add? Not the\ncontainers. The value was being able to throw the whole thing away: a factory\nreset that wipes the VM back to nothing, worth a lot when your environment\ndrifts into a state you no longer understand. People didn't want another way to\nrun containers. They wanted an undo button for their development machine (and\nlater, snapshots).</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"a-backend-trapped-in-the-app\">A backend trapped in the app<a href=\"https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/#a-backend-trapped-in-the-app\" class=\"hash-link\" aria-label=\"Direct link to A backend trapped in the app\" title=\"Direct link to A backend trapped in the app\" translate=\"no\">​</a></h2>\n<p>Two things made Rancher Desktop easier to work with, and both ran into the same\nwall.</p>\n<p>The first was rdctl, a command-line tool for driving Rancher Desktop without\ntouching the GUI. It let us write our integration tests as plain shell scripts\ninstead of clicking through the interface, and it let users automate their\nsetup. But not everything was reachable from it. Port forwarding, for one, still\nwent through private messaging between the GUI and the backend, never exposed\nthrough the REST API, so the GUI could do things no script could.</p>\n<p>The second was snapshots: save the VM's state, restore it later. A simple\nfeature, an awkward implementation, because the backend has to stop while its\ndisk is copied, and the backend lives inside the GUI. So taking a snapshot\nturned into a small contortion. The GUI launches rdctl, which calls back into\nthe GUI to ask it to shut its own backend down, takes the snapshot, then asks it\nto start back up. Cancelling was worse: there was no clean channel for it, so\nthe GUI found the running rdctl process and killed it by name.</p>\n<p>Underneath both was the same fact: you can't run the backend without the GUI.\nYou can hide the window, you can tuck it into the background, but the app is\nalways loaded, because the engine lives inside it. There is no headless Rancher\nDesktop. For something a developer wants to script, drop on a CI runner, or hand\nto an AI agent to drive, that's real friction.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-five-years-taught-us\">What five years taught us<a href=\"https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/#what-five-years-taught-us\" class=\"hash-link\" aria-label=\"Direct link to What five years taught us\" title=\"Direct link to What five years taught us\" translate=\"no\">​</a></h2>\n<p>Step back, and a pattern runs through all of it. Every feature got a little more\ndifficult to implement than the last. Two backends to change in lockstep. An\nengine welded to its own UI. A guest OS that couldn't reach the GPU. None of it\nwas a mistake exactly (each call was reasonable when we made it), but the costs\ncompounded, until we were spending more time maintaining the existing machinery\nthan building anything new.</p>\n<p>The parts that aged well point the way. Building on Lima gave us one backend for\nmacOS and Linux and an upstream community to share the load. And the\ncommand-line tool we'd built for our own tests turned out to matter more than we\nplanned. A tool an AI model can explore and drive on its own is also exactly\nwhat you want now that so much work is handed to agents.</p>\n<p>So Rancher Desktop 2.0 starts over, on purpose. One backend across every\nplatform, Windows included. The backend lifted out of the UI into something you\ncan run on its own: headless, scripted, snapshotted by itself. A guest that can\ntalk to your GPU. Not because the first five years were wrong, but because they\ntaught us exactly what the foundation needed to be. The rest of this blog is\nabout what we're building on it.</p>",
            "url": "https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/",
            "title": "A Short History of Rancher Desktop",
            "summary": "In October 2020, Rancher Desktop was a tray icon and a single shell command.",
            "date_modified": "2026-06-17T00:00:00.000Z",
            "author": {
                "name": "Jan Dubois",
                "url": "https://github.com/jandubois"
            },
            "tags": []
        }
    ]
}