<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://docs.rancherdesktop.io/blog/</id>
    <title>Rancher Desktop Blog</title>
    <updated>2026-06-19T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://docs.rancherdesktop.io/blog/"/>
    <subtitle>News and updates from the Rancher Desktop team</subtitle>
    <icon>https://docs.rancherdesktop.io/img/favicon.ico</icon>
    <rights>Copyright © 2026 SUSE Rancher. All Rights Reserved.</rights>
    <entry>
        <title type="html"><![CDATA[Welcome to Rancher Desktop 2.0]]></title>
        <id>https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/</id>
        <link href="https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/"/>
        <updated>2026-06-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Rancher Desktop 2.0 is a full rewrite, and the first build is ready for you]]></summary>
        <content type="html"><![CDATA[<p>Rancher Desktop 2.0 is a full rewrite, and the first build is ready for you
to try. There is an alpha you can download today and run on your own machine.</p>
<p>Let's call it what it is: an early tech preview. It is rough, and not meant for
production. It exists so you can see that 2.0 is real and already running, and
so you can tell us what you would like while the architecture is still soft
enough to change.</p>
<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>
<p>We rewrote Rancher Desktop because the old design made every new feature take
more effort than the one before it. The <a href="https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/">history
post</a> tells that story; the short version is
one backend instead of two, the engine lifted out of the GUI, and a different
guest OS underneath. 2.0 is that idea, rebuilt from the ground up and easier to
maintain.</p>
<p>At the center is a new background program called <code>rdd</code>, the Rancher Desktop
Daemon. <code>rdd</code> does the real work. It runs the virtual machine, using Lima on every
platform now, Windows included. It starts your container engine and your
Kubernetes cluster. It exposes all of that through an API, and not a custom one:
<code>rdd</code> speaks the Kubernetes API. Your <code>kubectl</code> and the usual client libraries can
drive it directly, no new SDK to learn. The desktop app is just one more client,
with no special privileges, talking to <code>rdd</code> the way any other tool would.</p>
<p>Because the work lives in <code>rdd</code> instead of inside a window, you can run the whole
thing without ever opening the GUI. And <code>rdd</code> is one self-contained executable. No
installer, no separate daemon and command-line tool, just one file that is both
the backend and the way you drive it. Download it, start it from the command
line, and you have a container engine and a cluster: on a headless server, on a
CI runner, or in your own terminal. Deploying it is copying one file. Rancher
Desktop never had a way to do this. The engine lived inside the app, and the
app had to be on screen.</p>
<p>The guest VM runs openSUSE Leap now instead of Alpine. The reason is glibc. Much
of the GPU and AI tooling people ask for needs it, and Alpine's musl does not
provide it. GPU support is not built yet, but the guest OS no longer rules it
out.</p>
<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>
<p>We could have kept this private until it looked polished. We would rather not.
Putting it out now, rough edges and all, does two things for us.</p>
<p>It shows that "we will do that in 2.0" means a workstream already running, not a
promise about some distant year. And it puts the design in front of you early,
when your feedback still counts. If your setup depends on something specific,
this is the moment to say so, before we lock in decisions.</p>
<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>
<p>This is a working preview, not a finished product. What runs right now:</p>
<ul>
<li>Start, stop, and delete Rancher Desktop 2.0, from the GUI or the command line.</li>
<li>Install and run it with no GUI at all: the daemon with your local
command-line tools.</li>
<li>Build and run containers with the Docker (moby) engine.</li>
<li>Manage containers from the dashboard: start, stop, pause, resume, delete.</li>
<li>Turn on Kubernetes (version 1.31 or newer), switch versions, and browse the
cluster in the built-in dashboard.</li>
</ul>
<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>
<p>So you are not caught off guard:</p>
<ul>
<li>moby is the only container engine for now.</li>
<li>There is no settings screen. You pick your Kubernetes version from the command
line.</li>
<li>So far, the interface covers containers, images, and volumes, plus the
cluster dashboard.</li>
<li>There is no upgrade path between previews. Each new build means a clean slate:
factory reset, then install fresh. It stays that way until 2.0 reaches a real
release.</li>
</ul>
<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>
<p>You do not have to choose. 2.0 installs next to Rancher Desktop 1.x, and the
two ignore each other completely: separate package, separate data, separate
everything. Install them in either order, remove them in either order, nothing
gets tangled. Don't run them both at once, though. There are likely port and
socket conflicts.</p>
<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>
<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
release</a>
on GitHub for Windows and macOS (Intel and Apple silicon), and from our RPM and
DEB repositories and AppImages on Linux, the same places you would reach for
Rancher Desktop 1.x. If all you want is the daemon, download the single <code>rdd</code>
binary for your platform and you are two commands away from a running
container.</p>
<p>A real <a href="https://docs.rancherdesktop.io/blog/installing-rancher-desktop-2/">installation and usage
walkthrough</a> is a separate post in this
series.</p>
<p>This is alpha software. Things will break, especially in corners we have never
tested on a machine configured like yours. When they do, tell us. That feedback
is a big part of why we are shipping this early.</p>
<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>
<p>There are no docs for 2.0 yet. There is this blog. As the work moves, we will
write about how the pieces fit and what becomes newly possible: the daemon and
its API, networking, snapshots, the AI story, whatever we just released. To find
out when the next preview drops, subscribe to the feed.</p>
<p>Curious, and feeling adventurous? Give it a try. Cautious? Follow along, and
jump in when it looks ready for you.</p>
<hr>
<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>]]></content>
        <author>
            <name>Jan Dubois</name>
            <email>jan.dubois@suse.com</email>
            <uri>https://github.com/jandubois</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Installing and Running Rancher Desktop 2.0]]></title>
        <id>https://docs.rancherdesktop.io/blog/installing-rancher-desktop-2/</id>
        <link href="https://docs.rancherdesktop.io/blog/installing-rancher-desktop-2/"/>
        <updated>2026-06-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The 2.0 alpha is out, and there are two ways to run it. Install the full]]></summary>
        <content type="html"><![CDATA[<p>The 2.0 alpha is out, and there are two ways to run it. Install the full
desktop app, or skip the GUI and run the new <code>rdd</code> binary straight from your
terminal. Both leave Rancher Desktop 1.x alone, and both put you a couple of
commands from a working container engine.</p>
<p>2.0 installs beside Rancher Desktop 1.x without touching it, with a
separate package, separate data, and nothing shared. Install or remove them
in any order. (The
<a href="https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/">welcome post</a> covers what 2.0 is and how
it differs; this one is about getting it running.)</p>
<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>
<p>The full app, including the GUI and a set of bundled command-line tools, comes
from the
<a href="https://github.com/rancher-sandbox/rancher-desktop-2/releases/latest" target="_blank" rel="noopener noreferrer">latest release</a>
on GitHub; its notes list the download for every platform. Open the <strong>Assets</strong>
list there.</p>
<p>On macOS, download the <code>.dmg</code> that matches your chip:
<code>Rancher.Desktop-2.0.0-alpha.1.aarch64.dmg</code> on Apple silicon, or the <code>x86_64</code>
build on an Intel Mac. Open it, drag the app into Applications, and launch it
from there.</p>
<p>On Windows, download the installer, <code>Rancher.Desktop.Setup.2.0.0-alpha.1.msi</code>,
and run it. Install WSL2 first if you have not already; 2.0 runs its Linux VM
through WSL2, just as Rancher Desktop 1.x does.</p>
<p>On Linux, install from our RPM or DEB repositories, or run the AppImage,
similar to the channels used for Rancher Desktop 1.x.</p>
<p>The first time you launch the app, it sets up the backend and downloads the
VM image, which can take a while on a slow connection. After that the app is
talking to a running container engine, and you can manage containers, images,
and volumes from its window.</p>
<p>One thing the app will not do for you yet: turn on Kubernetes. It starts with
Kubernetes off, and this alpha has no settings screen or first-run dialog to
change that, so you enable it from the command line. The first run installs
<code>rdd</code> into <code>~/.rd2/bin</code>; put that on your <code>PATH</code> (or call <code>~/.rd2/bin/rdd</code>
directly) and run:</p>
<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>
<p>The VM is already running without Kubernetes, so this restarts it once. A
settings screen and first-run options are on the way; for now the command line
is the only switch.</p>
<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>
<p>If you want a container engine and a cluster with no window on screen, skip the
app and download the single <code>rdd</code> binary instead. It is the whole backend in
one file. No installer, nothing to unpack.</p>
<p>The binaries are in the same GitHub release. The name is <code>rdd-</code> followed by the
version, the operating system, and the CPU architecture: on an Apple silicon
Mac you want <code>rdd-2.0.0-alpha.1.darwin.aarch64</code>; on x86_64 Linux,
<code>rdd-2.0.0-alpha.1.linux.x86_64</code>. Download the one for your machine, put it on
your <code>PATH</code>, and make it executable:</p>
<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>
<p>From there, one command gets you a running container:</p>
<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>
<p><code>rdd run</code> is the no-commitment way to use 2.0. It starts the daemon if it is
not already up, then runs your command with the <code>PATH</code> and the Docker and
Kubernetes contexts pointed at 2.0 for that command only. It leaves your own
configuration untouched. So if your machine is already set up for Rancher
Desktop 1.x, leave it that way and reach for 2.0 with <code>rdd run</code> when you want
to try something. The very first start downloads the openSUSE Leap image and
brings the VM up, which can take a while on a slow connection; after that it is
quick.</p>
<p>Kubernetes works the same way. On a fresh setup, <code>rdd run kubectl get node</code>
enables Kubernetes at the default version and runs against the new cluster,
with no separate step to turn it on:</p>
<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>
<p>That shortcut fires only the first time, while nothing is configured yet. Once
Rancher Desktop exists, turn Kubernetes on with <code>rdd set</code>:</p>
<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>
<p>The version defaults to the latest stable; pass <code>kubernetes.version=1.32.2</code> to
pin a specific one (1.31 or newer).</p>
<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>
<p>The same <code>rdd</code> commands drive 2.0 whether you installed the full app or only the
binary. The GUI is an additional client; underneath, it runs the same daemon
as you do.</p>
<p><code>rdd run</code> is fine for the occasional command. If you use 2.0 a lot, add
<code>~/.rd2/bin</code> to your <code>PATH</code> and call the tools directly. The first start
populates that directory; add it to your <code>PATH</code> yourself, in this shell and in
your profile:</p>
<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>
<p>What you find there depends on how you installed. <code>rdd</code> provides <code>kubectl</code>
itself, so it is there either way. <code>docker</code> and <code>helm</code> come with the full app,
which links them into <code>~/.rd2/bin</code> alongside its other bundled tools and the
credential helpers; with the daemon-only download, supply <code>docker</code> and <code>helm</code>
yourself.</p>
<p>Both the Docker and Kubernetes contexts are
named <code>rancher-desktop-2</code>, and 2.0 will not take over a context you already
have selected. If you run both side by side, move between them by switching
contexts:</p>
<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>
<p>Managing the backend itself needs no <code>rdd run</code>. <code>rdd start</code> brings it up and
<code>rdd stop</code> takes it down, keeping your data for next time:</p>
<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>
<p>There is no upgrade path between previews yet, so each new alpha starts from a
clean slate. <code>rdd svc delete</code> stops the daemon and removes everything 2.0
created, the VM, the cluster, your settings, and the daemon's own data, keeping
only the download cache so a reinstall does not refetch the VM image. It is
also how you uninstall: after it runs, delete the <code>rdd</code> binary or remove the
app. The cache it leaves is Lima's, not ours (<code>~/Library/Caches/lima</code> on macOS,
<code>~/.cache/lima</code> on Linux, <code>~/AppData/Local/lima</code> on Windows); delete it too for
a full reclaim. A later release will handle that for you, clearing distro
images from earlier previews automatically and adding a command to empty the
cache.</p>
<p>That is the alpha: install it one of two ways, start it, run a container. It
may break on setups we have never seen, and if it does, tell us.</p>
<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>
<p><code>rdd</code> is a Kubernetes API server in its own right, and Rancher Desktop's own
state lives inside it as Kubernetes objects. <code>rdd ctl</code> is <code>kubectl</code> aimed at that
API. Ask it for the App object and the whole machine prints as YAML: the
container engine, the requested Kubernetes version, and the conditions
tracking its progress toward the state you asked for.</p>
<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>
<p>This is not the cluster you turned on earlier. It is Rancher Desktop
representing itself through the same API your tools already speak, which means
anything that drives Kubernetes can drive it, no bespoke SDK and no private
protocol. There is a lot to say about that, and it gets a post of its own.</p>
<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>
<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>
<style>
.command-reference td:first-child {
  white-space: nowrap;
}
</style>
<hr>
<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>]]></content>
        <author>
            <name>Jan Dubois</name>
            <email>jan.dubois@suse.com</email>
            <uri>https://github.com/jandubois</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[A Short History of Rancher Desktop]]></title>
        <id>https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/</id>
        <link href="https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/"/>
        <updated>2026-06-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In October 2020, Rancher Desktop was a tray icon and a single shell command.]]></summary>
        <content type="html"><![CDATA[<p>In October 2020, Rancher Desktop was a tray icon and a single shell command.
Click the icon, and it ran <code>minikube start</code> to bring up a Kubernetes cluster on
your Mac. That was the whole thing: nine files, one good idea, and a note in the
source that read, more or less, <em>this is just a quick proof of concept</em>.</p>
<p>SUSE had just bought Rancher Labs, and the goal was easy to state and hard to
build: make Kubernetes easy on a developer's laptop. We called it Rancher
Desktop because, at the time, "Rancher" was how SUSE said "Kubernetes." That
branding has gotten more complicated since, the way branding does, but the name
stuck.</p>
<p>About seven months later, in May 2021, the first public build shipped, with
macOS and Windows support, k3s for Kubernetes, an image builder called kim, and
a way to switch Kubernetes versions. It was alpha software and looked like it.
Five years on it's a different program, and the story of how it got here is
mostly the story of how much work it took to keep one simple promise on three
operating systems at once.</p>
<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>
<p>On a Mac, Kubernetes needs a Linux virtual machine. On Windows, it needs WSL2.
So from the very first release, Rancher Desktop had two backends, and we spent
the next five years discovering how different "two backends" really are.</p>
<p>The Mac side never sat still. We started with minikube, dropped it to drive
Apple's Hypervisor.framework via the docker-machine-driver-hyperkit, then
replaced it with Lima and QEMU. Each move was a rebuild of the layer that
creates the VM, installs k3s, and wires up the network. When Apple later shipped
its own Virtualization framework, VZ, moving to it was mostly a matter of
telling Lima to use it.</p>
<p>Windows went its own way, with k3s running inside a dedicated WSL distribution
we imported from an image we built ourselves. When Linux arrived as a tech
preview in late 2021, it didn't add a third backend. It joined the Mac under
Lima, which manages the VM on macOS and Linux alike, and which we got to build
on as an upstream open-source project instead of maintaining alone. That part
worked. macOS and Linux became one backend, where a fix landed once instead of
twice.</p>
<p>Building on Lima also meant building it. Lima started narrow, just a way to run
containers with nerdctl on a Mac. The provisioning scripts we added a few weeks
in, the mechanism that runs setup inside a fresh VM, are how Rancher Desktop
installs k3s and a container engine. They also opened up Lima so you could
provision for almost anything. Other contributions are the rules-based port
forwarding configuration and host-based DNS lookup to extend VPN connections
into the VM. What we needed, we built upstream, where every Lima user got to
benefit from it.</p>
<p>Windows stayed separate. We tried more than once to fold the two together but
never fully managed it. The systems were too different: a VM you own end to end
on one side, a WSL distro living under someone else's rules on the other. So
most features had to be built twice, into two backends similar enough to look
the same and different enough to break in their own ways. Every new capability
had to be implemented twice.</p>
<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>
<p>The VM ran Alpine Linux, picked because it's tiny, which meant a smaller
download and a faster boot. Alpine stays small by using musl and OpenRC
instead of the glibc and systemd most Linux software is built against. Usually
that's invisible. Sometimes it isn't. You can't run the NVIDIA Container
Toolkit on it, which means no CUDA, which means machines with a GPU can't run
the AI workloads people increasingly want to run. A choice that saved a few
megabytes early on walled off a whole category of work once GPUs and AI showed
up.</p>
<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>
<p>We set out to ship Kubernetes, and users kept asking for the rest of the
container toolbox. The first image builder, kim, ran inside the cluster; we
replaced it with nerdctl, the standard containerd CLI, and most people never
noticed kim was gone. Then we hit something we hadn't planned for. A lot of real
projects simply wouldn't build under nerdctl and buildkit. We added moby
(dockerd and the Docker CLI) as a second engine, so those projects would build.
Later we let people turn Kubernetes off entirely and run nothing but the
container engine. Rancher Desktop had quietly grown from "Kubernetes on your
desktop" into "containers and Kubernetes on your desktop."</p>
<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>
<p>Networking was the part that never stopped being hard. A container's ports, the
right DNS answers, a corporate VPN that doesn't break everything: getting all
three to coexist took years of work on each platform, and little of it carried
across. On macOS the VM reaches the network through a layer called vmnet, where
we moved from one implementation to another and carried both for a while.
Windows needed something else entirely. WSL puts every distribution on one
shared network, so to avoid port conflicts with the others, we gave our VM a
tunnelling network in its own network namespace.</p>
<p>Some of that split is just the operating systems being different; there's no
single answer that works on both. The question a clean design has to get right
isn't how to avoid writing two of them. It's where that code should live, pushed
as far down into the shared foundation as it will go instead of tangled through
the app.</p>
<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>
<p>The request for Linux support surprised us. On Linux you can already run k3s,
containerd, and Docker natively. What does a desktop app add? Not the
containers. The value was being able to throw the whole thing away. A factory
reset wipes the VM back to nothing, worth a lot when your environment drifts
into a state you no longer understand. People didn't want another way to
run containers. They wanted an undo button for their development machine (and
later, snapshots).</p>
<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>
<p>Two things made Rancher Desktop easier to work with, and both ran into the same
wall.</p>
<p>The first was rdctl, a command-line tool for driving Rancher Desktop without
touching the GUI. It let us write our integration tests as plain shell scripts
instead of clicking through the interface, and it let users automate their
setup. But not everything was reachable from it. Port forwarding, for one, still
went through private messaging between the GUI and the backend, never exposed
through the REST API, so the GUI could do things no script could.</p>
<p>The second was snapshots, saving the VM's state to restore later. A simple
feature, an awkward implementation, because the backend has to stop while its
disk is copied, and the backend lives inside the GUI. So taking a snapshot
turned into a small contortion. The GUI launches rdctl, which calls back into
the GUI to ask it to shut its own backend down, takes the snapshot, then asks it
to start back up. Cancelling was worse. There was no clean channel for it, so
the GUI found the running rdctl process and killed it by name.</p>
<p>Underneath both was the same fact: you can't run the backend without the GUI.
You can hide the window, you can tuck it into the background, but the app is
always loaded, because the engine lives inside it. There is no headless Rancher
Desktop. For something a developer wants to script, drop on a CI runner, or hand
to an AI agent to drive, that's real friction.</p>
<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>
<p>Step back, and a pattern runs through all of it. Every feature got a little more
difficult to implement than the last. Two backends to change in lockstep. An
engine welded to its own UI. A guest OS that couldn't reach the GPU. None of it
was a mistake exactly (each call was reasonable when we made it), but the costs
compounded, until we were spending more time maintaining the existing machinery
than building anything new.</p>
<p>The parts that aged well point the way. Building on Lima gave us one backend for
macOS and Linux and an upstream community to share the load. And the
command-line tool we'd built for our own tests turned out to matter more than we
planned. A tool an AI model can explore and drive on its own is also exactly
what you want now that so much work is handed to agents.</p>
<p>So Rancher Desktop 2.0 starts over, on purpose. One backend across every
platform, Windows included. The backend lifted out of the UI into something you
can run on its own: headless, scripted, snapshotted by itself. A guest that can
talk to your GPU. Not because the first five years were wrong, but because they
taught us exactly what the foundation needed to be. The rest of this blog is
about what we're building on it.</p>
<hr>
<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>]]></content>
        <author>
            <name>Jan Dubois</name>
            <email>jan.dubois@suse.com</email>
            <uri>https://github.com/jandubois</uri>
        </author>
    </entry>
</feed>