{
    "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 full 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, rebuilt from the ground up and easier to\nmaintain.</p>\n<p>At the center is a new background program called <code>rdd</code>, the Rancher Desktop\nDaemon. <code>rdd</code> 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:\n<code>rdd</code> speaks the Kubernetes API. Your <code>kubectl</code> 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 <code>rdd</code> the way any other tool would.</p>\n<p>Because the work lives in <code>rdd</code> instead of inside a window, you can run the whole\nthing without ever opening the GUI. And <code>rdd</code> 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.</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 with your local\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>So far, the interface covers containers, images, and volumes, plus the\ncluster dashboard.</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-can-be-installed-beside-rancher-desktop-1x\">It can be installed beside Rancher Desktop 1.x<a href=\"https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/#it-can-be-installed-beside-rancher-desktop-1x\" class=\"hash-link\" aria-label=\"Direct link to It can be installed beside Rancher Desktop 1.x\" title=\"Direct link to It can be installed beside Rancher Desktop 1.x\" translate=\"no\">​</a></h2>\n<p>You do not have to choose. 2.0 installs next to Rancher Desktop 1.x, and the\ntwo ignore each other completely: separate package, separate data, separate\neverything. Install them in either order, remove them in either order, nothing\ngets tangled. Don't run them both at once, though. There are likely port and\nsocket conflicts.</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 <a href=\"https://github.com/rancher-sandbox/rancher-desktop-2/releases/latest\" target=\"_blank\" rel=\"noopener noreferrer\">latest\nrelease</a>\non GitHub for Windows and macOS (Intel and Apple silicon), and from our RPM and\nDEB repositories and AppImages on Linux, the same places you would reach for\nRancher Desktop 1.x. If all you want is the daemon, download the single <code>rdd</code>\nbinary for your platform and you are two commands away from a running\ncontainer.</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 just released. To find\nout 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>\n<hr>\n<p>💬 Questions or feedback? <strong><a href=\"https://github.com/rancher-sandbox/rancher-desktop-2/discussions/473\" target=\"_blank\" rel=\"noopener noreferrer\">Discuss this post on GitHub →</a></strong></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 full 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 <code>rdd</code> binary straight from your\nterminal. Both leave Rancher Desktop 1.x alone, and both put you a couple of\ncommands from a working container engine.</p>\n<p>2.0 installs beside Rancher Desktop 1.x without touching it, with a\nseparate package, separate data, and nothing shared. Install or remove them\nin 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, including the GUI and a set of bundled command-line tools, comes\nfrom the\n<a href=\"https://github.com/rancher-sandbox/rancher-desktop-2/releases/latest\" target=\"_blank\" rel=\"noopener noreferrer\">latest release</a>\non GitHub; its notes list the download for every platform. Open the <strong>Assets</strong>\nlist there.</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 1.x does.</p>\n<p>On Linux, install from our RPM or DEB repositories, or run the AppImage,\nsimilar to the channels used for Rancher Desktop 1.x.</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<p>One thing the app will not do for you yet: turn on Kubernetes. It starts with\nKubernetes off, and this alpha has no settings screen or first-run dialog to\nchange that, so you enable it from the command line. The first run installs\n<code>rdd</code> into <code>~/.rd2/bin</code>; put that on your <code>PATH</code> (or call <code>~/.rd2/bin/rdd</code>\ndirectly) and run:</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><br></div></code></pre></div></div>\n<p>The VM is already running without Kubernetes, so this restarts it once. A\nsettings screen and first-run options are on the way; for now the command line\nis the only switch.</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 in the same GitHub release. 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 1.x, leave it that way and reach for 2.0 with <code>rdd run</code> when you want\nto try 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, turn Kubernetes on with <code>rdd set</code>:</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><br></div></code></pre></div></div>\n<p>The version defaults to the latest stable; pass <code>kubernetes.version=1.32.2</code> to\npin a specific one (1.31 or newer).</p>\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 full app or only the\nbinary. The GUI is an additional client; underneath, it runs the same daemon\nas you do.</p>\n<p><code>rdd run</code> is fine for the occasional command. If you use 2.0 a lot, add\n<code>~/.rd2/bin</code> to your <code>PATH</code> and call the tools directly. The first start\npopulates that directory; add it to your <code>PATH</code> yourself, in this shell and in\nyour 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>What you find there depends on how you installed. <code>rdd</code> provides <code>kubectl</code>\nitself, so it is there either way. <code>docker</code> and <code>helm</code> come with the full app,\nwhich links them into <code>~/.rd2/bin</code> alongside its other bundled tools and the\ncredential helpers; with the daemon-only download, supply <code>docker</code> and <code>helm</code>\nyourself.</p>\n<p>Both the Docker and Kubernetes contexts are\nnamed <code>rancher-desktop-2</code>, and 2.0 will not take over a context you already\nhave selected. If you run both side by side, move between them by switching\ncontexts:</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.</p>\n<p>That is the alpha: install it one of two ways, start it, run a container. It\nmay break on setups we have never seen, and if it does, tell us.</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><code>rdd</code> 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 <code>kubectl</code> aimed at that\nAPI. Ask it for the App object and the whole machine prints as YAML: the\ncontainer engine, the requested Kubernetes version, 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>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-commands-in-one-place\">The commands in one place<a href=\"https://docs.rancherdesktop.io/blog/installing-rancher-desktop-2/#the-commands-in-one-place\" class=\"hash-link\" aria-label=\"Direct link to The commands in one place\" title=\"Direct link to The commands in one place\" translate=\"no\">​</a></h2>\n<div class=\"command-reference\"><table><thead><tr><th>Command</th><th>What it does</th></tr></thead><tbody><tr><td><code>rdd run &lt;cmd&gt;</code></td><td>Run one command against 2.0, starting the daemon if needed and leaving your own setup untouched</td></tr><tr><td><code>rdd start</code></td><td>Bring the backend up</td></tr><tr><td><code>rdd stop</code></td><td>Take the backend down, keeping your data</td></tr><tr><td><code>rdd set &lt;key&gt;=&lt;value&gt;</code></td><td>Change a setting, such as <code>rdd set kubernetes.enabled=true</code></td></tr><tr><td><code>rdd svc delete</code></td><td>Stop the daemon and remove everything 2.0 created (also how you uninstall)</td></tr><tr><td><code>rdd ctl</code></td><td><code>kubectl</code> aimed at the <code>rdd</code> API, where Rancher Desktop keeps its own state</td></tr></tbody></table></div>\n<style>\n.command-reference td:first-child {\n  white-space: nowrap;\n}\n</style>\n<hr>\n<p>💬 Questions or feedback? <strong><a href=\"https://github.com/rancher-sandbox/rancher-desktop-2/discussions/472\" target=\"_blank\" rel=\"noopener noreferrer\">Discuss this post on GitHub →</a></strong></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, with\nmacOS and Windows support, k3s for Kubernetes, an image builder called kim, and\na way to switch Kubernetes versions. It was alpha software and looked like it.\nFive years on it's a different program, and the story of how it got here is\nmostly the story of how much work it took to keep one simple promise on three\noperating systems at 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.</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, just 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, which meant a smaller\ndownload and a faster boot. Alpine stays small by using musl and OpenRC\ninstead of the glibc and systemd most Linux software is built against. Usually\nthat's invisible. Sometimes it isn't. You can't run the NVIDIA Container\nToolkit on it, which means no CUDA, which means machines with a GPU can't run\nthe AI workloads people increasingly want to run. A choice that saved a few\nmegabytes early on walled off a whole category of work once GPUs and AI showed\nup.</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. WSL puts every distribution on one\nshared network, so to avoid port conflicts with the others, we gave our VM a\ntunnelling network in its own network namespace.</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 wipes the VM back to nothing, worth a lot when your environment drifts\ninto 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, saving the VM's state to restore 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>\n<hr>\n<p>💬 Questions or feedback? <strong><a href=\"https://github.com/rancher-sandbox/rancher-desktop-2/discussions/471\" target=\"_blank\" rel=\"noopener noreferrer\">Discuss this post on GitHub →</a></strong></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": []
        }
    ]
}